[求助]虚拟键盘焦点问题!!!!

lgy1977 2011-10-20 04:34:56
程序思路:
VC++6.0建立基于对话框的程序,点击登录按钮,弹出登录对话框A(模态),鼠标单击A上的EDIT控件,弹出键盘对话框B(非模态,父窗口为登录对话框A)。鼠标单击B上按钮时,产生对应按键事件,输入字符到A上的EDIT控件。
主要代码:
对话框A设置属性为:0x08000000|WS_EX_TOPMOST|WS_EX_TOOLWINDOW
对话框B的成员函数:
BOOL B::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
::SendMessage(this->GetParent()->m_hWnd,WM_NCACTIVATE,TRUE,0);
::SendMessage(this->m_hWnd,WM_NCACTIVATE,TRUE,0);

return CDialog::PreTranslateMessage(pMsg);
}
对话框B的按钮消息响应之一:
void B::OnButton1()
{
// TODO: Add your control notification handler code here
::SetForegroundWindow(GetParent()->m_hWnd);
keybd_event('1',MapVirtualKey('1',0),0,0);
}
存在的问题:
在单击按钮时A、B对话框的标题栏出现轻微闪烁,如何避免这种闪烁,望各位指教!
...全文
152 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
gameslq 2011-10-21
  • 打赏
  • 举报
回复
只在对话框B的WM_NCACTIVATE消息里处理即可
1。处理对话框B的WM_NCACTIVATE消息

BOOL CMy2dlg::OnNcActivate(BOOL bActive)
{
// TODO: Add your message handler code here and/or call default

if ( bActive == FALSE )
{
return FALSE;
}

this->GetParent()->SendMessage(WM_NCACTIVATE,TRUE,0);

return CDialog::OnNcActivate(bActive);
}

2。修改对话框B的按钮消息响应之一:

void B::OnButton1()
{
::SetForegroundWindow(GetParent()->m_hWnd);
this->GetParent()->SendMessage(WM_NCACTIVATE,TRUE,0);
DestroyWindow();
}
lgy1977 2011-10-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 webipstin 的回复:]
可以将B窗体设为A窗体的子窗体显示,就是以话框带有child属性。

B窗体作为虚拟键盘也不需要标题栏,所以标题栏也要取消了,这样就在一个窗体上了。
[/Quote]
谢谢webipstin的热情回复,可是现在要求!!登录对话框A和虚拟键盘对话框都有标题栏,而且在操作中都要始终高亮!
lgy1977 2011-10-21
  • 打赏
  • 举报
回复
to gameslq: 谢谢您,我的问题在您的帮助下基本解决了。祝:事事顺利!
lgy1977 2011-10-21
  • 打赏
  • 举报
回复
to gameslq: 如您所述,标题栏是不闪烁了!但如何实现虚拟键盘啊?即键盘消息如何发送给A的EDIT控件啊?
webipstin 2011-10-20
  • 打赏
  • 举报
回复
create(ID_XXDlg,this)//this是只想父窗口的指针,表示创建了一个子窗口
然后 ::showwindow(/*子窗口句柄*/,SW_SHOW/*SW_HIDE*/);
然后movewindow(/*子窗口句柄*/,/*坐标*/);到指定地方,
webipstin 2011-10-20
  • 打赏
  • 举报
回复
子对话框(B框)的属性styles里要注意用下面的配置:
style:child
border:thin
system menu NO check
webipstin 2011-10-20
  • 打赏
  • 举报
回复
可以将B窗体设为A窗体的子窗体显示,就是以话框带有child属性。

B窗体作为虚拟键盘也不需要标题栏,所以标题栏也要取消了,这样就在一个窗体上了。
lgy1977 2011-10-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 webipstin 的回复:]
试试直接向父窗体发送WM_CHAR消息,在判断父窗体控件焦点什么的

用keybd_event('1',MapVirtualKey('1',0),0,0); 有点搞复杂了

B::PreTranslateMessage该函数为默认即可

试试
[/Quote]
因为要保持键盘窗口的标题栏始终高亮状态,所以弄的复杂。如您所述,又如何保持键盘窗口始终高亮,并且不闪烁呢?
webipstin 2011-10-20
  • 打赏
  • 举报
回复
试试直接向父窗体发送WM_CHAR消息,在判断父窗体控件焦点什么的

用keybd_event('1',MapVirtualKey('1',0),0,0); 有点搞复杂了

B::PreTranslateMessage该函数为默认即可

试试

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧