问一个子窗口内控件焦点的问题(...还得重新写一遍,郁闷)

中年風雨 2015-03-04 11:05:05
问题描述:
1.使用windows api编写程序,在主窗口内创建了两个子窗口A, B
2.默认情况下,A,B两个子窗口都不能Active,我处理了WM_SYSCOMMAND和WM_LBUTTONUP,使鼠标点击在窗口A、B上时,能够Active A或B。
3.在B窗口上增加一个edit控件
hEdit = CreateWindow("edit", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER | BS_TEXT, 0, 0, 200, 20, hwnd, (HMENU)10201, hInstance, 0);

问题:
1.当B InActive时,点击在hEdit上,hEdit不能获取焦点,B也不能被Active,请问,如何让鼠标点击hEdit时,Active 窗口B,并且让hEdit获取焦点?
2.当B Active,hEdit取得焦点后,此时点击窗口A,则A被Active,但光标仍然在hEdit中闪烁,问应该怎么样处理?
...全文
213 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiht594 2015-03-11
  • 打赏
  • 举报
回复
引用 8 楼 pardream 的回复:
代码有点多,挑重点: 主程序里: 在ShowWindow()之后 hA = CreateAWindow(hwnd); hB = CreateBWindow(hwnd); hC = CreateCWindow(hwnd); HWND CreateAWindow(HWND hwnd) { //CreateBWindow, CreateCWindow类似,改一下szClassName. WNDCLASSEX wc; .... h = CreateWindow(szClassName, szCaption, WS_CHILD|WS_CAPTION|WS_HSCROLL|WS_VISIBLE|WS_CLIPSIBLINGS|WS_TABSTOP|WS_BORDER, x,y,w, h, hwnd, 0, g_hInstance, NULL); } 在B的WM_CREATE:里 hEdit = CreateWindow("edit", NULL, WS_CHILD |WS_OVERLAPPED| WS_VISIBLE | WS_BORDER | BS_TEXT | WS_HSCROLL | ES_LEFT | ES_MULTILINE |ES_AUTOHSCROLL | ES_AUTOVSCROLL, 0, 0, 400, 120, hwndB, (HMENU)10201, g_wh.hInstance, 0); 就是这个hEdit,如果B是非Active的,则点击无效
b窗口去掉WS_CAPTION之后就可以了. 加了之后不知道为什么不行.
中年風雨 2015-03-11
  • 打赏
  • 举报
回复
原因如此!多谢了啊,怎么也没想到是它的问题。
中年風雨 2015-03-06
  • 打赏
  • 举报
回复
代码有点多,挑重点: 主程序里: 在ShowWindow()之后 hA = CreateAWindow(hwnd); hB = CreateBWindow(hwnd); hC = CreateCWindow(hwnd); HWND CreateAWindow(HWND hwnd) { //CreateBWindow, CreateCWindow类似,改一下szClassName. WNDCLASSEX wc; .... h = CreateWindow(szClassName, szCaption, WS_CHILD|WS_CAPTION|WS_HSCROLL|WS_VISIBLE|WS_CLIPSIBLINGS|WS_TABSTOP|WS_BORDER, x,y,w, h, hwnd, 0, g_hInstance, NULL); } 在B的WM_CREATE:里 hEdit = CreateWindow("edit", NULL, WS_CHILD |WS_OVERLAPPED| WS_VISIBLE | WS_BORDER | BS_TEXT | WS_HSCROLL | ES_LEFT | ES_MULTILINE |ES_AUTOHSCROLL | ES_AUTOVSCROLL, 0, 0, 400, 120, hwndB, (HMENU)10201, g_wh.hInstance, 0); 就是这个hEdit,如果B是非Active的,则点击无效
xionggch 2015-03-05
  • 打赏
  • 举报
回复
试着把Edit的父窗口设为B窗口
jiht594 2015-03-05
  • 打赏
  • 举报
回复
引用 5 楼 pardream 的回复:
回4楼,点击hEdit时,B窗口没有响应事件,点击事件是在hEdit上,但hEdit又没有处理函数。是不是要自己实现hEdit的事件?
不应该啊 你把代码贴上来看看.
中年風雨 2015-03-04
  • 打赏
  • 举报
回复
回4楼,点击hEdit时,B窗口没有响应事件,点击事件是在hEdit上,但hEdit又没有处理函数。是不是要自己实现hEdit的事件?
jiht594 2015-03-04
  • 打赏
  • 举报
回复
引用 3 楼 pardream 的回复:
是我犯了个错误,开始的时候写了SetFocus(),但没起作用,以为不是这个问题。后来才发现是写错hwnd对象了。 那第1问怎么解决? 当B不活动时,我想做到当点击hEdit控件时,把B激活,同时把焦点设定到hEdit上。这个应该如何处理?
OnActivate
中年風雨 2015-03-04
  • 打赏
  • 举报
回复
是我犯了个错误,开始的时候写了SetFocus(),但没起作用,以为不是这个问题。后来才发现是写错hwnd对象了。 那第1问怎么解决? 当B不活动时,我想做到当点击hEdit控件时,把B激活,同时把焦点设定到hEdit上。这个应该如何处理?
赵4老师 2015-03-04
  • 打赏
  • 举报
回复
CWnd::SetFocus CWnd* SetFocus( ); Return Value A pointer to the window object that previously had the input focus. It is NULL if there is no such window. The returned pointer may be temporary and should not be stored. Remarks Claims the input focus. The input focus directs all subsequent keyboard input to this window. Any window that previously had the input focus loses it. The SetFocus member function sends aWM_KILLFOCUS message to the window that loses the input focus and aWM_SETFOCUS message to the window that receives the input focus. It also activates either the window or its parent. If the current window is active but does not have the focus (that is, no window has the focus), any key pressed will produce the messages WM_SYSCHAR, WM_SYSKEYDOWN, or WM_SYSKEYUP. CWnd Overview | Class Members | Hierarchy Chart See Also ::SetFocus, CWnd::GetFocus
wyc761024 2015-03-04
  • 打赏
  • 举报
回复
setfocus

65,184

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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