![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Не могу сделать форму похожую на панель инструментов Windows, т.е.:
1. всегда была сверху (это реализуемо) 2. для других приложений экран как бы уменьшается на высоту этой формы (она у меня расположена по всему верхнему краю) и их заголовки не закрываются моей формой. |
|
#2
|
||||
|
||||
|
|
|
#3
|
|||
|
|||
|
NumLock, большое спасибо за ссылку. Но ты бы не мог объяснить как этим воспользоваться в delphi 7. Извини за тупизм.
|
|
#4
|
||||
|
||||
|
Код:
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
|
|||
|
|||
|
У меня уже готовая форма form1.
В событии create для нее я добавил такой код: Цитата:
Окно не устанавливается в область выделенную для панели. Не подскажете где я недопонимаю. |
|
#6
|
||||
|
||||
|
На правах штатного экстрасенса предполагаю, что это может быть из-за того, что стандартная форма создаётся со стандартными параметрами, когда в коде тов. NumLock присутствует фрагмент:
Код:
CreateWindowEx(WS_EX_CLIENTEDGE, ... |
|
#7
|
|||
|
|||
|
Все всем спасибо! Задачу решил. Проблема была вызвана тем, что в коде использовалась установка окна в позицию 0,0, а поскольку размеры активного окна уже уменьшились - окно перемещалось в доступную для других окон область, т.е. ниже чем область панели.
Еще раз большое спасибо экспертам! Сколько проблем люди избежали бы, будь они внимательнее. Например: проверяли наличие туалетной бумаги до, а не после. ![]() |
| Этот пользователь сказал Спасибо AlexSky771 за это полезное сообщение: | ||
Gareth (25.10.2014)
| ||