2011-03-03 49 views
1

我創建了我自己的自定義GUI按鈕類,以用於Windows Mobile應用程序。意識到我需要一些更好的控制,並消除雙擊煩惱,我想我需要做的就是像我一直有的子類。類別中的子類別按鈕控制

但是,雖然我已經將所有東西都封裝成了一個類,但似乎使事情複雜化了。

下面是我想要做的

// Graphic button class for Wizard(ing) dialogs. 
class CButtonUXnav 
{ 
private: 

    // Local subclasses of controls. 
    WNDPROC wpOldButton;  // Handle to the original callback. 
    LRESULT CALLBACK Button_WndProc (HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam); 

片段。 。 。

int CButtonUXnav::CreateButton (LPCTSTR lpButtonText, int x, int y, int iWidth, int iHeight, bool gradeL2R) 
    { 
    xLoc = x; 
    yLoc = y; 
    nWidth = iWidth; 
    nHeight = iHeight; 
    wcscpy (wszButtonText, lpButtonText); 

    PaintButtonInternals (x, y, iWidth, iHeight, gradeL2R); 

    hButton = CreateWindow (L"BUTTON", wszButtonText, 
          WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON | BS_OWNERDRAW, 
          xLoc, yLoc, nWidth, nHeight, 
          hWndParent, IDbutn, hInstance, NULL); 

    // Subclass 
    // (to remove double-click annoyance.) 
    wpOldButton = (WNDPROC)GetWindowLong (hButton, GWL_WNDPROC); 

    if (wpOldButton == 0) 
     return 1; 

    // Insert our own callback. 
    SetWindowLong (hButton, GWL_WNDPROC, (LONG)Button_WndProc); 

    return 0; 
    } 

但我似乎無法逃脫解決此錯誤:

error C2440: 'type cast' : cannot convert from 'LRESULT (__cdecl CButtonUXnav::* )(HWND,UINT,WPARAM,LPARAM)' to 'LONG'

您的想法?

回答

3

您試圖將成員函數傳遞給外部實體來調用它,這是不可能的。

試着想象有人打電話CallWindowProc(MyEditHandle, ...)。 CButtonUXnav的哪個對象(實例)應該在Button_WndProc上運行?它的指針是什麼this

如果你真的想把回調函數作爲你的類的成員,你必須聲明它爲static,使它可以從外部訪問,但只能訪問CButtonUXnav的靜態成員變量。
要解決這個問題,請使用SetWindowLong(hWnd, GWL_USERDATA, &CButtonUXnav)將指針綁定到CButtonNXnav,並使用編輯的窗口句柄來解決您的問題。

編輯:執行子類時
static Button_WndProc(HWND,UINT,WPARAM,LPARAM);

  • 商店的一個指針CButtonUXnav對象:

    實際上,你需要三樣東西:

    • 聲明爲靜態的回調函數:
      SetWindowLong(hWnd, GWL_USERDATA, (LONG)this);
    • 從靜態回調中檢索該指針以對其執行操作;
      CButtonUXnav *pMyObj = (CButtonUXnav*)GetWindowLong(hWnd, GWL_USERDATA);
      (注:這可能是更直着:)
      CButtonUXnav& pMyObj = *(CButtonUXnav*)GetWindowLong(hWnd, GWL_USERDATA);

    希望這樣做吧:)

  • +0

    「錯誤C2275: 'CButtonUXnav':非法使用這種類型的一個表達「。我明白了,我的挑戰是將其轉化爲代碼。 – 2011-03-03 13:37:24

    +0

    對不起,我並不是說你實際上寫'&CButtonUXnav'作爲第三個參數,因爲這沒有意義。你可能會通過(長)這個。 – 2011-03-03 13:45:31

    +0

    我編輯了我的答案以提供示例。 – 2011-03-03 14:18:31