我試着用實現子類來替換按鈕的背景。當我改變他的背景時,我失去了按鈕的功能
當我改變背景時,我有一個方形的形狀,不可能點擊它。 有人可以分享一個很好的教程或代碼示例?
反正 這是我的代碼:
LRESULT CALLBACK DrawPushButton(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
HDC hdcMem;
HBITMAP hbmMem;
HANDLE hnd;
PAINTSTRUCT ps;
HDC hdc;
int win_width=100;
int win_height=50;
switch(uMsg)
{
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
hdcMem = CreateCompatibleDC(hdc);
hbmMem = CreateCompatibleBitmap(hdc, win_width, win_height);
hnd = SelectObject(hdcMem, hbmMem);
BitBlt(hdc, 0, 0, win_width, win_height, hdcMem, 0, 0, SRCCOPY);
EndPaint(hwnd, &ps);
return 0;
break;
}
return CallWindowProc (OldWndProc, hwnd, uMsg, wParam, lParam);
}
編輯: 我加入了BS_OWNERDRAW windows風格的按鈕:
HWND hWndButton=CreateWindowEx(NULL,L"BUTTON",L"OK",WS_TABSTOP|WS_VISIBLE|WS_CHILD|BS_DEFPUSHBUTTON|BS_OWNERDRAW,50,220,100,24,hWnd,(HMENU)IDC_MAIN_BUTTON,GetModuleHandle(NULL),NULL);
,我改變了回調,但WM_DRAWITEM沒有電話:
LRESULT CALLBACK DrawPushButton(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
case WM_DRAWITEM:
HDC hdc = GetDC(hwnd);
TextOut(hdc,0,0,L"itay",4);
break;
}
return 0;
}
要自定義繪製一個按鈕,你需要給它的'BS_OWNERDRAW'窗口樣式,然後處理'WM_DRAWITEM'消息。 –
你不認爲你應該刪除你正在創建的DC和位圖*每次按鈕繪製*時? –
@RemyLebeau我添加了BS_OWNERDRAW,但是當我調試程序時,WM_DRAWITEM沒有調用。看到我上面的評論。 –