問: 我此刻也搞不懂c 程序最小化到任務欄,甚至認為無法讓CB的主窗口有動畫的結果。 因為在任務條上的按鈕所代表的窗口是窗口,而不是 Project所選定的。假如強行讓動態地, 就會最小化到桌面的左下角去了。
答:
我根基上同意你的觀點。Delphi & BCB 中的的主窗口都是,一般環境下,這個窗口居于屏幕中間,巨細為0x0。底部TaskBar上的按鈕
也是窗口。應用措施的主窗口如TForm1,不是的子窗口,但他不具有的屬性,所以不在TaskBar上發生 Button。當最小化的時候,由于窗口是0x0的,所以假如有動 化會很丟臉,所以VCL中回收這個API使得最小化時 窗口無動化。至于TForm1,因為底部Taskbar上的Button不是 他的,所以VCL中直接HIDE了TForm1。這樣,使得整體上看起來無動化。
可以在VCL的源碼forms.pas中發明如下代碼:
.;
begin
if not (FHandle) then
begin
;
(FHandle);
(FHandle, );
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
if () then (Self);
end;
end;
.Restore;
begin
if (FHandle) then
begin
(FHandle);
(FHandle, );
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
{以下省略}
end;
再看一下 :
(Handle: HWnd; CmdShow: Integer);
var
: Boolean;
begin
:= ;
if then (False); (1)
^^^^^^^^^^^^^^^^^^^^^
(Handle, CmdShow);
if then (True);
end;
再看一下 :
(Value: Boolean);
var
Info: ;
begin
Info.cbSize := SizeOf();
BOOL(Info.) := Value;
(, SizeOf(Info), @Info, 0);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
本來在這里。
end;
讓我們再看一下當TForm1要時他干什么。因為TForm是從
擔任過來的,他本身沒有響應的要領,所以利用的是
的。
.(var Message: );
begin
if (Message.CmdType and $FFF0 = ) and
(. = Self) then
.
^^^^^^^^^^^^^^^^^^^^這一句的執行功效是最小化了,埋沒了
Form1。
else
;
end;
你可以注釋掉以上的(1)句,就會發明最小化時有了動化,但
很丟臉。
哦有一個辦理要領如下:
首先是要用將Form1釀成,但這樣一來舊必需
埋沒窗口。利用(.handle,SW_HIDE);別的,
我們還必需改VCL的源碼。在Forms.pas中,將上面誰人.
注釋掉if,只剩下,這樣,Form1在最小化時舊不會擊活
的窗口了。詳細改變要領如下。
1.拷貝一個Forms.pas到當前目次,從Project Source中刪除缺省的Forms單位c 程序最小化到任務欄,
然后將Forms.pas作為一個新單位插手到Project中。
2.變動Project Source如下:
program ;
uses
windows,
^^^^^^^^^
Unit1 in 'Unit1.pas' {Form1},
Forms in 'forms.pas';
{$R *.RES}
begin
.;
.(TForm1, Form1);
(form1.handle,,(form1.handle,
) or );
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
form1.show;
^^^^^^^^^^^
(.handle,sw_hide);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.Run;
end.
以上打了 ^ 的均為添加的代碼。
3.將Forms.pas中的.變動為如下:
各人也可以試一試不改的結果。
.(var Message: );
begin
{ if (Message.CmdType and $FFF0 = ) and
(. = Self) then
.
else} -------------------------------- 注釋掉了。
;
end;
通過以上步調,根基上舊可以實現動畫縮放了。
BTW:這種要領實現也尚有必然缺陷,那為大峽有更好的要領請提出來
供各人交換。