我创建了自己的自定义GUI按钮类,以用于Windows Mobile应用程序。意识到我需要更好的控制并消除双击的烦恼,我发现我需要做的就是像往常一样对它进行子类化。

但是,尽管我将所有内容封装到一个Class中,这似乎使事情变得复杂。

以下是我想做的一小段

// 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;
    }

但我似乎无法逃避解决此错误:



你的意见?

最佳答案

您试图将成员函数传递给外部实体以调用它,这是不可能的。

试想一下有人在打电话CallWindowProc(MyEditHandle, ...)。 Button_WndProc应该在哪个CButtonUXnav对象(实例)上运行?它的this指针是什么?

如果您确实希望将回调函数作为类的成员,则必须将其声明为static,使其可以从外部访问,但只能访问CButtonUXnav的静态成员变量。
要解决此问题,请使用SetWindowLong(hWnd, GWL_USERDATA, &CButtonUXnav)将指针与编辑窗口句柄绑定(bind)到CButtonNXnav,这将解决您的问题。

编辑:

您实际上需要三件事:

  • 将回调函数声明为static: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);

  • 希望这样做:)

    关于c++ - 在类中将按钮控件子类化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5180437/

    10-11 04:37