-
Мне необходимо в своей форме самому рисовать СВЕ контролы включая рамку и заголовок. Но вот с реализацией с стопорнулся. Если у формы выставить BorderStyle в fbsNone, то рамки нету ВООБЩЕ + нету выпадающей менюшки со списком операций над окном (при клике правой мышкой по кнопке приложения на панели задач.
Мне необходимо сделать так, что бы: 1) у формы отсутствовали (только визуально) стандартные рамка и заголовок; 2) необходимо самому рисовать заголов; 3) необходимо, что бы на рисуемом мною заголовке работали перетаскивание и клик правой кнопкой мыши.
Как это можно реализовать?
-
обрабатывай WM_NCPAINT и WM_HITTEST
-
А как? Как их словить, я знаю, но вот что дальше делать?
-
Ладно с рамкой разобрался - рисую вручную + сам сдела перетаскивание окна (через ВинАПИ) и изменение его размера (свой код). Но - как сделать так, что бы при клике правой кнопкой мыши по моему контролу появлялось выпадающее меню (как будто щелкнул по заголовку простого окна)? И как добавить такую же менюшку при клике по значку на панели задач (не в трее)? У меня ведь у формы выставлено Form.borderStyle=fbsNone
-
> как добавить такую же менюшку при клике по значку на панели > задач
по-моему, тут applet при делах... эт его менюшка (как и кнопка) в панели задач
-
я в смысле - добавить апплет
-
Добавил - эффекта нету. Я же сказал, что заголовка окна у меня нету, как и рамки вокруг окна. При клике правой кнопкой мыши по приложению на панели задач не выскакивает менюшка (для операций над окном), а мне она нужна, так же, как и такаяже при клике на одном из контролов на форме (выполняющем роль заголовка формы). Говорю сразу - стандартное окно меня не устраивает, тк окно ПОЛНОСТЬЮ рисуется моим кодом (оформление окна).
-
> не выскакивает менюшка (для операций над окном), а мне она > нужна
BorderStyle=fbsSingle procedure TForm1.KOLFormFormCreate(Sender: PObj);
var
m:HMENU; i:integer;
begin
form.Style:= form.Style and not (WS_BORDER or WS_THICKFRAME or WS_DLGFRAME or WS_CAPTION
or WS_MINIMIZEBOX or WS_MAXIMIZEBOX);
m:=GetSystemMenu(Applet.Handle,False);
for i:=0 to GetMenuItemCount(m)-1 do
DeleteMenu(m,0,MF_BYPOSITION);
end;
function TForm1.KOLApplet1Message(var Msg: tagMSG;
var Rslt: Integer): Boolean;
const
TIMER_ID = 4321;
var
CPos:TPoint; m:HMENU;
begin
Result:=False;
case msg.message of
WM_INITMENUPOPUP:
if (msg.hwnd=Applet.Handle) then
SetTimer(Applet.Handle,TIMER_ID,10,nil);
WM_TIMER:
if (msg.wParam=TIMER_ID) then
begin
KillTimer(Applet.Handle,msg.wParam);
GetCursorPos(CPos);
m:=GetSystemMenu(form.Handle,False);
TrackPopupMenu(m, TPM_LeftAlign or TPM_TopAlign, CPos.X, CPos.Y, 0, form.Handle, nil);
end;
WM_COMMAND:
if (msg.hwnd=Form.Handle) then
case msg.wParam of
SC_RESTORE,SC_CLOSE,SC_MINIMIZE,SC_MAXIMIZE,SC_MOVE,SC_SIZE:
Form.Perform(WM_SYSCOMMAND,msg.wParam,Msg.lParam);
end;
end;
end;
-
Спасибо, попробуем...
-
Помогло! :) Спасибо большое!
Но, если можно, то еще один вопрос - как менять размер окна (с изменением курсора на соотв.), если у меня нету бордюра? Я пока сделал это своим кодом, перехватывая мышь, но у этого метода есть недостаток - если пользователь слишком резко перетащит мышь, то она уходит из фокуса окна :( Нету ли решения этой пролблемы без лишнего кода, а "обманом" Виндоус (наподобие высшенаходящегося кода)?
-
Из флагов > (WS_BORDER or WS_THICKFRAME or WS_DLGFRAME or WS_CAPTION > or WS_MINIMIZEBOX or WS_MAXIMIZEBOX) > ;
выкинуть WS_THICKFRAME
|