Конференция "KOL" » Как убрать рамку у окна только визуально? [Delphi, Windows]
 
  • andreil © (10.07.08 13:30) [0]
    Мне необходимо в своей форме самому рисовать СВЕ контролы включая рамку и заголовок. Но вот с реализацией с стопорнулся.
    Если у формы выставить BorderStyle в fbsNone, то рамки нету ВООБЩЕ + нету выпадающей менюшки со списком операций над окном (при клике правой мышкой по кнопке приложения на панели задач.

    Мне необходимо сделать так, что бы:
     1) у формы отсутствовали (только визуально) стандартные рамка и заголовок;
     2) необходимо самому рисовать заголов;
     3) необходимо, что бы на рисуемом мною заголовке работали перетаскивание и клик правой кнопкой мыши.

    Как это можно реализовать?
  • Rouse_ © (10.07.08 14:12) [1]
    обрабатывай WM_NCPAINT и WM_HITTEST
  • andreil © (10.07.08 15:04) [2]
    А как?
    Как их словить, я знаю, но вот что дальше делать?
  • andreil © (11.07.08 12:38) [3]
    Ладно с рамкой разобрался - рисую вручную + сам сдела перетаскивание окна (через ВинАПИ) и изменение его размера (свой код).
    Но - как сделать так, что бы при клике правой кнопкой мыши по моему контролу появлялось выпадающее меню (как будто щелкнул по заголовку простого окна)? И как добавить такую же менюшку при клике по значку на панели задач (не в трее)? У меня ведь у формы выставлено
    Form.borderStyle=fbsNone

  • =BuckLr= © (11.07.08 21:17) [4]

    > как добавить такую же менюшку при клике по значку на панели
    > задач

    по-моему, тут applet при делах... эт его менюшка (как и кнопка) в панели задач
  • =BuckLr= © (11.07.08 21:18) [5]
    я в смысле - добавить апплет
  • andreil © (12.07.08 11:17) [6]
    Добавил - эффекта нету.
    Я же сказал, что заголовка окна у меня нету, как и рамки вокруг окна.
    При клике правой кнопкой мыши по приложению на панели задач не выскакивает менюшка (для операций над окном), а мне она нужна, так же, как и такаяже при клике на одном из контролов на форме (выполняющем роль заголовка формы).
    Говорю сразу - стандартное окно меня не устраивает, тк окно ПОЛНОСТЬЮ рисуется моим кодом (оформление окна).
  • Compiler © (13.07.08 17:42) [7]

    > не выскакивает менюшка (для операций над окном), а мне она
    > нужна

    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);
      //  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;

  • andreil © (14.07.08 09:57) [8]
    Спасибо, попробуем...
  • andreil © (14.07.08 12:08) [9]
    Помогло! :) Спасибо большое!

    Но, если можно, то еще один вопрос - как менять размер окна (с изменением курсора на соотв.), если у меня нету бордюра? Я пока сделал это своим кодом, перехватывая мышь, но у этого метода есть недостаток - если пользователь слишком резко перетащит мышь, то она уходит из фокуса окна :( Нету ли решения этой пролблемы без лишнего кода, а "обманом" Виндоус (наподобие высшенаходящегося кода)?
  • Compiler © (14.07.08 17:07) [10]
    Из флагов
    > (WS_BORDER or WS_THICKFRAME or WS_DLGFRAME or WS_CAPTION
    >                            or WS_MINIMIZEBOX or WS_MAXIMIZEBOX)
    > ;

    выкинуть WS_THICKFRAME
 
Конференция "KOL" » Как убрать рамку у окна только визуально? [Delphi, Windows]
Есть новые Нет новых   [134431   +15][b:0][p:0.001]