Як прибрати рамку біля вікна лише візуально
Мені необхідно у своїй формі самому малювати СВІ контроли, включаючи рамку та заголовок. Але ось з реалізацією з стопорнувся. Якщо у форми виставити 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); для i:=0 до GetMenuItemCount(m)-1 до DeleteMenu(m,0,MF_BYPOSITION); end;
function TForm1.KOLApplet1Message(var Msg: tagMSG; var Rslt: Integer): Boolean; const TIMER_ >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 або TPM_TopAlign, CPos.X, CPos.Y, 0, form.Handle, nil); // Popupmenu1.Popup(CPos.X, CPos.Y);//Можна прикрутити своє меню 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 або WS_THICKFRAME або WS_DLGFRAME або WS_CAPTION > або WS_MINIMIZEBOX або WS_MAXIMIZEBOX) > ;викинути WS_THICKFRAME