日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

自已动手写控件 --- 我第一次学习写自定义控件

發布時間:2025/4/14 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 自已动手写控件 --- 我第一次学习写自定义控件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

  一直都是用系統的控件, 還從不知道一個控件該怎么去寫~~~

  網上的教程太少了, 完全不知道怎么開頭~~

  也一直用 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

總結

以上是生活随笔為你收集整理的自已动手写控件 --- 我第一次学习写自定义控件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。