怪问题,高分求助,分不够再加,急!!!

时间:2023-02-08 21:29:50
遇到一个怪问题,create一个对话框,
ptrTestDlg = new TestDlg(this);
ptrTestDlg ->Create(IDD_TESTDLG,this);
ptrTestDlg ->UpdateData(TRUE);
ptrTestDlg ->RedrawWindow();
ptrTestDlg ->CenterWindow(this);
ptrTestDlg ->ShowWindow(SW_SHOW);
点击ok按钮后hide掉然后show主窗口,但现在奇怪的是hide掉以后好像主窗口失去了焦点,点击鼠标没有任何反映,然后点击其他\程序,或者点击任务栏,这是点击主窗口,就可以用了,不知道什么原因,也没做什么其他处理啊。

16 个解决方案

#1


OK按钮内部的代码,不能使用OnOk函数必须使用消息传递让ptrTestDlg的父窗口处理

#2


用SetForegroundWindow和SetFocus函数试一试

#3


在ok处理函数中向ptrTestDlg的父窗口发消息,在ptrTestDlg的父窗口中处理后再向MainDlg发消息处理的,是这样处理有问题吗?

#4


SetForegroundWindow,SetFocus,Invalidate,SetActiveWindow我都试了,不行,郁闷

#5


昨天想了一天也没想出来是为什么,郁闷啊,debug时又没什么问题,搞晕了

#6


随便建一个对话框程序,然后用一个按钮,在按钮里弹出一个新窗口,不会有你说的情况出现,

如果你的新窗口只是一个普通的窗口的,
那么问题应该是出在你弹出窗口的时机,以及主窗口上,你的主窗口是什么样的,你的主窗口上有没有其它的莫名其妙的窗口等等

#7


IsTopParentActive()返回值是什么意思?我看了一下我的返回值是0

#8


google没搜到,各位用过吗?

#9


汗,MS根本没有提供过IsTopParentActive这个API。楼主用的是谁实现的函数?

#10



BOOL CWnd::IsTopParentActive() const
{
ASSERT(m_hWnd != NULL);
ASSERT_VALID(this);

return CWnd::GetForegroundWindow() ==
GetTopLevelParent()->GetLastActivePopup();
}

用VC在你的VC目录(...\MICROSOFT VISUAL STUDIO\VC98\MFC)下搜索IsTopParentActive就能找到源码

#11


CWnd里面有这个函数啊,我的新窗口就是一个普通的窗口。我创建了一个主窗口然后创建了两个Child类型的子窗口,而TestDlg就是一个Login对话框,属性与主对话框相同,在显示login以及隐藏login的时候,主窗口肯定只有一个

#12


焦点不对吧
有两种方法可以获得焦点: 
  1.打开资源编辑器中的对话框模板,在Layout菜单中选择TabOrder选项。按对话框中的控制来重新排列这些控制的tab顺序。 
  2.用文本编辑器(比如:记事本等)直接打开*.rc文件,会看到各个控件资源以文本的方式按加入时的顺序排列如下: 
  BEGIN 
   EDITTEXT IDC_EDIT 1,20,19,86,21,ES_ AUTOHSCROLL 
   COMBOBOX IDC_COMBO 1,15,57,92, 18,CBS_DROPDOWN|CBS_SORT|WS_ VSCROLL|WS_TABSTOP 
  END 
  排在前面的(比如本例的EDITTEXT)就是首先获得焦点的空间,只要改变其排列顺序即可。

#13


问题是我现在点对话框的任何位置都没反映,点关闭按钮都不行,鼠标必须点程序外其他地方然后才可以,疑惑

#14


还有一个奇怪的问题,我在在该对话框加了一个按钮test,一个Static控件test static,结果字都显示不出来,我已经updatedata了,奇怪

#15


程序内部附值,一般应该是updatedata(FALSE);

#16


把TestDlg改为无模式对话框,
把ptrTestDlg = new TestDlg(this);中的this 去掉,然后试

#1


OK按钮内部的代码,不能使用OnOk函数必须使用消息传递让ptrTestDlg的父窗口处理

#2


用SetForegroundWindow和SetFocus函数试一试

#3


在ok处理函数中向ptrTestDlg的父窗口发消息,在ptrTestDlg的父窗口中处理后再向MainDlg发消息处理的,是这样处理有问题吗?

#4


SetForegroundWindow,SetFocus,Invalidate,SetActiveWindow我都试了,不行,郁闷

#5


昨天想了一天也没想出来是为什么,郁闷啊,debug时又没什么问题,搞晕了

#6


随便建一个对话框程序,然后用一个按钮,在按钮里弹出一个新窗口,不会有你说的情况出现,

如果你的新窗口只是一个普通的窗口的,
那么问题应该是出在你弹出窗口的时机,以及主窗口上,你的主窗口是什么样的,你的主窗口上有没有其它的莫名其妙的窗口等等

#7


IsTopParentActive()返回值是什么意思?我看了一下我的返回值是0

#8


google没搜到,各位用过吗?

#9


汗,MS根本没有提供过IsTopParentActive这个API。楼主用的是谁实现的函数?

#10



BOOL CWnd::IsTopParentActive() const
{
ASSERT(m_hWnd != NULL);
ASSERT_VALID(this);

return CWnd::GetForegroundWindow() ==
GetTopLevelParent()->GetLastActivePopup();
}

用VC在你的VC目录(...\MICROSOFT VISUAL STUDIO\VC98\MFC)下搜索IsTopParentActive就能找到源码

#11


CWnd里面有这个函数啊,我的新窗口就是一个普通的窗口。我创建了一个主窗口然后创建了两个Child类型的子窗口,而TestDlg就是一个Login对话框,属性与主对话框相同,在显示login以及隐藏login的时候,主窗口肯定只有一个

#12


焦点不对吧
有两种方法可以获得焦点: 
  1.打开资源编辑器中的对话框模板,在Layout菜单中选择TabOrder选项。按对话框中的控制来重新排列这些控制的tab顺序。 
  2.用文本编辑器(比如:记事本等)直接打开*.rc文件,会看到各个控件资源以文本的方式按加入时的顺序排列如下: 
  BEGIN 
   EDITTEXT IDC_EDIT 1,20,19,86,21,ES_ AUTOHSCROLL 
   COMBOBOX IDC_COMBO 1,15,57,92, 18,CBS_DROPDOWN|CBS_SORT|WS_ VSCROLL|WS_TABSTOP 
  END 
  排在前面的(比如本例的EDITTEXT)就是首先获得焦点的空间,只要改变其排列顺序即可。

#13


问题是我现在点对话框的任何位置都没反映,点关闭按钮都不行,鼠标必须点程序外其他地方然后才可以,疑惑

#14


还有一个奇怪的问题,我在在该对话框加了一个按钮test,一个Static控件test static,结果字都显示不出来,我已经updatedata了,奇怪

#15


程序内部附值,一般应该是updatedata(FALSE);

#16


把TestDlg改为无模式对话框,
把ptrTestDlg = new TestDlg(this);中的this 去掉,然后试