关于IsDialogMessage函数的一点疑问,好久没来了,顺便散分。。。当程序中出现非模态对话框的时候,消息循环必须
关于IsDialogMessage函数的一点疑问,好久没来了,顺便散分。。。 当程序中出现非模态对话框的时候,消息循环必须写成 [code=C]while (GetMessage(&msg, NULL, 0, 0)) { if (!IsDialogMessage(hDlg1,&msg)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } //} } } return msg.wParam; } [/code] 查了MSDN,知道了: when isdialogmessage processes a message,it checks for keyboard message and converts them into selections for the corresponding dialog box. IsDialogMessage是检查对话框上的键盘消息的,我测试了一下: 在键盘上放置3个按钮,OK,BUTTON1,BUTTON2,缺省按钮是OK,三个按钮都有制表符TAB,运行的时候测试结果汇报如下: 当按下键盘上的TAB键焦点会在三个按钮之间进行切换,按下回车或者空格就会触发OK按钮(缺省按钮嘛)来关闭对话框。 当把IsDialogMessage注释掉之后,测试汇报: 此时运行默认焦点还是在OK上(缺省按钮),当按下TAB键时没有任何反应(证明了此函数确实是管理对话框的按键消息的) 当按下回车的时候也没有任何反应,但是,但是,特此强调的是:当按下空格键的时候,会触发消息关闭对话框。 问题来了:既然IsDialogMessage是管理键盘消息的,那按下空格跟按下回车,TAB不都是按键消息(WM_KEYDOWN)吗,为何,回车,TAB都没反应,空格却有反应呢? 特此到论坛求助,欢迎回答,先说谢谢!!![解决办法] 备注:尽管IsDialogMessage函数是为无模态对话框而扩展的,但可以用含有控制的任何一个窗口来使用它。当 IsDialogMessage处理一个消息时,它检测键盘信息并把它们转变成对响应对话框的选择命令。例如当按下tab时选择下一个控制或控制组,当按下down时选择控制组的下一个控制。[解决办法] When IsDialogMessage processes a message, it checks for keyboard messages and converts them into selections for the corresponding dialog box. For example, the TAB key, when pressed, selects the next control or group of controls, and the DOWN ARROW key, when pressed, selects the next control in a group. [解决办法] 小云现在相当有范儿啊 回答问题相当专业[解决办法] 按那个意思就是tab,上,下,左右的键都不会响应了,如果不响应的话,那WM_KEYDOWN,keyup也不会响应了,当然我这没那环境,测试不了,你看下其它键在这个时候是否响应WM_KEYDOWN[解决办法] [解决办法]
探讨 引用: When IsDialogMessage processes a message, it checks for keyboard messages and converts them into selections for the corresponding dialog box. For example, the TAB key, when presse……[解决办法] 貌似在Windows程序设计里面对话框一章有讲到。记不太清了,回家研究下~
[解决办法] 通常dlg不处理“WM_KEYDOWN”他需要translate后的键如TAB。
[解决办法] 至于“空格”对话框把他看作“OK”,你可以在OK中大个断点看看。
[解决办法] 原因应该是这个,你在按键时,焦点窗口不是对话框,而是上面的控件,所以你按键对话框的窗口过程是不会收到WM_KEYDOWN的,但你按tab有用是因为IsDialogMessage作了转换,按空格能关闭是因为焦点是按钮,它的窗口过程处理了消息
[解决办法] 首先要知道键盘消息属于队列消息,因此不会在GetMessage中被分发,而是从GetMessage返回,
所以如果你按了tab
在WM_KEYDOWN到达控件的窗口过程前,ISDIALOGMESSAGE有机会处理它
IsDialogMessage会像对话框的可能接受这个WM_KEYDOWN控件发送WM_GETDLGCODE消息来知道这些控件是否需要处理tab如果没有控件处理tab,则tab可以被用作选择控件的按键,IsDialogMessage就会改变焦点窗口
[解决办法] 消息分发就是把根据窗口把消息给窗口过程(call它)
消息有两种,一种是队列消息,一种是非队列消息
PostMessage,按键,产生队列消息,SendMessage,CreateWindow产生非队列消息
GetMessage在执行的过程中,会分发所有的非队列消息(调用对应的窗口过程),处理完非队列消息后,如果还有队列消息,就根据队列的顺序取出一个返回,否则继续等消息
队列消息一般会由TranslateMessage转换,然后由DispatchMessage分发至窗口过程
IsDialogMessage处理的是队列消息,只有队列消息才能被GetMessage和PeekMessage取回
[解决办法] ISDIALOGMESSAGE并不会判断消息是不是对话框消息,只是根据控件对WM_GETDLGCODE的回答判断是否自己来处理按键消息,如果这个消息有个控件通过WM_GETDLGCODE告诉ISDIALOGMESSAGE自己要处理消息,ISDIALOGMESSAGE就不会自作主张
[解决办法] 消息发送的是不是ISDIALOGMESSAGE中指定的对话框的控件是很好判断的,只需要比较控件的父窗口就行了[解决办法]
引用 When IsDialogMessage processes a message, it checks for keyboard messages and converts them into selections for the corresponding dialog box. For example, the TAB key, when pressed, selects the next control or group of controls, and the DOWN ARROW key, when pressed, selects the next control in a group. [解决办法] 你要在BTNWNDPROC中处理WM_GETDLGCODE
case WM_GETDLGCODE:
OutputDebugStringA("aaa");
return 2;这里2代表我要处理tab键
这样如果焦点在IDOK,你按tab就不会有切换控件的功能,因为可能处理消息的控件说自己要处理这个消息
IsDialogMessage不会像所有控件发送WM_GETDLGCODE,只是向有可能会处理消息(IsDialogMesage第二参数指定的)控件发送WM_GETDLGCODE,这样的控件通常是焦点窗口
[解决办法] 你学MFC多长时间了!我现在正在学WINDOWS编程和网络编程,可以交流一下!
[解决办法] IsDialogMessage不会向所有控件发送WM_GETDLGCODE,只是向有可能会处理IsDialogMesage第二参数指定的消息的控件发送WM_GETDLGCODE,这样的控件通常是那个消息的目标的目的窗口,如果是按键消息,目的窗口就是焦点窗口
[解决办法] 怎么又有错,如果是按键消息,目的窗口一般都是是焦点窗口,除非是用PostMessage向不是焦点窗口发的
[解决办法] 探讨 你学MFC多长时间了!我现在正在学WINDOWS编程和网络编程,可以交流一下![解决办法] 返回DLGC_WANTTAB9不是说这不是对话框消息,而是指这个消息不需要IsDialogMessage特殊处理
一般情况下给对话框控件的都是对话框消息,IsDialogMessage内部也有
TranslateMessage(&msg);
DispatchMessage(&msg);
来分发消息
[解决办法] DialogBoxParam等函数会将主窗口禁用
然后内部有像while (GetMessage(&msg, NULL, 0, 0))
{
if (!IsDialogMessage(hDlg1,&msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
//}
}
}
return msg.wParam;
} 这样的消息循环,都是差不多的