建立SWING風格的按鈕控制元件 (轉)
本文介紹如何建立風格的按鈕
基本思想:(1)按鈕選中時,繪製已按鈕中點為中心的藍色矩形;
(2)按鈕預定義為自畫風格;
(3)以按鈕本身矩形錯位畫線,採用不同的畫刷,計劃筆,產生 SWING效果。
定義:
CSwingButton::DrawButton(LPDRAWITEMSTRUCT lpDrawItemStruct)//畫按鈕
void CSwingButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) //過載
void CSwingButton::PreSubclassWindow() //通知風格自畫
CString CSwingButton::GetButtonText()//獲得按鈕文字---可以去除
CSwingButton::CSwingButton()//設定按鈕文字---可以去除
void CSwingButton::SetButtonText(CString pString)
源如下:
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// SwingButton.h : header file
//
/////////////////////////////////////////////////////////////////////////////
// CSwingButton window
class CSwingButton : public CButton
{
// Construction
public:
CSwingButton();
// Attributes
public:
protected:
CString m_strCaption; //義文字
CBrush nActiveBrush,nInactiveBrush; 義畫刷
CPen nDarkBorder,nWhiteBorder,nBorder; 義畫筆
// Operations
public:
// Overrs
// ClassWizard generated virtual function overrides
AFX_VIRTUAL(CSwingButton)
public:
virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
protected:
virtual void PreSubclassWindow();
AFX_VIRTUAL
// Implementation
public:
void SetButtonText(CString pString);
void DrawButton(LPDRAWITEMSTRUCT lpDrawItemStruct);
CString GetButtonText();
virtual ~CSwingButton();
// Generated message map functions
protected:
AFX_MSG(CSwingButton)
// NOTE - the ClassWizard will add and remove member functions here.
AFX_MSG
DECLARE_MESSAGE_MAP()
public:
};
/////////////////////////////////////////////////////////////////////////////
AFX_INSERT_LOCATION}}
// Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_SWINGBUTTON_H__4C72E29F_5844_4E65_9E87_CB96602E4733__INCLUDED_)
#include "stdafx.h"
#include "TestSwing.h"
#include "SwingButton.h"
#ifdef _DE
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CSwingButton
CSwingButton::CSwingButton()
{//初始化
nActiveBrush.CreateSolirush(RGB(110,110,110));
nInactiveBrush.CreateSolidBrush(RGB(204,204,204));
nDarkBorder.CreatePen(PS_SOLID,1,RGB(128,128,128));
nWhiteBorder.CreatePen(PS_SOLID,1,RGB(255,255,255));
nSelectBorder.CreatePen(PS_SOLID,1,RGB(153,153,204));
}
CSwingButton::~CSwingButton()
{
}
BEGIN_MESSAGE_MAP(CSwingButton, CButton)
AFX_MSG_MAP(CSwingButton)
// NOTE - the ClassWizard will add and remove map macrhere.
AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CSwingButton message handlers
void CSwingButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
// TODO: Add your code to draw the specified item
//畫按鈕函式
DrawButton(lpDrawItemStruct);
}
void CSwingButton::PreSubclassWindow()
{
// TODO: Add your specialized code here and/or call the base class
CButton::PreSubclassWindow();
ModifyStyle(0,BS_OWNERDRAW);//通知自畫風格
}
CString CSwingButton::GetButtonText()
{
return m_strCaption;//獲得按鈕文字
}
void CSwingButton::DrawButton(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
CRect rectItem(lpDrawItemStruct->rcItem);
//獲得按鈕位置
CPoint TopLeft(rectItem.left, rectItem.top);
CPoint BottomRight(rectItem.right - 1, rectItem.bottom - 1);
CPoint TopRight(rectItem.right - 1, rectItem.top);
CPoint BottomLeft(rectItem.left, rectItem.bottom - 1);
//選中情況下的繪製
if (lpDrawItemStruct->itemState & ODS_SELECTED)
{
pDC->Select(&nActiveBrush);
pDC->SelectStockObject(NULL_PEN);
pDC->Rectangle(rectItem);
goto WRITE_TEXT;
}
//繪製
pDC->SelectObject(&nInactiveBrush);
pDC->SelectStockObject(NULL_PEN);
pDC->Rectangle(rectItem);
pDC->SelectObject(&nDarkBorder);
pDC->MoveTo(TopLeft);
pDC->Lo(TopRight);
pDC->MoveTo(TopLeft);
pDC->LineTo(BottomLeft);
pDC->MoveTo(BottomLeft.x, BottomLeft.y - 1);
pDC->LineTo(BottomRight.x, BottomRight.y - 1);
pDC->MoveTo(BottomRight.x - 1, BottomRight.y);
pDC->LineTo(TopRight.x - 1, TopRight.y);
pDC->SelectObject(&nWhiteBorder);
pDC->MoveTo(BottomLeft);
pDC->LineTo(BottomRight);
pDC->MoveTo(BottomRight);
pDC->LineTo(TopRight);
pDC->MoveTo(TopLeft.x + 1, TopLeft.y + 1);
pDC->LineTo(TopRight.x - 1, TopRight.y + 1);
pDC->MoveTo(TopLeft.x + 1, TopLeft.y + 1);
pDC->LineTo(BottomLeft.x + 1, BottomLeft.y - 1);
WRITE_TEXT:
pDC->SetBkMode(TRANSPARENT);
pDC->SelectStockObject(DEFAULT_GUI_FONT);
CSize pExtent = pDC->GetTextExtent(m_strCaption);
//以下為繪製按鈕文字
CPoint centerPoint = rectItem.CenterPoint();
CPoint drawText;
drawText.x = centerPoint.x - (pExtent.cx / 2);
drawText.y = centerPoint.y - (pExtent.cy / 2);
pDC->TextOut(drawText.x, drawText.y, m_strCaption);
if (lpDrawItemStruct->itemState & ODS_FOCUS)
{
pDC->SelectObject(&nSelectBorder);
pDC->SelectStockObject(NULL_BRUSH);
pDC->Rectangle(drawText.x - 1, drawText.y - 1,
centerPoint.x + (pExtent.cx / 2) + 3,
centerPoint.y + (pExtent.cy / 2) + 3);
}
}
void CSwingButton::SetButtonText(CString pString)
{
//設定按鈕文字
m_strCaption=pString;
}
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-987926/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- C# winForm 建立水晶風格的按鈕C#ORM
- 仿switch風格滑動按鈕
- 純CSS Material Design風格按鈕CSSMaterial Design
- 從“按鈕”看設計風格的演變
- 製作圓形Swing按鈕(中文版) (轉)
- 用CSS Houdini實現一個Material風格的按鈕CSS
- 按鈕上面的按鈕 (轉)
- C#自定義控制元件—旋轉按鈕C#控制元件
- 建立WINDOWS XP樣式的ActiveX按鈕 (轉)Windows
- 【Swing】UI外觀風格設定UI
- tkinter中button按鈕控制元件(三)控制元件
- Qt控制元件精講一:按鈕QT控制元件
- 使用WPF建立炫亮按鈕
- Qt自定義開關按鈕控制元件QT控制元件
- Android UI控制元件系列:Button(按鈕)AndroidUI控制元件
- 安卓開發學習-按鈕控制元件安卓控制元件
- SAP CRM note建立按鈕被禁用的原因分析
- 程式碼的風格 (轉)
- 圖解修改VC++6.0 MFC控制元件風格為XP風格圖解C++控制元件
- 建立漂亮的 CSS 按鈕的 10 個程式碼片段CSS
- MFC 捕獲按鈕 按下和抬起 (轉)
- 工具欄上按鈕的繪製 (轉)
- 實現浮動按鈕 (轉)
- 建立 SysV 風格的 linux daemon 程式Linux
- Android UI控制元件系列:ImageButton(帶圖示的按鈕)AndroidUI控制元件
- 動態建立具有刪除行按鈕的table表格
- SVG 建立 Material Design 波紋效果按鈕SVGMaterial Design
- SVG建立Material Design波紋效果按鈕SVGMaterial Design
- 按鈕
- 仿餓了麼加入購物車旋轉控制元件 – 自帶閃轉騰挪動畫 的按鈕控制元件動畫
- 仿餓了麼加入購物車旋轉控制元件 - 自帶閃轉騰挪動畫 的按鈕控制元件動畫
- 按鈕連結乾坤大挪移 (轉)
- Android 點選按鈕跳轉Android
- VBA 控制元件學習筆記(按鈕點選事件)控制元件筆記事件
- Android 自定義控制元件 按鈕滾動選擇Android控制元件
- Fiori Elements List Report table 裡的普通按鈕,Global 按鈕 和 Determining 按鈕
- Java GUI之建立一個只有兩個按鈕的框架JavaGUI框架
- 如何在鬆弛中建立互動式按鈕