首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调用SetWindowLongPtr时未处理的异常

调用SetWindowLongPtr时未处理的异常
EN

Stack Overflow用户
提问于 2018-06-06 06:51:39
回答 1查看 162关注 0票数 -2
代码语言:javascript
复制
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);

}

当这个函数到达右大括号时,它会说有一个未处理的异常。

EN

回答 1

Stack Overflow用户

发布于 2018-06-06 06:57:28

这行代码应该是:

代码语言:javascript
复制
backupproc = (WNDPROC)SetWindowLongPtr(hmmitem, GWLP_WNDPROC,(LONG_PTR)EditProc);

但是Raymond太快了!:)

编辑: Jonathon波特在上面评论说,有一种更好的方法来做到这一点(这是微软推荐的方法)。所以请忽略上面的代码,并像下面这样继承你的窗口:

代码语言:javascript
复制
SetWindowSubclass (hmmitem, EditProc, EditProcSubclassID, EditProcReferenceData);

其中:

  • EditProcSubclassID是您选择的唯一ID (只需设置一个up).
  • EditProcReferenceData,无论何时调用,它都会被传递给EditProc。您可以使用它做任何您喜欢的事情(或者直接传递0)。

然后像这样实现EditProc (注意末尾的两个额外参数):

代码语言:javascript
复制
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的博客。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50709996

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档