Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как скрыть кнопки на панели задач?

20K
13 декабря 2010 года
HowlingWind
32 / / 13.01.2008
Всем привет!

Есть главная форма, при нажатии на кнопку модально открывает 2 форма, 2 форма порождает 3 форму. Все работает нормально. Проблема проявляется при вызове форм через COM. В этом случае каждая форма отображается на панели задач. Собственно вопрос - как избежать появления вкладок на панели задач? Я хочу чтобы отображалась только главное окно программы. Работаю на Delphi XE.
19K
14 декабря 2010 года
Alegun
269 / / 10.09.2010
Добвресу, не знаю правда, что такое Delphi XE и с чем его едят, но предполагаю, что при вызове окна через СОМ происходит тоже самое, что и при вызове формы из dll - создаётся новый объект с дескриптором, отличающимся от хэндла основного приложения. Что бы этого не происходило, нужно передавать (при создании формы) хэндл форме, а при уничтожении - возвращать его обратно. Вот кусочек кода библиотеки для D7:
Код:
type
  TForm1 = class(TForm)
 
var
  Form1  : TForm1;
  OldHandle  : THandle;
 
  procedure LoForm(aHandle: THandle); Export; StdCall;
  procedure FreeForm; Export; StdCall;
 
  implementation
 
{$R *.dfm}
 
procedure LoForm(aHandle: THandle);
 begin
   OldHandle := Application.Handle;
   Application.Handle := aHandle;
   Form1:= TForm1.Create(Application);
 end;
 
procedure FreeForm;
begin
Application.Handle := OldHandle;
Form1.Free;
end;


Можно так же попробовать при создании формы, принудительно
изменять стиль отображения окна с WS_EX_APPWINDOW на WS_Ex_ToolWindow:
Код:
type
TForm1 = class(TForm)
 
private
{ Private declarations }
procedure CreateParams(VAR Params: TCreateParams);
override;
 
...
 
procedure TForm1.CreateParams(VAR Params: TCreateParams);
begin
Inherited
CreateParams(Params);
WITH Params DO
ExStyle := ExStyle OR WS_Ex_ToolWindow;
end;

Надеюсь, это поможет.
20K
14 декабря 2010 года
HowlingWind
32 / / 13.01.2008
Изменение стиля окна помогло. Но появилась другая проблема - при нажатии Alt + Tab дочерние формы скрываются за главной:( При этом главная форма остается заблокированной.
19K
15 декабря 2010 года
Alegun
269 / / 10.09.2010
Правильно, "дочернее" окно стало модальным, главная форма остаётся заблокированной. В приложении (в данный момент) может быть только одно модально-системное окошко, поэтому нужно использовать функции API (Get)SetSysModalWindow(). Первая возвратит дескриптор модалки, второй можно управлять по своему усмотрению, чтобы завершить показ формы, таким образом передав её хендл. Вот как этим пользоваться:
 
Код:
var
x: word;
begin
x:= GetSysModalWindow(Form1.handle);
SetSysModalWindow(x);
end;

Ещё можно сделать активной главную форму приложения с помощью такой процедуры:
Код:
procedure ShowMainForm;{©Drkb v.3.01 2008}
var
hWnd,hCurWnd,dwThreadID,dwCurThreadID: THandle;
OldTimeOut: DWORD;
AResult: boolean;
begin
ShowWindow(Application.Handle,SW_RESTORE);
Application.MainForm.Visible := true;   // Показываем главную форму
hWnd:= Application.Handle;  // Ставим нашу форму впереди всех окон
SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT,0,@OldTimeOut,0);
SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT,0,Pointer(0),0);
SetWindowPos(hWnd, HWND_TOPMOST,0,0,0,0,SWP_NOMOVE or SWP_NOSIZE);
hCurWnd:= GetForegroundWindow;
AResult:= false;
While not AResult do
begin
   dwThreadID:= GetCurrentThreadId;
   dwCurThreadID:= GetWindowThreadProcessId(hCurWnd);
   AttachThreadInput(dwThreadID,dwCurThreadID,true);
   AResult:= SetForegroundWindow(hWnd);
   AttachThreadInput(dwThreadID,dwCurThreadID,false);
end;
SetWindowPos(hWnd,HWND_NOTOPMOST,0,0,0,0,SWP_NOMOVE or SWP_NOSIZE);
SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT,0,Pointer(OldTimeOut), 0);
end;

Или наоборот, заставить её находиться всегда "в тылу":
Код:
type
TForm1 = class(TForm)
   procedure WndProc (Var Message: TMessage); override;
private
   { Private declarations }
public
   { Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.WndProc (Var Message: TMessage);
begin
case Message.Msg of                        
 WM_WINDOWPOSCHANGING:
 PWindowPos(Message.LParam)^.hwndInsertAfter:= HWND_BOTTOM;
end;
  inherited;
end; //Автор: antonn

Играясь с параметрами типа HWND_(BOTTOM/TOPMOST) можно добиться очень интересных результатов:-)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог