问题,症状:
程序的主窗口CMainWnd创建了一个modal dialog,希望这个dialog能接收WM_KEYDOWN消息,但是需要点一下这个dialog窗口它才能接收到(我嫌麻烦),而且我发现,如果我保持CMainWnd处于激活状态,就没有这个问题。
所以就希望这个dialog一创建默认就能接收到WM_KEYDOWN,当然首先想到的是SetFocus,然后就看到了下面提到的没卵用(至少是对我这个问题)的那篇blog,无论是对dialog进行setfocus或者CMainWnd进行setfocus都没有用,也尝试了该blog提到的WM_NEXTDLGCTL,还是没用。
然后又搜到了几个解决办法,什么GotoDlgCtrl啊,PreTranslateMessage啊,统统无法解决这个问题,下面是我搜索过的资料:
http://computer-programming-forum.com/81-vc/73468bccb8affc17.htm
http://computer-programming-forum.com/82-mfc/ee69e2c176cdaf2c.htm
http://computer-programming-forum.com/82-mfc/f99bbc4314038236.htm
http://blog.163.com/lh_bbs/blog/static/1430708032011093159371/
搞得我实在没办法了,我就想到是不是应该有个ActivateWnd之类的,果然找到一个ActivateTopParent(如图,来自CWnd,奇怪的是这货居然在MSDN中搜不到文档!),然后我在OnInitDialog中的倒数第二句(也就是return之前)写上
this->ActivateTopParent()
问题解决!
后来我在OnInitDialog中试了试this->SetActiveWindow(),也没用,去调用CMainWnd的SetActiveWindow还是没有用
---------------------------没卵用---------------------------
原文:http://blogs.msdn.com/b/oldnewthing/archive/2004/08/02/205624.aspx
很棒的原创,我是说为什么在对dialog box使用SetFocus不管用呢
简单的说,解决办法就是
SendMessage(hdlg, WM_NEXTDLGCTL, (WPARAM)hwndControl, TRUE);
如果是MFC,就在dialog的member中调用
this->SendMessage(WM_NEXTDLGCTL, (WPARAM)this->GetSafeHwnd(), TRUE)
或者
this->GotoDlgCtrl(this)