两个程序之间切换,到底发生了什么事呢?(100分)

  • 主题发起人 主题发起人 aimingoo
  • 开始时间 开始时间
A

aimingoo

Unregistered / Unconfirmed
GUEST, unregistred user!
有一个程序,从A程序切换到B程序,再切换回来。A程序的主界面就变了。
应该是有什么地方没有刷新的缘故。

我想知道在程序切换时,到底发生了什么事。最重要的是,系统向A程序传
了那些Windows Message,也就是窗体消息。如果知道了这些,我想我就可
以在A程序中控制界面显示了。

用过WinSight32来查,但在我的系统中,一用它就当机。 :(
谁能帮帮忙?
 
这种情况通常是A程序正在进行独占方式的处理,比如循环,某个控件的方法等。
比如:for i:=x to y do ...
tquery.open 等。
这时候程序正处于某个过程的某个语句上,而窗体的刷新在这个时候是不能进行的(特指单
进程而言!)
对于循环:
for i:=x to y do
begin
....
application.processmessage;
end;
对于耗时的单语句,可以放在一个单独的进程中进行!
 
hhzh426,这种情况我知道,但我说的不是这个意思。
我的程序中出现的不是这种问题。

我想知道,当两个窗体切换的时候,那些事件被触发了,或者那些WM_Message类
消息被发出了,我可以截到他们,并重画窗体。
 
消息没有被process!!!
 
我也想知道
 
agree with hhzh426
 
在一本c++的书上看过,我记不大清楚了。有时间帮你找找!
 
可能是程序不是多线成,而是 win16 那中独占式程序,一但切换如果没有
让出内存窗体就死掉了
 
哎,大家都没有明白我的意思。:(

我在一个程序中需要用一个透明的PageControl/TabSheet组件,于是,我用下面的代码来
产生这种效果:
procedure TMainForm.FormCreate(Sender: TObject);
begin
//使透明
SetWindowLong(PageControl.Handle, GWL_EXSTYLE, WS_EX_TRANSPARENT);
for i := 0 to PageControl.PageCount-1 do
SetWindowLong(PageControl.Pages.Handle, GWL_EXSTYLE, WS_EX_TRANSPARENT);
end;
并在窗体中加入一个设置为Client的TImage组件作为背景图。

很好,上面这些工作的确产生了透明效果。但是,我在各个TabSheet中切换时,却发现
透明效果不能维持。 :(
我尝试在两个进程之间,用alt + Tab键切换。回到原来的程序时,透明效果又出现了。
于是,我判定是进程/主窗体之间切换时,一定发生了什么WM_Message,使得当前程序的
窗体被重绘,从而使透明效果再次显示。

所以我问大家到底有什么消息/事件发生,我重新用SendMessage(HWND, ...)发一遍,就
应该可以解决问题了。
 
你可以在切换回来时进行重绘
 
invalidateRect(Handle,APRect,True)
//Handle是form的Handle
把pagecontrol或tabsheet的rect传过去,
 
唉,昨天在笔记本没电的情况下才看到这个贴,
只好匆忙写了几句,思路虽然对,没实际意义,见笑了。

“正确答案”如下:

procedure TForm1.PageControl1Change(Sender: TObject);
begin
invalidate;
PageControl1.invalidate;
end;

而“到底有什么消息/事件发生”也就是CM_INVALIDATE消息。 :-)
 
我现在也在做一个透明的东西
用 温柔一刀 的方法对 PageControl 是适用的。
我已经试过了。

to aimingoo:
为什么用SetWindowLong对TreeView不管用?
(不好意思,添麻烦了!)
 
>>上次进入: 00-11-18 11:41:17

竟然没回音??
 
温柔一刀,不用急了。分已经在你手里攥着了。哈哈。

另外,我不明白,为什么用invalidateRect() API的方法就不可以呢?
事实上,我在提这个问题之前就用过invalidateRect(),不成功。:(

xushucheng,我没有在TreeView上试过。但可能是因为TreeView的repaint
方法被重载过,而且没有考虑Windows的GWL_EXSTYLE扩展类型风格的缘故。
 
我想是因为invalidateRect并不导致PageControl重绘
--它只能通知form重绘被invalidate的区域,可是上面的pagecontrol就“没人通知”了。
不信你可以试试,把PageControl1.invalidate;这一句去掉,只保留invalidate;,
则效果和invalidateRect(Handle,0,True)的效果一样,
--整个form被重画了,而PageControl1“没了”。

另外,你的form允许resize吗?如果允许,建议你改成不允许,
否则你resize一下看看效果?
 
接受答案了.
 
有空上来了?又有什么心得,交流一下吧,
光“接受答案”,大家都没有获得新的提高嘛!

先行谢过... :-)
 
后退
顶部