生活随笔
收集整理的這篇文章主要介紹了
自已动手写控件 --- 我第一次学习写自定义控件
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
一直都是用系統(tǒng)的控件, 還從不知道一個(gè)控件該怎么去寫~~~
網(wǎng)上的教程太少了, 完全不知道怎么開頭~~
也一直用 RegisterClassEx + CreateWindowEx 創(chuàng)建一個(gè)主程序窗口, 卻從不知道控件也是通過這種方式來寫的.
看來我們無時(shí)無刻不在自己寫控件啊~~~
第1次寫控件, 介紹一下我寫的這個(gè)簡單功能控件的創(chuàng)建過程:
1. 為控件寫一個(gè)窗口類,指定默認(rèn)窗口函數(shù),并注冊窗口類
2. 調(diào)用 CreateWindowEx 創(chuàng)建該子控件即可, 和創(chuàng)建主窗口完全一樣
重點(diǎn):
指定的窗口過程必須要為自己的子控件做好相應(yīng)的消息處理:比如:鼠標(biāo)消息, WM_PAINT等~~~
汗, 第1次寫這種東西, 沒有什么經(jīng)驗(yàn), 也沒有什么好說的, 就給和我一樣不會(huì)寫控件的一個(gè)示范吧, 貼代碼, 不多說~~~
實(shí)現(xiàn)的功能是:當(dāng)點(diǎn)擊控件時(shí), 控件的背景顏色會(huì)發(fā)生變化~~~
沒什么特別的意義, 只是想告訴不會(huì)寫控件的大家, 該怎樣開始寫一個(gè)控件~~~
// TestControl.c
#include <windows.h>
LRESULT CALLBACK ControlWindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam);void RegisterControlClass(HINSTANCE hInstance)
{WNDCLASSEXW wce={
0};wce.cbSize =
sizeof(wce);wce.hbrBackground =
(HBRUSH)GetStockObject(WHITE_BRUSH);wce.hInstance =
hInstance;wce.lpfnWndProc =
ControlWindowProc;wce.lpszClassName = L
"ControlClass";wce.style = CS_HREDRAW|
CS_VREDRAW;RegisterClassExW(&
wce);}LRESULT CALLBACK ControlWindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{static HBRUSH hbrBlack,hbrRed;switch(uMsg){case WM_CREATE:{hbrBlack = CreateSolidBrush(RGB(
0,
0,
0));hbrRed = CreateSolidBrush(RGB(
255,
0,
0));return 0;}case WM_PAINT:{PAINTSTRUCT ps;HDC hdc;hdc = BeginPaint(hWnd,&
ps);SelectObject(hdc,hbrBlack);Rectangle(hdc,0,
0,
100,
50);EndPaint(hWnd,&
ps);return 0;}case WM_LBUTTONDOWN:{HDC hdc;hdc =
GetDC(hWnd);SelectObject(hdc,hbrRed);Rectangle(hdc,0,
0,
100,
50);SetTextColor(hdc,RGB(255,
0,
0));TextOutW(hdc,10,
10,L
"測試控件",
4);ReleaseDC(hWnd,hdc);SetCapture(hWnd);return 0;}case WM_LBUTTONUP:{HDC hdc;hdc =
GetDC(hWnd);SelectObject(hdc,hbrBlack);Rectangle(hdc,0,
0,
100,
50);SetTextColor(hdc,RGB(0,
0,
0));TextOutW(hdc,10,
10,L
"測試控件",
4);ReleaseDC(hWnd,hdc);ReleaseCapture();return 0;}case WM_DESTROY:DeleteObject(hbrBlack);DeleteObject(hbrRed);return 0;}return DefWindowProcW(hWnd,uMsg,wParam,lParam);
}LRESULT CALLBACK MainWindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{switch(uMsg){case WM_CREATE:{HINSTANCE hInstance =
GetModuleHandleW(NULL);CreateWindowExW(0,L
"Button",L
"按鍵",WS_CHILD|WS_VISIBLE,
0,
0,
100,
50,hWnd,(HMENU)
101,hInstance,NULL);CreateWindowExW(0,L
"ControlClass",L
"哈哈",WS_CHILD|WS_VISIBLE,
200,
200,
100,
50,hWnd,(HMENU)
100,hInstance,NULL);CreateWindowExW(0,L
"ControlClass",L
"呵呵",WS_CHILD|WS_VISIBLE,
400,
400,
100,
50,hWnd,(HMENU)
102,hInstance,NULL);return 0;}case WM_DESTROY:PostQuitMessage(0);return 0;default:break;}return DefWindowProcW(hWnd,uMsg,wParam,lParam);
}int WINAPI wWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPWSTR lpCmdLine,
int nShowCmd)
{HWND hWnd;WNDCLASSEXW wce = {
0};MSG msg;RegisterControlClass(hInstance);wce.cbSize =
sizeof(wce);wce.hbrBackground =
(HBRUSH)GetStockObject(WHITE_BRUSH);wce.hCursor =
LoadCursor(NULL,IDC_ARROW);wce.hIcon =
LoadIcon(NULL,IDI_APPLICATION);wce.hInstance =
hInstance;wce.lpfnWndProc =
MainWindowProc;wce.lpszClassName = L
"MyWindowClass";wce.style = CS_HREDRAW|
CS_VREDRAW;RegisterClassExW(&
wce);hWnd = CreateWindowExW(
0,L
"MyWindowClass",L
"測試",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);UpdateWindow(hWnd);ShowWindow(hWnd,nShowCmd);while(GetMessageW(&msg,NULL,
0,
0)){TranslateMessage(&
msg);DispatchMessageW(&
msg);} return 0;
} ?
有圖有真相, 字體有點(diǎn)丑, 不過將就, 系統(tǒng)默認(rèn)字體都這樣:
?
女孩不哭 @ 2013-05-16 02:47:56 @ http://www.cnblogs.com/nbsofer
?
轉(zhuǎn)載于:https://www.cnblogs.com/memset/archive/2013/05/16/3081082.html
總結(jié)
以上是生活随笔為你收集整理的自已动手写控件 --- 我第一次学习写自定义控件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。