生活随笔
收集整理的這篇文章主要介紹了
自已动手写控件 --- 我第一次学习写自定义控件
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一直都是用系統的控件, 還從不知道一個控件該怎么去寫~~~
網上的教程太少了, 完全不知道怎么開頭~~
也一直用 RegisterClassEx + CreateWindowEx 創建一個主程序窗口, 卻從不知道控件也是通過這種方式來寫的.
看來我們無時無刻不在自己寫控件啊~~~
第1次寫控件, 介紹一下我寫的這個簡單功能控件的創建過程:
1. 為控件寫一個窗口類,指定默認窗口函數,并注冊窗口類
2. 調用 CreateWindowEx 創建該子控件即可, 和創建主窗口完全一樣
重點:
指定的窗口過程必須要為自己的子控件做好相應的消息處理:比如:鼠標消息, WM_PAINT等~~~
汗, 第1次寫這種東西, 沒有什么經驗, 也沒有什么好說的, 就給和我一樣不會寫控件的一個示范吧, 貼代碼, 不多說~~~
實現的功能是:當點擊控件時, 控件的背景顏色會發生變化~~~
沒什么特別的意義, 只是想告訴不會寫控件的大家, 該怎樣開始寫一個控件~~~
// 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;
} ?
有圖有真相, 字體有點丑, 不過將就, 系統默認字體都這樣:
?
女孩不哭 @ 2013-05-16 02:47:56 @ http://www.cnblogs.com/nbsofer
?
轉載于:https://www.cnblogs.com/memset/archive/2013/05/16/3081082.html
總結
以上是生活随笔為你收集整理的自已动手写控件 --- 我第一次学习写自定义控件的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。