![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сворачивание вторичной формы на панель задач [Delphi, KOL, Windows]
uli © (2005-05-17 08:45:00)Уважаемые мастера! Подскажите, как можно сделать, чтобы вторичная форма сворачивалась не в угол экрана, а на панель задач.
ECM (2005-05-20 16:59:00) [1]fghfg (20.05.05 13:24) [7]
имхо, достаточно просто обнулить св-во parent:
SetParent (Form2.Handle, 0).
Да...это тоже работает...но, имхо, WS_EX_APPWINDOW работает оперативнее (по краней мере во время OnMinimize SetParent(..,0) не приводит к появлению кнопки на TaskBar сразу - надо еще ткнуть мышью в кнопку основного окна (смотрел на ХР)). Да и Parent может использоваться где-нибудь в программе...
...Восстановление Parent-а - через SetParent опять же не позволяет убрать кнопку с TaskBar когда она уже не нужна...
Из "спортивного интереса", может кому пригодится, следующий код сворачивает вторичное окно в TaskBar и убирает его из TaskBar-а при восстановлении:
uses ActiveX;
const
CLSID_TaskBarList: TCLSID = '{56FDF344-FD6D-11d0-958A-006097C9A090}';
IID_ITaskBarList: TGUID = '{56FDF342-FD6D-11d0-958A-006097C9A090}';
type
ITaskBarList = interface(IUnknown)
['{56FDF342-FD6D-11d0-958A-006097C9A090}']
function HrInit(): HResult; stdcall;
function AddTab(WND: HWND): HResult; stdcall;
function DeleteTab(WND: HWND): HResult; stdcall;
function ActivateTab(WND: HWND): HResult; stdcall;
function SetActiveAlt(WND: HWND): HResult; stdcall;
end;
...
function TForm2.KOLForm1Message(var Msg: tagMSG;
var Rslt: Integer): Boolean;
var
cmdShow: Integer;
iTBList: ITaskBarList;
begin
Result := FALSE;
if Msg.message = WM_SYSCOMMAND then begin
Case Msg.wParam of
SC_MINIMIZE,SC_MAXIMIZE,SC_RESTORE: begin
// SetParent(Form.Handle,0);
Form.ExStyle := Form.ExStyle or WS_EX_APPWINDOW;
if Msg.wParam = SC_MAXIMIZE then cmdShow := SW_MAXIMIZE
else if Msg.wParam = SC_RESTORE then cmdShow := SW_RESTORE
else cmdShow := SW_MINIMIZE;
ShowWindow(Form.Handle,cmdShow);
CoInitialize(nil);
CoCreateInstance(CLSID_TaskBarList,nil,CLSCTX_ALL,IID_ITaskBarList,iTBList);
if Assigned(iTBList) then begin
if Msg.wParam = SC_MINIMIZE then iTBList.AddTab(Form.Handle)
else iTBList.DeleteTab(Form.Handle);
iTBList := nil;
end;
CoUninitialize();
end;
end;
end;
end;
fghfg (2005-05-20 13:27:00) [2]...той формы, которая не хочет сворачиваться. :)
fghfg (2005-05-20 13:24:00) [3]> Уважаемые мастера! Подскажите, как можно сделать, чтобы
> вторичная форма сворачивалась не в угол экрана, а на панель
> задач.
я не мастер, но, имхо, достаточно просто обнулить св-во parent:
SetParent (Form2.Handle, 0).
ECM (2005-05-20 12:38:00) [4]function TForm2.KOLForm1Message(var Msg: tagMSG;
var Rslt: Integer): Boolean;
begin
Result := FALSE;
if Msg.message = WM_SYSCOMMAND then begin
if Msg.wParam = SC_MINIMIZE then begin
Form.ExStyle := Form.ExStyle or WS_EX_APPWINDOW;
ShowWindow(Form.Handle,SW_HIDE);
end;
end;
end
....Только убрать его сбросом WS_EX_APPWINDOW почему-то не удается...:(
Наверное только через ITaskBarList->DeleteTab
Thaddy (2005-05-19 20:50:00) [5]And in your email....
{
program Projectfrom;
Kol,
Unitfrm1 in 'Unitfrm1.pas';
begin
NewForm1( Form1, applet);
Run(Applet);
end.
*********************************************
}
unit Unitfrm1;
interface
uses
Windows, Messages, Kol;
type
PForm1=^TForm1;
TForm1=object(Tobj)
Form:pControl;
Pnl:Pcontrol;
public
end;
PForm2=^TForm2;
TForm2=object(Tobj)
Form:pControl;
public
end;
procedure NewForm1( var Result: PForm1; AParent: PControl );
var
Form1:pForm1;
Form2:pForm2;
implementation
procedure NewForm2( var Result: PForm2; AParent: PControl );
var
point:Tpoint;
begin
New(Result,Create);
with Result^ do
begin
Form:= NewForm(Applet,'small form').SetSize(100,300);
Form.Add2AutoFree(Result);
form.color:=clWhite;
form.exStyle:=ws_ex_toolwindow;
form.StayOnTop:=true;
end;
end;
procedure NewForm1( var Result: PForm1; AParent: PControl );
var
Point:TPoint;
begin
New(Result,Create);
with Result^ do
begin
Applet:=Newapplet('Test');
Form:= NewForm(Applet,'Main Form').SetSize(400,400).centeronparent.Tabulate;
Form.Add2AutoFree(Result);
Pnl:=Newpanel(form,esRaised).setalign(caRight);
Newform2(Form2,Applet);
point:=form1.form.Client2screen(Makepoint(pnl.left,pnl.top));
Form2.form.setposition(Point.x,point.y);
end;
end;
end.
Uli (2005-05-19 10:08:00) [6]Буду очень благодарна за небольшой рабочий пример, так как из данного отрывка кода ничего не могу понять.
Uli (2005-05-19 08:29:00) [7]Или надо подключить дополнительный модуль?
uli (2005-05-19 08:28:00) [8]То есть на форме должна лежать Panel? Он у меня на нее ругается...
Thaddy (2005-05-17 10:05:00) [9]var
point:Tpoint;
begin
Point:=form1.panel.client2screen(makepoint(panel.left,panel.top);
Form2.setposition(Point.x,point,y);