gpt4 book ai didi

c++ - 在类中子类化按钮控件

转载 作者:行者123 更新时间:2023-11-30 03:08:16 28 4
gpt4 key购买 nike

我创建了自己的自定义 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'

你的想法?

最佳答案

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

试着想象有人正在调用 CallWindowProc(MyEditHandle, ...)。 Button_WndProc应该在CButtonUXnav的哪个对象(实例)上操作?它的 this 指针是什么?

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

编辑:

你实际上需要三样东西:

  • 将回调函数声明为静态的:
    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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com