Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Рабочий стол
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 05.12.2011, 14:14
AlexSky771 AlexSky771 вне форума
Прохожий
 
Регистрация: 05.12.2011
Сообщения: 4
Репутация: 10
По умолчанию Форма как панель инструментов Windows

Не могу сделать форму похожую на панель инструментов Windows, т.е.:
1. всегда была сверху (это реализуемо)
2. для других приложений экран как бы уменьшается на высоту этой формы (она у меня расположена по всему верхнему краю) и их заголовки не закрываются моей формой.
Ответить с цитированием
  #2  
Старый 05.12.2011, 14:20
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

SHAppBarMessage
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #3  
Старый 06.12.2011, 05:56
AlexSky771 AlexSky771 вне форума
Прохожий
 
Регистрация: 05.12.2011
Сообщения: 4
Репутация: 10
По умолчанию

NumLock, большое спасибо за ссылку. Но ты бы не мог объяснить как этим воспользоваться в delphi 7. Извини за тупизм.
Ответить с цитированием
  #4  
Старый 06.12.2011, 11:15
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Код:
program CreateWindowAPI;

uses
  ShellAPI, Windows, Messages;

var
  AWndClass: WNDCLASS;
  AWnd: HWND;
  AMsg: TMsg;
  AppBarData: TAppBarData;

function Rect(Left, Top, Right, Bottom: Integer): TRect;
begin
  Result.Left := Left;
  Result.Top := Top;
  Result.Bottom := Bottom;
  Result.Right := Right;
end;

function WindowProc(AWnd: HWND; Msg: Integer;
  wParam: WPARAM; lParam: LPARAM): Longint; stdcall;
begin
  case Msg of
    WM_CREATE: begin
      ZeroMemory(@AppBarData, SizeOf(TAppBarData));
      AppBarData.cbSize:=SizeOf(TAppBarData);
      AppBarData.hWnd:=AWnd;
      AppBarData.uCallbackMessage:=WM_APP+$101;
      SHAppBarMessage(ABM_NEW, AppBarData);

      AppBarData.uEdge:=ABE_TOP;
      AppBarData.rc:=Rect(0, 0,
        GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN));
      SHAppBarMessage(ABM_QUERYPOS, AppBarData);

      AppBarData.rc.Bottom:=AppBarData.rc.Top+100;
      SHAppBarMessage(ABM_SETPOS, AppBarData);

      MoveWindow(AWnd,
        AppBarData.rc.Left,
        AppBarData.rc.Top,
        AppBarData.rc.Right-AppBarData.rc.Left,
        AppBarData.rc.Bottom-AppBarData.rc.Top, False);

      Result:=0;
    end;
    WM_DESTROY: begin
      SHAppBarMessage(ABM_REMOVE, AppBarData);
      Result:=0;
    end;
    WM_CLOSE: begin
      PostQuitMessage(0);
      Result:=0;
    end;
    else Result:=DefWindowProc(AWnd, Msg, wParam, lParam);
  end
end;

begin
  AWndClass.Style:=CS_HREDRAW or CS_VREDRAW;
  AWndClass.lpfnWndProc:=@WindowProc;
  AWndClass.cbClsExtra:=0;
  AWndClass.cbWndExtra:=0;
  AWndClass.hInstance:=HInstance;
  AWndClass.hIcon:=LoadIcon(0, IDI_APPLICATION);
  AWndClass.hCursor:=LoadCursor(0, IDC_ARROW);
  AWndClass.hbrBackground:=GetStockObject(WHITE_BRUSH);
  AWndClass.lpszMenuName:=nil;
  AWndClass.lpszClassName:='TWINAPIFORM';
  RegisterClass(AWndClass);
  AWnd:=CreateWindowEx(
    WS_EX_CLIENTEDGE,
    AWndClass.lpszClassName,
    AWndClass.lpszClassName,
    WS_VISIBLE or
    WS_SYSMENU or WS_POPUP,
    Integer(CW_USEDEFAULT),
    Integer(CW_USEDEFAULT),
    Integer(CW_USEDEFAULT),
    Integer(CW_USEDEFAULT),
    0, 0,
    HInstance,
    nil);
  UpdateWindow(AWnd);
  while GetMessage(AMsg, 0, 0, 0) do begin
    TranslateMessage(AMsg);
    DispatchMessage(AMsg);
  end;
  DestroyWindow(AWnd);
  UnregisterClass(AWndClass.lpszClassName, HInstance);
  ExitProcess(0);
end.

http://data.cod.ru/134679
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #5  
Старый 07.12.2011, 05:34
AlexSky771 AlexSky771 вне форума
Прохожий
 
Регистрация: 05.12.2011
Сообщения: 4
Репутация: 10
По умолчанию

У меня уже готовая форма form1.
В событии create для нее я добавил такой код:
Цитата:
ZeroMemory(@AppBarData, SizeOf(TAppBarData));
AppBarData.cbSize:=SizeOf(TAppBarData);
AppBarData.hWnd:=Form1.Handle;
AppBarData.uCallbackMessage:=WM_APP+$101;
SHAppBarMessage(ABM_NEW, AppBarData);

AppBarData.uEdge:=ABE_TOP;
AppBarData.rc:=Rect(0, 0,
GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN));
SHAppBarMessage(ABM_QUERYPOS, AppBarData);

AppBarData.rc.Bottom:=AppBarData.rc.Top+form1.Heig ht;
SHAppBarMessage(ABM_SETPOS, AppBarData);

MoveWindow(Form1.Handle,AppBarData.rc.Left,
AppBarData.rc.Top,
AppBarData.rc.Right-AppBarData.rc.Left,
AppBarData.rc.Bottom-AppBarData.rc.Top, False);

Окно не устанавливается в область выделенную для панели.
Не подскажете где я недопонимаю.
Ответить с цитированием
  #6  
Старый 07.12.2011, 05:40
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

На правах штатного экстрасенса предполагаю, что это может быть из-за того, что стандартная форма создаётся со стандартными параметрами, когда в коде тов. NumLock присутствует фрагмент:
Код:
CreateWindowEx(WS_EX_CLIENTEDGE, ...
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #7  
Старый 07.12.2011, 07:28
AlexSky771 AlexSky771 вне форума
Прохожий
 
Регистрация: 05.12.2011
Сообщения: 4
Репутация: 10
По умолчанию

Все всем спасибо! Задачу решил. Проблема была вызвана тем, что в коде использовалась установка окна в позицию 0,0, а поскольку размеры активного окна уже уменьшились - окно перемещалось в доступную для других окон область, т.е. ниже чем область панели.

Еще раз большое спасибо экспертам!

Сколько проблем люди избежали бы, будь они внимательнее. Например: проверяли наличие туалетной бумаги до, а не после.
Ответить с цитированием
Этот пользователь сказал Спасибо AlexSky771 за это полезное сообщение:
Gareth (25.10.2014)
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 02:45.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter