对一个Modal窗体的父窗体设置 SetForegroundWindow,父窗体把模式子窗体给挡住了,没有办法做任何操作,程序就假死了~~

BuildError 2007-08-16 05:10:43
对一个Modal窗体的父窗体设置 SetForegroundWindow,父窗体把模式子窗体给挡住了,没有办法做任何操作,程序就假死了~~
-------------------------------
当一个窗体被 ShowModal() 出来以后,在某一线程中有设置其父窗体 SetForegroundWindow() 的操作,这样,虽然父窗体显示在顶层了,但却把模式子窗体给挡住了,结果没有办法做任何操作,程序就假死了~~

模式子窗体可能是“OpenFileDialog、SaveFileDialog 或自定义 Form”

由于父窗体需要不定时的接收线程的通知消息,收到消息时要显示在 Z-Order 顶层,所以有这样的需求,不知大家有什么好方法。

我的理想状态是:父窗体显示为顶层时仍能保持其模式子窗体的 Z-Order 顺序……


^)^ 谢谢大家~~!!
...全文
239 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
BuildError 2007-08-28
  • 打赏
  • 举报
回复
看来是没有更好的办法了,结贴了!
BuildError 2007-08-27
  • 打赏
  • 举报
回复
不好意思,这几天没来CSDN,才看到大家的回复。

BringToFront 之前我也用过,经测试,BringToFront、SetForegroundWindow 及 SetWindowPos(...HWND_TOPMOST...) 的效果是一样的!
kabunhi 2007-08-24
  • 打赏
  • 举报
回复
SetWindowPos( hWnd, HWND_TOPMOST, 0,0,0,0, SWP_NOMOVE|SWP_NOSIZE );
Jim@luckeeinc.com 2007-08-22
  • 打赏
  • 举报
回复
BringToFront函数试一下 看看有没有效果
BuildError 2007-08-21
  • 打赏
  • 举报
回复
推荐的没错,WTL 是确个好东西,看来还是有必要补一补的!
BuildError 2007-08-20
  • 打赏
  • 举报
回复
感谢 Waiting4you 的回复,对于自定义的子窗体来说,这的确是一个不错的方法,但目前父窗体中的大多数 OpenDialog 类的东西不便于改动,所以最好的解决办法希望是在现有基础之上,希望大家有思路的再给出些建议~~
Waiting4you 2007-08-16
  • 打赏
  • 举报
回复
设置Modal窗体的Owner(Windows定义的那种Owner,不是VCL的)为可能会被SetForegroundWindow的窗体.
假设有TForm1和TForm2, TForm1为主Form, TForm2就是用来ShowModal的.

解决方法:
重载TForm2的CreateParams:

void __fastcall TForm2::CreateParams(Controls::TCreateParams ¶ms)
{
TForm::CreateParams(Params);
Params.WndParent=Form1->Handle; // 设置其Owner为Form1,默认是Application的
}

对于TOpenDialog和TSaveDialog, 没有太好的方法, 只好用API GetOpenFileName和GetSaveFileName了,它的OPENFILENAME结构里可以定义Owner.用WTL里的CFileDialog也是一个好主意(偶现在逮谁向谁推荐WTL,嘻)

1,221

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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