MFC焦点问题

xuwei__5720 2010-12-14 04:31:47
我在用MFC编写的一个主对话框的左边添加了一个树控件,然后点击树的各个叶子能够在右边的静态框里边新建一个对应的子对话框,现在要求的是在点了树之后按tab键焦点能够转移到子对话框的控件上,或者说在店里树之后按定义在子对话框里边的热键能够起作用,现在的情况是只能在主对话框里边的各个控件之间来回切换,热键的话,必须要在子对话框的控件上点一下之后才能起作用,请问该怎么解决啊???在线等~~谢谢各位了~~
...全文
310 22 打赏 收藏 举报
写回复
22 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
xuwei__5720 2010-12-16
[Quote=引用 21 楼 xianglitian 的回复:]
引用 12 楼 jpduck 的回复:
引用 11 楼 xianglitian 的回复:
消息没有运行说明消息参数设置有误或者消息映射连接的不对
你好好检查一下

我在CTreeCtrl 鼠标点击事件处理函数中写了
::PostMessage(GetDlgItem(IDD_CHILD)->GetSafeHwnd(),WM_MY_MESSAGE,0,0);
在子对话框的消息处理函数中写……
[/Quote]

问题已经解决了,谢谢
  • 打赏
  • 举报
回复
向立天 2010-12-16
[Quote=引用 12 楼 jpduck 的回复:]
引用 11 楼 xianglitian 的回复:
消息没有运行说明消息参数设置有误或者消息映射连接的不对
你好好检查一下

我在CTreeCtrl 鼠标点击事件处理函数中写了
::PostMessage(GetDlgItem(IDD_CHILD)->GetSafeHwnd(),WM_MY_MESSAGE,0,0);
在子对话框的消息处理函数中写了
::SetFocus(IDC_RAD……
[/Quote]
::SetFocus(IDC_RADIO1);
-----------------------------------
你这句话明显有问题
IDC_RADIO1是ID并不是句柄啊
不好意思先前没仔细看这里
这个位置直接写SetFocus()
试试
  • 打赏
  • 举报
回复
向立天 2010-12-15
问题1:IDD_CHILD是控件?如果是子窗口的话你应该直接有指针不用GetDlgItem获取吧
问题2:你的消息映射连接了么
  • 打赏
  • 举报
回复
xuwei__5720 2010-12-15
还有一点,就是GetDlgItem(...)->GetSafeHwnd() 换成GetDlgItem(...)->m_hWnd,就会产生中断,有谁能解释一下这两个的区别和功能吗?
  • 打赏
  • 举报
回复
xuwei__5720 2010-12-15
[Quote=引用 11 楼 xianglitian 的回复:]
消息没有运行说明消息参数设置有误或者消息映射连接的不对
你好好检查一下
[/Quote]
我在CTreeCtrl 鼠标点击事件处理函数中写了
::PostMessage(GetDlgItem(IDD_CHILD)->GetSafeHwnd(),WM_MY_MESSAGE,0,0);
在子对话框的消息处理函数中写了
::SetFocus(IDC_RADIO1);

在子对话框里边有三个单选框按钮,并在按钮上加了&N,&P,&R用来实现热键

不知道那里出了问题了
  • 打赏
  • 举报
回复
向立天 2010-12-15
消息没有运行说明消息参数设置有误或者消息映射连接的不对
你好好检查一下
  • 打赏
  • 举报
回复
xuwei__5720 2010-12-15
[Quote=引用 1 楼 visualeleven 的回复:]
CTreeCtrl NM_RCLICK事件处理函数中PostMessage一个自定义消息到右边的窗口中,然后在消息的处理函数中SetFocus()来设置控件获取输入焦点
[/Quote]

我根据你说的那么做了,可是焦点还是没有落到右边的子对话框里啊。。。
我在主对话框里添加了一个鼠标单击消息,在消息里边自定义一个PostMessage到子对话框,在子对话框里边的消息处理函数SetFocus(),然后在SetFocus()这一行加了一个断点,运行,点击树,没有执行到这,我再在PostMessage那加了一个断点,运行,点击树,程序就能在这停下来,说明已经执行了PostMessage这个函数,为什么在消息接收里边的程序就没有运行呢???还有,我发现,在树里边第一次点击的时候并没有并没有产生鼠标点击的消息,也就是并没有跑到鼠标单击的那个消息里边去
  • 打赏
  • 举报
回复
花爺 2010-12-15
9楼正解
  • 打赏
  • 举报
回复
xuwei__5720 2010-12-15
[Quote=引用 17 楼 xianglitian 的回复:]
你说的那个指针是不是create这个dialog的时候的那个指针?其他的我好像不记得有什么指针了
-------------------
对就是它
[/Quote]

消息是能够发送成功了,就是焦点问题还是没有解决
  • 打赏
  • 举报
回复
xuwei__5720 2010-12-15
[Quote=引用 17 楼 xianglitian 的回复:]
你说的那个指针是不是create这个dialog的时候的那个指针?其他的我好像不记得有什么指针了
-------------------
对就是它
[/Quote]

在SendMessag的时候第一个参数是HWND类型的,并不是CChild*(子对话框的类)类型的啊,是不是进行强制类型转换啊??
  • 打赏
  • 举报
回复
向立天 2010-12-15
你说的那个指针是不是create这个dialog的时候的那个指针?其他的我好像不记得有什么指针了
-------------------
对就是它
  • 打赏
  • 举报
回复
xuwei__5720 2010-12-15
[Quote=引用 14 楼 xianglitian 的回复:]
问题1:IDD_CHILD是控件?如果是子窗口的话你应该直接有指针不用GetDlgItem获取吧
问题2:你的消息映射连接了么
[/Quote]

IDD_CHILD 是子对话框的ID

你说的那个指针是不是create这个dialog的时候的那个指针?其他的我好像不记得有什么指针了(新手,不要鄙视哈)
消息映射我已经连接了啊,同样的方法,我从子对话框发给父对话框的消息都能接收到的
  • 打赏
  • 举报
回复
bragi523 2010-12-14
直接SetFocus()最简单,只需把窗口句柄传过来
  • 打赏
  • 举报
回复
xuwei__5720 2010-12-14
[Quote=引用 6 楼 vc1000 的回复:]
PostMessage()是将消息放入消息队列后立即返回,不等待消息执行。
sendmessage()不将消息放入消息队列,而是直接发送到指定的窗口,执行完成后才返回。
个人认为 他们在一般情况下用起来没多大区别。
获取子对话框句柄GetDlgItem(这对话框ID)->GetSafeHwnd()
[/Quote]
嗯,谢谢~可是我的焦点还是没有跑过去啊
  • 打赏
  • 举报
回复
vc1000 2010-12-14
这对话框ID-子对话框ID
  • 打赏
  • 举报
回复
vc1000 2010-12-14
PostMessage()是将消息放入消息队列后立即返回,不等待消息执行。
sendmessage()不将消息放入消息队列,而是直接发送到指定的窗口,执行完成后才返回。
个人认为 他们在一般情况下用起来没多大区别。
获取子对话框句柄GetDlgItem(这对话框ID)->GetSafeHwnd()
  • 打赏
  • 举报
回复
xuwei__5720 2010-12-14
[Quote=引用 3 楼 visualeleven 的回复:]
引用 2 楼 jpduck 的回复:
引用 1 楼 visualeleven 的回复:
CTreeCtrl NM_RCLICK事件处理函数中PostMessage一个自定义消息到右边的窗口中,然后在消息的处理函数中SetFocus()来设置控件获取输入焦点

请问一下为什么要用PostMessage,用sendmessage可以吗?

还有要获得子对话框的句柄该用什么函数啊?

我……
[/Quote]

我先去试试看吧~~先谢谢了,待会回来
  • 打赏
  • 举报
回复
zzw820626 2010-12-14
1.sendmessage也可以
2.子对话框对象的m_hWnd成员
  • 打赏
  • 举报
回复
Eleven 2010-12-14
[Quote=引用 2 楼 jpduck 的回复:]
引用 1 楼 visualeleven 的回复:
CTreeCtrl NM_RCLICK事件处理函数中PostMessage一个自定义消息到右边的窗口中,然后在消息的处理函数中SetFocus()来设置控件获取输入焦点

请问一下为什么要用PostMessage,用sendmessage可以吗?

还有要获得子对话框的句柄该用什么函数啊?

我是新人,麻烦讲解一下~谢谢~~
[/Quote]
你可以PostMessage自定义消息到右边的子对话框的父窗口就可以了,然后你的父窗口和你的子对话框窗口之间通信就应该很容易了吧
  • 打赏
  • 举报
回复
xuwei__5720 2010-12-14
[Quote=引用 1 楼 visualeleven 的回复:]
CTreeCtrl NM_RCLICK事件处理函数中PostMessage一个自定义消息到右边的窗口中,然后在消息的处理函数中SetFocus()来设置控件获取输入焦点
[/Quote]
请问一下为什么要用PostMessage,用sendmessage可以吗?

还有要获得子对话框的句柄该用什么函数啊?

我是新人,麻烦讲解一下~谢谢~~
  • 打赏
  • 举报
回复
加载更多回复(1)
发帖
界面

1.5w+

社区成员

VC/MFC 界面
社区管理员
  • 界面
加入社区
帖子事件
创建了帖子
2010-12-14 04:31
社区公告
暂无公告