请问如何将一个窗口的WNDPROC函数指定为一个类的成员函数

sandy_wu 2000-08-07 05:47:00
WNDCLASSEX wc;

wc.cbSize = sizeof (WNDCLASSEX);
wc.style = CS_HREDRAW and CS_VREDRAW;
wc.lpfnWndProc = WndProc; (此处如何指定为一个ACLASS类的成员函数)
wc.cbClsExtra = 0;
.......
.......
LRESULT CALLBACK
ACLASS::WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{

}
...全文
657 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
sandy_wu 2000-08-08
  • 打赏
  • 举报
回复
thank every body

to: hyzx2000

1. 用static声明后,此函数只能够调用static的函数了。这是不可以的。
2。产生一个新类CAWnd: 首先我没有用MFC, 其次我不能重载新类的WndProc,我要指定的窗口过程函数也必须是注册的类的成员函数,即:

ACLASS::Register()
{
WNDCLASSEX wc;

wc.cbSize = sizeof (WNDCLASSEX);
wc.style = CS_HREDRAW and CS_VREDRAW;
wc.lpfnWndProc = WndProc; (此处如何指定为一个ACLASS类的成员函数)
wc.cbClsExtra = 0;
.......
.......

}

LRESULT CALLBACK
ACLASS::WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{

在此函数中我要访问ACLASS的成员变量。所以要将WndProc 定义成ACLASS的成员函数,若有其他的办法,请不房说说。
}

pwcpwc 2000-08-08
  • 打赏
  • 举报
回复
再可以调用
pmyclass->WinProc();/*hehe,一点小技巧*/
这个WinProc就可以访问成员变量,这个WinProc不是
全局的WinProc,怎么没有用呢,MFC就是这样做的。
土豆 2000-08-08
  • 打赏
  • 举报
回复
只有用静态方法,因为只有静态方法没有隐含的参数 this指针,一般的成员函数都含有一个隐含的参数this指针,类型不匹配。但用你如果用静态的方法有什么意义呢?你又不能访问类的成员变量。
pwcpwc 2000-08-08
  • 打赏
  • 举报
回复
或者在WM_CREATE时间中建立 HWND->CLass的对照表,也可,我以前是这样做的。
pwcpwc 2000-08-08
  • 打赏
  • 举报
回复
Windows中是不能直接把class的非static成员作为WinProc的,因为它是虚地址函数,
不过你可以这样实现:

做一个

全局的
LRESULT WINAPI MyWinProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
}

然后在自己的类的窗口初始化函数

HWND CreateWindowEx(
DWORD dwExStyle, // extended window style
LPCTSTR lpClassName, // pointer to registered class name
LPCTSTR lpWindowName, // pointer to window name
DWORD dwStyle, // window style
int x, // horizontal position of window
int y, // vertical position of window
int nWidth, // window width
int nHeight, // window height
HWND hWndParent, // handle to parent or owner window
HMENU hMenu, // handle to menu, or child-window identifier
HINSTANCE hInstance, // handle to application instance
LPVOID lpParam // pointer to window-creation data
);

注意把最后一个参数lpParam设为你的类的指针即地址。
比如
CMyClass myclass = new CMyClass();

CMyClass()
{
CreateWindowEx(........,(LPVOID)&myClass);
}
这样
在函数中
LRESULT WINAPI MyWinProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
CMyClass *pmyclass;
/*
pmyclass = (CMyClass*)GetWindowLong(hwnd,GWL_USERDATA);
*/
switch(lParam)
{
case WM_CREATE:
pmyclass = (CMyClass*)(((LPCREATESTRUCT)lParam)->lpCreateParams);
break;
}
再可以调用
pmyclass->WinProc();/*hehe,一点小技巧*/
/**/
}
JGTM2000 2000-08-07
  • 打赏
  • 举报
回复
关键是类的成员函数有一个默认的this指针被压入调用参数堆栈,因此要用一段程序来间接的调用。在Delphi里面可以用MakeObjectInstance来把类的方法包装在另一段程序中,关于VC你可以查查资料。
Areslee 2000-08-07
  • 打赏
  • 举报
回复
如果是动态的呢?
FBStudio 2000-08-07
  • 打赏
  • 举报
回复
类的成员函数含有this指针,所以不能指定为wc.lpfnWndProc,但类的静态成员函数可能行。
hyzx2000 2000-08-07
  • 打赏
  • 举报
回复
在成员函数前加 static 修饰。或用下面的方法:
从CWnd或其派生类继承产生一个新类CAWnd,
CAWnd a;
a.SubclassWindow( ... ) // Subclass...函数参见MSDN
CWnd提供了微软基础库中所有窗口的基本功能。 CWnd对象与Windows的窗口不同,但是两者有紧密联系。CWnd对象是由CWnd的构造函数和析构函数创建或销毁的。另一方面,Windows的窗口是Windows的一种内部数据结构,它是由CWnd的Create成员函数创建的,而由CWnd的虚拟析构函数销毁。DestroyWindow函数销毁Windows的窗口,但是不销毁对象。 CWnd和消息映射机制隐藏了WndProc函数。接收到的Windows通知消息通过消息映射被自动发送到适当的CWnd OnMessage成员函数。你可以在派生中重载OnMessage成员函数以处理成员的特定消息。 CWnd同时还使你能够为应用程序创建Windows的子窗口。先从CWnd继承一个,然后在派生中加入成员变量以保存与你的应用程序有关的数据。在派生中实现消息处理成员函数和消息映射,以指定当消息被发送到窗口时应该如何动作。 你可以经过两个步骤来创建一个窗口。首先,调用构造函数CWnd以创建一个CWnd对象,然后调用Create成员函数以创建子窗口并将它连接到CWnd对象。 当用户关闭你的子窗口时,应销毁CWnd对象,或者调用DestroyWindow成员函数以清除窗口并销毁它的数据结构。 在微软基础库中,从CWnd派生了许多其它以提供特定的窗口型。这些中有许多,包括CFrameWnd,CMDIFrameWnd,CMDIChildWnd,CView和CDialog,被用来进一步派生。从CWnd派生的控件,如CButton,可以被直接使用,也可以被进一步派生出其它来。

16,470

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧