PDA

View Full Version : حذف Taskbar Button یک فرم در CreateParams



AliReza Vafakhah
دوشنبه 02 خرداد 1390, 00:17 صبح
سلام دوستان

تو برنامه ام مشکلی داشتم که با CreateParams حل شد ولی یه مشکل دیگه واسم ایجاد کرد.

مشکلی که من داشتم نمی تونستم به صورت عادی چندتا از فرم های برنامه رو با خاصیت FormStyle:= fsStayOnTop قرار بدم چون فقط این خاصیت روی فرم اصلی عمل می کنه. به هر حال با CreateParams و تغییر ExStyle فرم های فرزند (همون فرم های که می خواهم OnTop باشند) این مشکل حل شد اما یک مشکل دیگه واسم ایجاد شده.

اگر CreateParams فرم را OnTop کنیم و فرم در BorderStyle برابر با bsToolWindow باشد مشکلی پیش نمیاد اما اگر BorderStyle هر چه به غیر از bsToolWindow باشد در این صورت یک Taskbar باتن (Button ) از فرم ایجاد میشه که جالب اینجاست هرچه در CreateParams این ویژگی برداشته میشه روی فرم هیچ تاثیری نداره.

دوستان یک نمونه از تفاوت نمایش فرم رو در پروژه ضمیمه قرار دادم که منظورم را بیشتر بیان می کند.


procedure CreateParams(var Params: TCreateParams); override;
public
{ Public declarations }
end;

var
Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);
begin
Self.Hide;
end;

procedure TForm2.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
with Params do
begin
{
"" ExStyle:= (ExStyle or WS_EX_TOPMOST) and not WS_EX_APPWINDOW ""
Can not Remove Taskbar Button
}
ExStyle:= ExStyle or WS_EX_TOPMOST;
WndParent:= GetDesktopWindow;
end;
end;

Mask
دوشنبه 02 خرداد 1390, 13:12 عصر
از دلفي چند استفاده ميكنيد؟

AliReza Vafakhah
چهارشنبه 04 خرداد 1390, 15:01 عصر
از دلفی 2010.

Mahmood_M
پنج شنبه 05 خرداد 1390, 14:37 عصر
دلیل ایجاد یک TaskBar Button برای فرم دوم اینه که هندل Parent اون رو هندل Desktop قرار دادید
اگر فقط نیاز دارید که یک فرم رو به بالای همه ی پنجره ها نمایش بدید و در هنگام نمایش اون با فرم اصلی برنامه کاری ندارید ! ، می تونید از تابع SetWindowPos (http://msdn.microsoft.com/en-us/library/ms633545%28v=vs.85%29.aspx) استفاده کنید ولی مشکل این دستور اینه که فرم دوم حتما باید به صورت Modal نمایش داده بشه
یک نمونه :

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Application.MainForm.Show;
end;

procedure TForm2.FormShow(Sender: TObject);
begin
SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE);
Application.MainForm.Hide;
end;


توجه کنید که چون فرم دوم به صورت Modal نمایش داده شده ، به جای Hide باید Close بشه ...

برای اینکه فرم رو از حالت Top بیرون بیارید هم از همون تابع SetWindowPos و با مقدار HWND_NOTOPMOST در پارامتر دوم استفاده کنید :


SetWindowPos(Handle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE);

مقادیر SWP_NOSIZE و SWP_NOMOVE باعث میشن که مقادیر پارامترهای x و y و cx و cy نا دیده گرفته بشه و فرم جاش تغییر نکنه یا تغییر اندازه داده نشه

اگر باز مشکلتون حل نشد ، بگید که دقیقا چه هدفی دارید از نمایش فرم دوم ، موفق باشید ...