今天在对ComboBox进行重绘的时候,由于ComboBox是通过资源添加到,而我要实现的是用SDK方式实现一个类,重绘ComboBox的时候,只要定义一个类,就可以用类对象对添加到ComboBox进行操作了。但开始的时候,消息响应函数不是设置成全局,就要设置成静态的,所以我的类中的ComboBox句柄就必须写成静态的了,从而,如果我有多个ComboBox的时候,就要出问题了。后来找到了SetProp函数和GetProp函数后,终于解决了问题了。方法如下:
定义一个全局的函数(MsgSender),用它来分发所有的窗口消息,而真正的处理消息的不声明成静态,而通过类指针查找。而要区分到底是那个窗口的消息的话就要用到SetProp和GetProp了
首先,在要设置消息响应函数前调用SetProp(hwnd,ATOM_XX,(HANDLE)this);hwnd是要设置消息响应函数的窗口句柄,
ATOM_XX是一个宏(具体可以查看SetProp函数),this 就是我们的当前类了(此处假设是CWnd)。
在消息处理函数中,只要取出该类指针即可操作了,示例代码如下:
设置窗口处理函数:
#defint WND_OBJ "@"
LRESULT CALLBACK MsgSender(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);//分发消息函数
class CWnd
{...
....
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);//真正处理消息函数
};
SetProp(hwnd1,WND_OBJ,(HANDLE)this);//设置窗口1
SetWindowLong(hwnd1,GWL_WNDPROC,MsgSender);
SetProp(hwnd2,WND_OBJ,(HANDLE)this);//设置窗口2
SetWindowLong(hwnd2,GWL_WNDPROC,MsgSender);
LRESULT CALLBACK MsgSender(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
CWnd* pWnd = NULL;
pWnd = (CWnd*)GetProp(hwnd,WND_OBJ);//从句柄去取得类指针
pWnd->WndProc(hwnd,message,wParam,lParam);// 处理消息
........
........
}
哈哈 ,太棒了。。。。。