请教如何用code在一个dialog(resizable window)里面改变Tab order?

syt93464 2007-03-09 11:42:50
有一个Text Dialog,可以在里面输入多行,多字体的文字,可以修改文字的样式。现在的问题是我想把文字区域(text area, 是一个CRichEditView)的Tab Order放在OK Button 的前面,这样在输入完文字后就可以按Tab 键转到OK Button,这个Dialog 没有资源文件,所以只能用Code 来实现这个功能,我想默认的Tab Order应该是Dialog 内放入各种Control 的顺序。我想在OnInitDialog() 的结尾用以下Code来实现这个功能。
m_editCtrlView->SetWindowPos(GetNextDlgTabItem(GetDlgItem(IDOK), TRUE), 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
return false;

其中m_editCtrlView就是这个CRichEditView, 但是却不能改变原来的Tab Order。
我们这个项目的老外给的分析如下:
This may be a result of the resizable window implementation. The window is probably processing a window size command after the OnInitDialog call and the resizable window handling could be using SetWindowPos in a way that messes up the Zorder

请教各位大虾能否赐教,如何能实现这样的功能,非常谢谢!
...全文
333 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
syt93464 2007-03-12
  • 打赏
  • 举报
回复
to lzg0001, 在PreTranslateMessage()函数内,捕获键盘消息是可以的,但这个函数不是处理Tab order的合适的地方,因为这样的话每次处理消息的时候都要判断一下Tab键是否被按下,而且每次按下Tab键的时候都要call SetWindowPos. 所以还是应该在OnInitDialog()内来处理。

to Mackz,我不是很明白,能说得详细一些吗?
菜牛 2007-03-09
  • 打赏
  • 举报
回复
还是用SetWindowPos,只不过把需要的几个控件都调整一下。
lzg0001 2007-03-09
  • 打赏
  • 举报
回复
窗口子类化,捕获键盘消息!
goodboyws 2007-03-09
  • 打赏
  • 举报
回复
BOOL SetWindowPos(
const CWnd* pWndInsertAfter,
int x,
int y,
int cx,
int cy,
UINT nFlags
);
可以将当前窗口的Tab Order设到pWndInsertAfter之后
syt93464 2007-03-09
  • 打赏
  • 举报
回复
谢谢skypu, 这种方法必须要有对话框模版才行吧!这里没有。

To zhucde, 我也用过这种方法,如果用SetFocus(),是可以指定到OK Button上去,但会带来其他的问题,如我多按几次Tab 键,只能指到Tab order 在Text area和OK button之间的几个Control上去,其他的都不能用Tab键来访问了。我想这种方法不是真正地改变了Tab order.所以我想用SetWindowPos()来实现,这个method可以指定Tab Order。但没想到竟然不行,而且令人奇怪的是,第一天用这个是可以的,到了第二天下午,也没有改别的code,竟然就不能调整tab order了,实在是郁闷。!!
zhucde 2007-03-09
  • 打赏
  • 举报
回复
用SetFocus结合焦点判断来进行了吧
比如当前处于哪个控件上,按切换时,用SetFocus指定到另一个上
skypu 2007-03-09
  • 打赏
  • 举报
回复
在IDEV里面Ctrl+D然后可以设置tab顺序的

15,975

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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