2014-03-30 27 views
0

準確地說,我不想使用標準的矩形按鈕。有沒有辦法創建自己的按鈕並將它們合併到Visual C++應用程序中?例如,一個形狀爲水果,動物,隨機物體的按鈕......?這怎麼能實現?如何製作自定義Visual C++按鈕?

+0

按鈕是一個UI小工具的

這裏例如,它沒有任何與C++語言。有*許多* UI框架,你的問題不能給出你正在使用的任何線索。問一個SO問題的最好方法是寫幾段描述你迄今爲止嘗試過的工作。 –

回答

1

自定義按鈕有兩種常見方法。首先是在標準按鈕上使用所有者繪製可選樣式。使用這種樣式設置,當按鈕需要着色時,您會收到一條消息(WM_DRAWITEM),並以任何您喜歡的方式自己繪製它。第二種方法是在現有窗口上繪製圖像並分析鼠標消息以確定圖像上的點擊時間。常用的工具欄使用這種方法:它沒有真正的按鈕控件,只是看起來像按鈕的圖片。採用第二種方法,您不僅限於點擊矩形區域。

0

定義您自己的按鈕回調函數 SetWindowLong(hMyButtonWnd,GWL_WNDPROC,(LONG)& MyButtonProc);按鈕回調 LRESULT CALLBACK MyButtonProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam) { if (message == WM_LBUTTONDOWN) { bBtnClicked = true; bBtnDown = true; SetCapture(hWnd); nMouseX = LOWORD(lParam); nMouseY = HIWORD(lParam); InvalidateRect(hWnd,NULL,false); UpdateWindow(hWnd); } else if (message == WM_LBUTTONUP) { bBtnClicked = false; bBtnDown = false; InvalidateRect(hWnd,NULL,false); UpdateWindow(hWnd); RECT rec; GetClientRect(hWnd,&rec); if (nMouseX > rec.left && nMouseY > rec.top && nMouseX < rec.right && nMouseY < rec.bottom) { MessageBox(NULL,L"Button clicked",L"Test",MB_OK); } ReleaseCapture(); } else if (message == WM_MOUSEMOVE) { nMouseX = LOWORD(lParam); nMouseY = HIWORD(lParam); RECT rec; GetClientRect(hWnd,&rec); if (nMouseX <= rec.left || nMouseY <= rec.top || nMouseX >= rec.right || nMouseY >= rec.bottom) bBtnDown = false; InvalidateRect(hWnd,NULL,false); UpdateWindow(hWnd); } if (message == WM_PAINT) { PAINTSTRUCT ps; HDC dc = BeginPaint(hWnd,&ps); HDC c_dc = CreateCompatibleDC(NULL); if (bBtnDown) SelectObject(c_dc,hBtnDown); else SelectObject(c_dc,hBtnUp); RECT rec; GetClientRect(hWnd,&rec); BitBlt(dc,0,0,rec.right,rec.bottom,c_dc,0,0,SRCCOPY); DeleteDC(c_dc); EndPaint(hWnd,&ps); return 0; } else return CallWindowProc(DefProc,hWnd,message,wParam,lParam); return 1; }