⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 subject_38854.htm

📁 vc
💻 HTM
字号:
<p>
序号:38854 发表者:金枪鱼 发表日期:2003-05-06 16:30:15
<br>主题:WM_NEXTDLGCTL消息的用途和如何用?
<br>内容:请高手说明一些WM_NEXTDLGCTL消息的用处,并代码示列如何用。
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:Justin Le 回复日期:2003-05-06 17:49:01
<br>内容:pWnd-&gt;PostMessage(WM_NEXTDLGCTL,1,0); // 上移焦点<BR>pWnd-&gt;PostMessage(WM_NEXTDLGCTL,0,0); // 下移焦点<BR><BR><BR>//但和SetFocus不同,WM_NEXTDLGCTL modifies the border around the control. <BR>MSDN的定义:<BR>WM_NEXTDLGCTL wCtlFocus = wParam; <BR>fHandle = (BOOL) LOWORD(lParam);<BR><BR>//-------------------for example-----------------------<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp; case WM_COMMAND:<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp; if(wParam=IDOFDEFBUTTON || IDOK) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// User has hit the ENTER key.<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hwndTest = GetFocus() ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;retVal = TesthWnd(hWndTest) ;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Where retVal is a boolean variable that indicates whether<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//the hwndTest is the handle of one of the edit controls.<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(hwndTest) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Focus is with an edit control, so do not close the dialog.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Move focus to the next control in the dialog.<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PostMessage(hDlg, WM_NEXTDLGCTL, 0, 0L) ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return TRUE ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Focus is with the default button, so close the dialog.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EndDialog(hDlg, TRUE) ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return FALSE ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp; break ; 
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:金枪鱼 回复日期:2003-05-06 21:39:31
<br>内容:十分谢谢Justin Le指点。<BR><BR>但我还是没有弄懂发送WM_NEXTDLGCTL消息与SetFocus的本质区别和使用。<BR><BR>MSDN说:<BR>1)SetFocus()是一个窗口聚焦(同时以前的聚焦全部被取消)成为键盘输入的焦点。<BR>2)发送一个WM_NEXTDLGCTL消息,会导致某个控件(取决于不同的参数)聚焦,它将这个控件的边界图形改变(仅仅改变图形吗?以前的聚焦是否也会取消呢?)。<BR><BR>那么,一个控件因为对话框得到了WM_NEXTDLGCTL消息而聚焦,与使用SetFocus()函数让这个控件聚焦在执行的效果上有什么区别?<BR><BR>另外,在一个对话框中(从一个对话框类派生的),我想用代码来修改控件的Tab顺序,因此需要在某个控件(A)失焦时发送WM_NEXTDLGCTL消息,使其聚焦到指定的控件(B)上,该在哪里使用PostMessage函数(照理说应该在控件A的失焦函数中发送这个消息)?如果这个控件A本身是自定义的一个类(不如派生于CButton的新型按钮),在其类本身中能够实现在失焦时发送这个WM_NEXTDLGCTL消息呢?<BR><BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:Justin Le 回复日期:2003-05-06 22:06:27
<br>内容:pWnd-&gt;PostMessage(WM_NEXTDLGCTL,1,0); // 上移焦点<BR>pWnd-&gt;PostMessage(WM_NEXTDLGCTL,0,0); // 下移焦点<BR><BR>只是移到下一个焦点,设置顺序还应当有更多的代码。我觉得。<BR>或者说其他代码。<BR><BR>你为什么不直接在dialog资源中设置好顺序呢?<BR><BR>如果一定要自己在程序中改动,<BR>BOOL CYourDlg::PreTranslateMessage(MSG *pMsg)<BR>中重载TAB响应。<BR>我能想到,你要为 dlg的控件建立一个array或链表,tab移动到连表下一个item, setfocus<BR>对应的控件<BR><BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:金枪鱼 回复日期:2003-05-06 22:25:36
<br>内容:似乎太复杂了。<BR>我已经在Dialog资源中设置好了Tab顺序。问题是我要用这一个对话框资源完成多种不同的功能,我不想为每一个功能读去建一个对话框资源(它们主要部分都类似,只有少部分不同)。因此我建好一个能够包括它们需要的所有的控件的对话框资源,并构造了它的类,然后从这个类中派生出多个类来实现不同的功能。在这些类中,对话框原有的有些控件要隐藏或者失效,甚至其Tab顺序都要改变。所有的这些都能够利用类的派生时重新定义虚拟函数和重载成员函数的方式实现,就修改Tab顺序这一点没有实现了。<BR>我早就看到了MSDN中说的这个WM_NEXTDLGCTL消息有点意思,可能能够帮我实现它。但弄了好久了,这没有成功。我在用代码发送指定的消息方面用的很少,缺少经验,不知道该在什么时候和怎样发送这个消息才能启到我需要的效果。<BR><BR>所以,请帮帮忙。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:Justin Le 回复日期:2003-05-06 23:16:16
<br>内容:我觉得代码不会太长。如果没有找到更简单的办法,自己做可能更省时间。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:金枪鱼 回复日期:2003-05-06 23:26:56
<br>内容:不是代码长短的问题,问题是我的项目已经有几十个对话框了。<BR>并且有很多都大通小异,在每个对话框中你都要解写那么多重复的功能相同的函数,你不觉得烦吗。<BR><BR>先把分奉上,如果能够解决,别忘告诉一声。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -