須要在MFC實現自定義控件功能,網上搜集找的以下方法實現:函數
如下是步驟說明。this
1、自定義一個空白控件spa
一、先建立一個MFC工程.net
NEW Project-->MFC-->MFC Application-->name: 「CustomCtr」-->Application Type選擇「Dialog based」。code
二、在窗口中添加一個自定義控件blog
Toolbox-->「Custom Control」-->屬性-->class隨便填寫一個控件類名「CMyWin」, 這個名字用於之後註冊控件用的,註冊函數爲RegisterWindowClass()。隊列
三、建立一個類開發
在窗口中,右擊custom control 控件-->ClassWizard-->ClassWizard-->Add Class-->類名CMyTest(以C開頭)-->Base class:CWnd。消息隊列
四、註冊自定義控件MyWinio
在MyTest類.h文件中聲明註冊函數BOOL RegisterWindowClass(HINSTANCE hInstance = NULL)。
BOOL CMyTest::RegisterWindowClass(HINSTANCE hInstance) { LPCWSTR className = L"CMyWin";//"CMyWin"控件類的名字
WNDCLASS windowclass; if(hInstance) hInstance = AfxGetInstanceHandle(); if (!(::GetClassInfo(hInstance, className, &windowclass))) { windowclass.style = CS_DBLCLKS; windowclass.lpfnWndProc = ::DefWindowProc; windowclass.cbClsExtra = windowclass.cbWndExtra = 0; windowclass.hInstance = hInstance; windowclass.hIcon = NULL; windowclass.hCursor = AfxGetApp()->LoadStandardCursor(IDC_ARROW); windowclass.hbrBackground=::GetSysColorBrush(COLOR_WINDOW);
windowclass.lpszMenuName = NULL; windowclass.lpszClassName = className; if (!AfxRegisterClass(&windowclass)) { AfxThrowResourceException(); return FALSE; } } return TRUE; }
五、在MyTest類的構造器中調用 RegisterWindowClass()。
CMyTest::CMyTest() { RegisterWindowClass(); }
六、控件與對話框數據交換
在CustomCtrDlg.h中定義一個變量:
CMyTest m_draw;
在對話框類的CustomCtrDlg.cpp的DoDataExchange函數中添加DDX_Control(pDX,IDC_CUSTOM1,m_draw)。
void CCustomCtrDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX,IDC_CUSTOM1,m_draw);
}
以上是自定義一個空白控件。
2、在控件上繪圖
一、在CMyTest類中添加一個繪圖消息
在VS2010最左側Class View中右擊CMyTest類-->ClassWizard-->Messages-->WM_PAINT-->雙擊,開發環境自動添加OnPaint()函數及消息隊列。
二、編寫OnPaint()函數
例如:畫一條直線
void CMykk::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
// Do not call CWnd::OnPaint() for painting messages
CRect rect; this->GetClientRect(rect); dc.MoveTo(0,0); dc.LineTo(rect.right,rect.bottom); }
來自:http://6208051.blog.51cto.com/6198051/1058634
參考:http://blog.csdn.net/worldy/article/details/16337139