Конференция "KOL" » Doubhnuts VCL->KOL [Delphi, Windows]
 
  • RusSun © (27.11.14 19:51) [0]
    Доброе время суток.

    Перевожу пример Doubhnuts.

    Не знаю как правильно перевести события:

    procedure WMNCHITTEST(var Msg: TWMNCHitTest);
         message WM_NCHITTEST;
       procedure WMNCACTIVATE(var Msg: TWMNCACTIVATE);
         message WM_NCACTIVATE;
       procedure WMSetText(var Msg: TWMSetText);
         message WM_SETTEXT;



    ...


    procedure TForm1.WMNCHITTEST(var Msg: TWMNCHitTest);
    begin
     Inherited;
     WITH Msg DO
       WITH ScreenToClient(Point(XPos,YPos)) DO
         IF PtInRegion(rTitleBar, X, Y) AND
          (NOT PtInRect(SB1.BoundsRect, Point(X,Y))) THEN
           Result := htCaption;
    end;

    procedure TForm1.WMNCActivate(var Msg: TWMncActivate);
    begin
     Inherited;
     TitleBar(Msg.Active);
    end;

    procedure TForm1.WMSetText(var Msg: TWMSetText);
    begin
     Inherited;
     TitleBar(Active);
    end;



    Оригинал VCL:
    https://yadi.sk/d/lLndGKOKcyc5M
    Сделал по своему, что получилось на KOL:
    https://yadi.sk/d/UjSIIegkcyc5V
  • RusSun © (27.11.14 19:59) [1]
      procedure WMNCHITTEST(var Msg: TWMNCHitTest);
         message WM_NCHITTEST;
       procedure WMNCACTIVATE(var Msg: TWMNCACTIVATE);
         message WM_NCACTIVATE;
       procedure WMSetText(var Msg: TWMSetText);
         message WM_SETTEXT;


    ...
    procedure TForm1.WMNCHITTEST(var Msg: TWMNCHitTest);
    begin
     Inherited;
     WITH Msg DO
       WITH ScreenToClient(Point(XPos,YPos)) DO
         IF PtInRegion(rTitleBar, X, Y) AND
          (NOT PtInRect(SB1.BoundsRect, Point(X,Y))) THEN
           Result := htCaption;
    end;

    procedure TForm1.WMNCActivate(var Msg: TWMncActivate);
    begin
     Inherited;
     TitleBar(Msg.Active);
    end;

    procedure TForm1.WMSetText(var Msg: TWMSetText);
    begin
     Inherited;
     TitleBar(Active);
    end;

  • ParanoiS © (13.01.15 15:05) [2]
    юзаешь kolform.onmessage и там обрабатываешь
  • RusSun © (17.01.15 07:59) [3]
    Пробую вот так, но похоже без особого эффекта.

    function KOLForm1Message(Sender: PControl;var Msg: tagMSG; var Rslt: Integer): Boolean;
    ...
    function TForm1.KOLForm1Message(Sender: PControl;var Msg: tagMSG;
     var Rslt: Integer): Boolean;
     var p: TPoint;
                 Msg1: TWMNChitTest;
                 Msg2: TWMncActivate;

    begin
     Result := FALSE;
     case Msg.message of
                          WM_NCHITTEST:begin
             getcursorpos(p);
     Inherited;
       WITH Msg1 DO                        Begin
      ScreenToClient(Sender.Handle,p); //WITH ScreenToClient(Point(XPos,YPos)) DO
         IF PtInRegion(rTitleBar, p.X, p.Y) AND (NOT PtInRect(SB1.BoundsRect, p))
          THEN
          Result := htCaption;
                                           end;
                                        end;//end wm_NCHITTEST
                         WM_NCACTIVATE:begin
                             Inherited;//не уверен что это надо добавлять???
                             TForm1.TitleBar(Msg2.Active);
                                       end;
                         WM_SETTEXT:begin
                             Inherited;//не уверен что это надо добавлять???
                             if Msg.message =WM_NCACTIVATE then
                             active:=true else  active:=false;
                                    end;

     end;//end of Case
    end;

    ...
    Result.Form.OnMessage := Result.KOLForm1Message;

  • ParanoiS © (04.03.15 00:21) [4]
    Есть ещё волшебная штука:

    // onMouseDown
    if (позиция мыши совпадает с нужной, чтобы двигать окно) and (Mouse.Button=mbLeft) and (не нажаты шифт и т.п.) then
     begin
       ReleaseCapture;
       Form.Perform(WM_SYSCOMMAND, $F012, 0);
       // включает перетаскивание окна
     end;
  • ParanoiS © (04.03.15 00:22) [5]
    если ты про это, конечно:)
  • ParanoiS © (04.03.15 00:46) [6]
    Зачем определять регионы htCaption, если можно тупо принудительно послать сообщение Винде, что я УЖЕ НАЧАЛ двигать окно. Так проще, хоть это и недокументированно (и неправильно походу). Я еще в Win3.1 и 95 так делал на асме. Работает на ура и сейчас. Кстати, начиная с Висты, появилось несколько новых сообщений, например, "Окно передвинуто к левому/правому краю рабочего стола, и его надо развернуть по высоте полностью, а по ширине - наполовину ширины стола". Ни в msdn, ни в Делфях XE, ни в VS201x я не нашел упоминаний о новых константах... Методом тыка они конечно были найдены...

    Мораль: честное программирование - зло:) Экспериментальное программирование ВСЕГДА спасает.

    Даже Кладов согласен - он это доказал, создав MCK!:)
 
Конференция "KOL" » Doubhnuts VCL->KOL [Delphi, Windows]
Есть новые Нет новых   [134427   +34][b:0][p:0.003]