Текущий архив: 2006.01.08;
Скачать: CL | DM;
ВнизСворачивание вторичной формы на панель задач Найти похожие ветки
← →
uli (2005-05-17 08:45) [0]Уважаемые мастера! Подскажите, как можно сделать, чтобы вторичная форма сворачивалась не в угол экрана, а на панель задач.
← →
Thaddy (2005-05-17 10:05) [1]var
point:Tpoint;
begin
Point:=form1.panel.client2screen(makepoint(panel.left,panel.top);
Form2.setposition(Point.x,point,y);
← →
uli (2005-05-19 08:28) [2]То есть на форме должна лежать Panel? Он у меня на нее ругается...
← →
Uli (2005-05-19 08:29) [3]Или надо подключить дополнительный модуль?
← →
Uli (2005-05-19 10:08) [4]Буду очень благодарна за небольшой рабочий пример, так как из данного отрывка кода ничего не могу понять.
← →
Thaddy (2005-05-19 20:50) [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.
← →
ECM © (2005-05-20 12:38) [6]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
← →
fghfg (2005-05-20 13:24) [7]> Уважаемые мастера! Подскажите, как можно сделать, чтобы
> вторичная форма сворачивалась не в угол экрана, а на панель
> задач.
я не мастер, но, имхо, достаточно просто обнулить св-во parent:
SetParent (Form2.Handle, 0).
← →
fghfg (2005-05-20 13:27) [8]...той формы, которая не хочет сворачиваться. :)
← →
ECM © (2005-05-20 16:59) [9]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;
Страницы: 1 вся ветка
Текущий архив: 2006.01.08;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.007 c