如何使form的名稱置於視窗工作列 |
尚未結案
|
sam_000
一般會員 發表:27 回覆:47 積分:14 註冊:2003-09-15 發送簡訊給我 |
|
hagar
版主 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
|
Zard
尊榮會員 發表:24 回覆:396 積分:539 註冊:2003-11-26 發送簡訊給我 |
給你一個範例, 自己玩玩看
// Project1.dpr program Project1; uses Forms, Windows, Unit1 in 'Unit1.pas' {Form1}, Unit2 in 'Unit2.pas' {Form2}, Unit3 in 'Unit3.pas' {Form3}; {$R *.RES} begin Application.Initialize; Application.ShowMainForm := FALSE; Application.CreateForm(TForm1, Form1); Application.CreateForm(TForm2, Form2); Application.CreateForm(TForm3, Form3); Application.Run; end. ///////////////////////////////////////////////////////////////////// // Unit1.pas unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Unit2, Unit3, StdCtrls, ExtCtrls; type TForm1 = class(TForm) Timer1: TTimer; procedure Timer1Timer(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.Timer1Timer(Sender: TObject); begin if (Assigned(Form2)) and (Assigned(Form3)) then begin Form2.Visible := TRUE; Form3.Visible := TRUE; Timer1.Enabled := FALSE; end; end; procedure TForm1.FormCreate(Sender: TObject); begin Timer1.Interval := 100; Timer1.Enabled := TRUE; end; end. ///////////////////////////////////////////////////////////////////// // Unit2.pas unit Unit2; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm2 = class(TForm) procedure FormActivate(Sender: TObject); private { Private declarations } public { Public declarations } procedure CreateParams(var Params: TCreateParams); override; end; var Form2: TForm2; implementation {$R *.DFM} procedure TForm2.CreateParams(var Params: TCreateParams); begin Inherited; Params.ExStyle := Params.ExStyle WS_EX_APPWINDOW; Params.Caption := 'This is Form2!!'; end; procedure TForm2.FormActivate(Sender: TObject); begin ShowWindow(Application.Handle, SW_HIDE); end; end. ///////////////////////////////////////////////////////////////////// // Uni3.pas unit Unit3; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs; type TForm3 = class(TForm) procedure FormActivate(Sender: TObject); private { Private declarations } public { Public declarations } procedure CreateParams(var Params: TCreateParams); override; end; var Form3: TForm3; implementation {$R *.DFM} procedure TForm3.CreateParams(var Params: TCreateParams); begin Inherited; Params.ExStyle := Params.ExStyle WS_EX_APPWINDOW; Params.Caption := 'This is Form3!!'; end; procedure TForm3.FormActivate(Sender: TObject); begin ShowWindow(Application.Handle, SW_HIDE); end; end. ///////////////////////////////////////////////////////////////////// |
Zard
尊榮會員 發表:24 回覆:396 積分:539 註冊:2003-11-26 發送簡訊給我 |
簡單的說一下原理, 其實Delphi會幫應用程式產生一個隱藏的視窗用來接收和分配Windows Message, 這個隱藏的視窗其實就是TApplication所產生的, 而你所設計的每一個Form其實都在它的掌管之下, 在你所設計的Form當中需要有一個Main Form, 而Delphi為了讓使用者感覺不到隱藏的視窗, 所以對Main Form做了一些特殊處理, 讓它看起來"真的像"是主視窗, 你可以試試若不隱藏Main Form(就是我給你的範例的Form1), 當Form1最小化時, 其它的Form也會跟著最小化, 這就是我隱藏Main Form的原因. 主要程式碼是
Application.ShowMainForm := FALSE;和
ShowWindow(Application.Handle, SW_HIDE); 而其它的就沒什麼了, 我只是把每個子視窗的WS_EX_APPWINDOW打開而已, 打開這個屬性會讓視窗出現在工作列上
|
wameng
版主 發表:31 回覆:1336 積分:1188 註冊:2004-09-16 發送簡訊給我 |
var MyWindowClass: TWndClass = ( style: 0; lpfnWndProc: @DefWindowProc; cbClsExtra: 0; cbWndExtra: 0; hInstance: 0; hIcon: 0; hCursor: 0; hbrBackground: 0; lpszMenuName: nil; lpszClassName: 'Test'); procedure TForm1.Button1Click(Sender: TObject); var FHandle:THandle; begin Windows.RegisterClass(MyWindowClass); FHandle := CreateWindow(MyWindowClass.lpszClassName,'23213', WS_POPUP or WS_CAPTION or WS_CLIPSIBLINGS or WS_Visible or WS_SYSMENU or WS_MINIMIZEBOX, GetSystemMetrics(SM_CXSCREEN) div 2, GetSystemMetrics(SM_CYSCREEN) div 2, 0, 0, 0, 0, HInstance, nil); end;原理如上,進一步請自行斟酌調整。 |
sam_000
一般會員 發表:27 回覆:47 積分:14 註冊:2003-09-15 發送簡訊給我 |
|
Zard
尊榮會員 發表:24 回覆:396 積分:539 註冊:2003-11-26 發送簡訊給我 |
引言: 謝謝版主及前輩的解答,試了版主及前輩的例子,都可以在視窗工作列上看到form名稱,不過還有一個問題是: zard前輩的例子可以在視窗工作列上點選form的名稱,其對應的form就可以得到focus,但如果直接點選form,工作列上相對應的位置無法得到focus, 是否可以點選form時,工作列上相對應的位置得到focus? wameng版主的方法僅能顯示,無法有相對focus的功能?有請前輩及版主再 行幫忙. 謝謝 sam上在TForm2.CreateParams及TForm3.CreateParams中修改如下 procedure TForm2.CreateParams(var Params: TCreateParams); begin Inherited; //加入這行 Params.WndParent := 0; Params.ExStyle := Params.ExStyle WS_EX_APPWINDOW; Params.Caption := 'This is Form2!!'; end; procedure TForm3.CreateParams(var Params: TCreateParams); begin Inherited; //加入這行 Params.WndParent := 0; Params.ExStyle := Params.ExStyle WS_EX_APPWINDOW; Params.Caption := 'This is Form3!!'; end;其它部份的程式碼不變 |
sam_000
一般會員 發表:27 回覆:47 積分:14 註冊:2003-09-15 發送簡訊給我 |
|
Zard
尊榮會員 發表:24 回覆:396 積分:539 註冊:2003-11-26 發送簡訊給我 |
|
sam_000
一般會員 發表:27 回覆:47 積分:14 註冊:2003-09-15 發送簡訊給我 |
|
sam_000
一般會員 發表:27 回覆:47 積分:14 註冊:2003-09-15 發送簡訊給我 |
前輩好
不好意思,這兩天又測試了wameng版主提供的例題,工作列上form名稱前方的圖標總是一個windows飄搖的圖形,我想要把它變更成別的圖形試了許久總是無法達成,可否請版主或前輩再指教,謝謝,我改的程式如下
procedure TForm1.Button1Click(Sender: TObject);
var
FHandle:THandle;
begin
Windows.RegisterClass(MyWindowClass);
FHandle := CreateWindow(MyWindowClass.lpszClassName,'23213',
WS_POPUP or WS_CAPTION or WS_CLIPSIBLINGS or WS_Visible or
WS_SYSMENU or WS_MINIMIZEBOX,
GetSystemMetrics(SM_CXSCREEN) div 2,
GetSystemMetrics(SM_CYSCREEN) div 2, loadicon(application.Handle,IDI_application), 0,
0,
0,
HInstance,
nil);
end;
引言: |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |