2013-11-24 39 views
0

我試着用實現子類來替換按鈕的背景。當我改變他的背景時,我失去了按鈕的功能

當我改變背景時,我有一個方形的形狀,不可能點擊它。 有人可以分享一個很好的教程或代碼示例?

反正 這是我的代碼:

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; 
} 
+1

要自定義繪製一個按鈕,你需要給它的'BS_OWNERDRAW'窗口樣式,然後處理'WM_DRAWITEM'消息。 –

+0

你不認爲你應該刪除你正在創建的DC和位圖*每次按鈕繪製*時? –

+0

@RemyLebeau我添加了BS_OWNERDRAW,但是當我調試程序時,WM_DRAWITEM沒有調用。看到我上面的評論。 –

回答

0

這不是一個'好'的代碼,雖然它是功能性的 - 您應該像上面提到的那樣使用BS_OWNERDRAW樣式,並在包含按鈕的對話框/窗口的wndproc中處理圖形。我已經選擇粘貼一個我已經用過的方式來處理它的舊例子。你必須自己做全部。但是,您確實有機會對WM_TIMER消息做出響應,即獲得按鈕使其跳動或脈動。 (不確定是否有機會這樣做,如果你只是從對話框/窗口的WindowProc中進行繪圖)

爲了簡單起見,我還選擇使用被取代的子分類方法。由於公共控件版本6,您應該使用SetWindowSubclass(http://msdn.microsoft.com/en-us/library/windows/desktop/bb762102(v=vs.85).aspx

的main.cpp

#include <windows.h> 
#include <commctrl.h> 
#include <stdio.h> 
#include "resource.h" 

HINSTANCE hInst; 

LRESULT CALLBACK btnProc(HWND btnWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 
{ 
    long oldWndProc; 
    int i; 
    oldWndProc = GetWindowLong(btnWnd, GWL_USERDATA); 
    switch (uMsg) 
    { 
     case WM_PAINT: 
      { 
       HDC hdc; 
       PAINTSTRUCT ps; 
       RECT mRect; 
       HBRUSH mBrush; 

       hdc = BeginPaint(btnWnd, &ps); 
       mBrush = CreateSolidBrush(RGB(100, 147, 111)); 
       GetClientRect(btnWnd, &mRect); 
       FillRect(hdc, &mRect, mBrush); 
       DeleteObject(mBrush); 

       EndPaint(btnWnd, &ps); 
      } 
      return 0; 
    } 
    return CallWindowProc((WNDPROC)oldWndProc, btnWnd, uMsg, wParam, lParam); 
} 


void onCommand(HWND hwndDlg, WPARAM wParam, LPARAM lParam) 
{ 
    switch (LOWORD(wParam)) 
    { 
    case IDC_BUTTON1: 
     MessageBeep(MB_ICONEXCLAMATION); 
     break; 
    } 
} 

LRESULT CALLBACK DlgMain(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) 
{ 
    switch(uMsg) 
    { 
     case WM_INITDIALOG: 
     { 
      HWND btnWnd; 
      long oldBtnProc; 
      btnWnd = GetDlgItem(hwndDlg, IDC_BUTTON1); 
      oldBtnProc = GetWindowLong(btnWnd, GWL_WNDPROC); 
      SetWindowLong(btnWnd, GWL_USERDATA, oldBtnProc); 
      SetWindowLong(btnWnd, GWL_WNDPROC, (long)btnProc); 
     } 
     return TRUE; 

     case WM_CLOSE: 
     { 
      EndDialog(hwndDlg, 0); 
     } 
     return TRUE; 

     case WM_COMMAND: 
      onCommand(hwndDlg, wParam, lParam); 
      return TRUE; 
    } 
    return FALSE; 
} 


int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) 
{ 
    hInst=hInstance; 
    InitCommonControls(); 
    return DialogBox(hInst, MAKEINTRESOURCE(DLG_MAIN), NULL, (DLGPROC)DlgMain); 
} 

RESOURCE.H

#ifndef IDC_STATIC 
#define IDC_STATIC (-1) 
#endif 

#define DLG_MAIN        100 
#define IDC_BUTTON1        1000 

RESOURCE.RC

// Generated by ResEdit 1.5.11 
// Copyright (C) 2006-2012 
// http://www.resedit.net 

#include <windows.h> 
#include <commctrl.h> 
#include <richedit.h> 
#include "resource.h" 

// 
// Dialog resources 
// 
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL 
DLG_MAIN DIALOG 0, 0, 186, 95 
STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU 
CAPTION "Dialog" 
FONT 8, "Ms Shell Dlg" 
{ 
    PUSHBUTTON  "Button1", IDC_BUTTON1, 7, 7, 50, 14 
} 

// 
// Manifest resources 
// 
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL 
1     RT_MANIFEST ".\\manifest.xml" 

的manifest.xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
    <dependency> 
    <dependentAssembly> 
     <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*"/> 
    </dependentAssembly> 
    </dependency> 
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> 
    <security> 
     <requestedPrivileges> 
     <requestedExecutionLevel 
      level="asInvoker" 
      uiAccess="false"/> 
     </requestedPrivileges> 
    </security> 
    </trustInfo> 
</assembly> 
相關問題