基于对话框的VC程序,ShowWindow的一个问题

用实例说明想要做的事情:有一个对话框,另外有一个非模态对话框对象m_pcLoadDlg,非模态对话框已经在主对话框的OnInitDialog中创建,并初始m_pcLoad... 用实例说明想要做的事情:有一个对话框,另外有一个非模态对话框对象m_pcLoadDlg,非模态对话框已经在主对话框的OnInitDialog中创建,并初始m_pcLoadDlg->ShowWindow(SW_HIDE);我想要在按下按键,比如字母A键,的时候,没有变化,在我松开A键的时候,m_pcLoadDlg显示。
我是这样做的:在对对话框的PreTranslateMessage中添加:

if (pMsg->message==WM_KEYDOWN)
{
if(m_bKeyBusy)
{
return true;
}
m_bKeyBusy=true;
m_pcLoadDlg->ShowWindow(SW_SHOW);
}
if(pMsg->message==WM_KEYUP)
{
if(m_bKeyBusy)
m_bKeyBusy=false;
}
if(m_bKeyBusy)
return true;
return CDialog::PreTranslateMessage(pMsg);

这样确实达到了我要的效果,按下按键直到弹起按键时,非模态对话框m_pcLoadDlg才显示。但是如果相反,我在初始化的时候让他显示,也就是换成m_pcLoadDlg->ShowWindow(SW_SHOW);,在PreTranslateMessage中换成m_pcLoadDlg->ShowWindow(SW_HIDE); 按说效果应该是按下后直到弹起按键,非模态对话框m_pcLoadDlg才隐藏,但是实际效果却不是这样,我按下,它就隐藏了,不等按键弹起......

求解答,感激不尽
m_bKeyBusy初始化为false

问题在于调用m_pcLoadDlg->ShowWindow的效果不一样,,,,如果我按键按下去后调用m_pcLoadDlg->ShowWindow(SW_SHOW);那它确实是等我按键弹起后才显示这个非模态对话框,没问题。但是如果按键按下去后调用m_pcLoadDlg->ShowWindow(SW_HIDE)的话,这个非模态对话框不等我按键弹起,就已经隐藏了。。。。
展开
 我来答
俎晨朗7F
2012-07-25 · 超过48用户采纳过TA的回答
知道小有建树答主
回答量:94
采纳率:0%
帮助的人:118万
展开全部
你考虑过主框架没?按键消息应该不是只有你的对话框可以接收,主框架也可以接收。
MFC消息的派发是有顺序的,默认情况下是先到主框架,主框架处理完再对话框处理。
所以,分析如下
非模态对话框先是隐藏的,按下按键,主框架响应,但不处理,当前活动窗口应该是主框架,所以你看到对话框还是隐藏,接着非模态对话框处理,非模态对话框设为显示,当前活动窗口为对话框,但是为什么你看到的还是隐藏?因为这个切换太快了,人眼识别不出来;按键弹起时,主框架响应但不处理,接着非模态对话框响应,当前活动窗口为非模态对话框,非模态对话框显示。
同理,非模态对话框先是显示的,按下按键,主框架响应,但不处理,当前活动窗口为主框架,这个时候虽然非模态对话框是显示的,但是会被主框架覆盖,你就会觉得是非模态对话框在按键一按下就隐藏了,接着对话框处理的时候更是将自己的属性设为隐藏,肯定就不会显示了;按键弹起时,主框架先响应不处理,非模态对话框再响应处理,还是隐藏。
这个分析你看明白了没?
其实你可以验证我的分析,启动你的程序后,先不要按键,首先将主框架和和非模态对话框的位置错开,比如一个拖到左上角,一个拖到右下角,再看你的现象,这个时候你会发现,第二种情况下,键一按下实际上就隐藏了;第一种情况也不是像你想的那样,按下时不显示,弹起时才显示,实际上还是你键一按下就显示了!只不过这个时候你要看到这个现象的话,因为程序启动后你没办法拖动隐藏的非模态对话框,但是你可以估计出来它会出现的位置,你将主框架拖离这一区域就行了。
这个主要是分析,所以正确的处理还是像三楼说的那样,
m_pcLoadDlg->ShowWindow(SW_SHOW);放的位置要优先考虑,其他处理以这个为准做改变才是。
追问
分析的非常到位,确实是这样,

但是我这个放到WM_KEYUP会有点问题,
源程序是这样的,定义了F1--F8热键,在热键响应函数OnHotKey中去做一些事情,比如m_pcLoadDlg->ShowWindow(SW_SHOW)等,为了避免在按键按下的时候反复执行OnHotKey中的事情,所以定义了m_bKeyBusy,第一次进去的时候置为true,下次再进去判断为true则返回,直到按键弹起的时候也就是WM_KEYUP中置为false,如果全部放到WM_KEYUP中,就不好做热键的响应了
追答
其实热键响应你可以从另外一个方面去理解的。正常理解是按键按下响应,为了避免持续按键加busy标志。你如果反过来想咧?按键按下不响应,按键弹起时响应,这个时候是不是解决按键弹起空挂的问题就行了,这个时候用一个notbusy来处理不就行了?呵呵,换个思维你试试。
一生吥胜
2012-07-25 · TA获得超过208个赞
知道小有建树答主
回答量:208
采纳率:0%
帮助的人:133万
展开全部
WM_KEYDOWN,是响应按键被按下, WM_KEYUP,是响应按键被释放;看LZ的意思,
m_pcLoadDlg->ShowWindow(SW_SHOW);
这个函数应该被放在
if(pMsg->message==WM_KEYUP)
{
// ....
}
里?
追问
你说的没错,放到if(pMsg->message==WM_KEYUP)确实对这个例子来说是没问题,但因为我这个是一个简化的例子,只是为了说明问题,源代码是有其他的需要处理,所以放在了WM_KEYDOWN的响应中,并且我说了,上面的程序,在WM_KEYDOWN中处理m_pcLoadDlg->ShowWindow(SW_SHOW),它没问题,是会等我松开按键才显示,但如果WM_KEYDOWN中处理m_pcLoadDlg->ShowWindow(SW_HIDE),不等我松开按键,就已经隐藏这个对话框了。这才是不解的地方
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
圣徒子
2012-07-26 · TA获得超过606个赞
知道小有建树答主
回答量:622
采纳率:0%
帮助的人:655万
展开全部
加断点调试,追踪一下问题根源。
理论上看,你的m_pcLoadDlg->ShowWindow(SW_HIDE),会在第二次按下键的时候响应。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
动感红薯
2012-07-25 · 超过10用户采纳过TA的回答
知道答主
回答量:39
采纳率:0%
帮助的人:22.1万
展开全部
if(m_bKeyBusy)的问题么?改成if(!m_bKeyBusy)试试 代码问题不大 主要是逻辑问题
追问
逻辑没问题,m_bKeyBusy初始化为false,按下去后置为true,在按键弹起来之前都是true,为的是避免重复响应,直到按键弹起来,m_bKeyBusy置为false,这时才去执行return CDialog::PreTranslateMessage(pMsg),才会将我刚才按键按下去后做的操作(比如此处为m_pcLoadDlg->ShowWindow(SW_SHOW))在界面上显示出来,,,,,
所以逻辑是没问题的,问题出现在按键按下去后调用m_pcLoadDlg->ShowWindow的效果不一样
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
200005275
2012-07-25 · TA获得超过120个赞
知道答主
回答量:181
采纳率:0%
帮助的人:52.9万
展开全部
不完整啊 问题
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式