void IronmanMap::CommandLine()
{
mode = 1;
InvalidateRect(storedhwnd, NULL, 1);
HWND hmmitem;
hmmitem = GetDlgItem(storedhwnd, ID_EDITBOX1);
backupproc = (WNDPROC)SetWindowLongPtr(hmmitem, GWLP_WNDPROC, (LONG)EditProc);
SetFocus(hmmitem);
}当这个函数到达右大括号时,它会说有一个未处理的异常。
发布于 2018-06-06 06:57:28
这行代码应该是:
backupproc = (WNDPROC)SetWindowLongPtr(hmmitem, GWLP_WNDPROC,(LONG_PTR)EditProc);但是Raymond太快了!:)
编辑: Jonathon波特在上面评论说,有一种更好的方法来做到这一点(这是微软推荐的方法)。所以请忽略上面的代码,并像下面这样继承你的窗口:
SetWindowSubclass (hmmitem, EditProc, EditProcSubclassID, EditProcReferenceData);其中:
EditProcSubclassID是您选择的唯一ID (只需设置一个up).EditProcReferenceData,无论何时调用,它都会被传递给EditProc。您可以使用它做任何您喜欢的事情(或者直接传递0)。然后像这样实现EditProc (注意末尾的两个额外参数):
LRESULT CALLBACK EditProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData)
{
...
}那么backupproc发生了什么呢?好吧,你不再需要它了。相反,要调用链中的下一个WndProc,请在EditProc的末尾调用DefSubclassProc() (如果您想吞下消息,也可以不调用)。
最后,如果您希望从窗口分离EditProc,请调用RemoveWindowSubclass()。
这种方法的主要优点是,如果其他人在你之后(或者,实际上,如果他们想在你之前删除他们的WndProc )对窗口进行子类化,它就可以正常工作。这就是你应该使用它的原因。
阅读MSDN上的SetWindowSubclass文档,并查看Safer subclassing上Raymond的博客。
https://stackoverflow.com/questions/50709996
复制相似问题