Конференция "Компоненты" » Обычный наследник от TPanel
 
  • dmk © (22.04.15 03:06) [0]
    а если поместить на форму, то не прорисовывается Caption и рамки.
    Может не так что сделал?

    unit DmClasses;

    interface

    uses
     System.SysUtils, System.Classes, Vcl.Controls, Vcl.StdCtrls, Vcl.ExtCtrls, Messages, Graphics, Windows;

    type
     [ComponentPlatformsAttribute (pidWin32 or pidWin64)]
     TDmPanel = class(TPanel)
     protected
       FFrameColor: TColor;
       FFrameVisible: boolean;
       procedure WMPaint(var m: TWMPaint); message WM_PAINT;
     published
       property FrameColor: TColor read FFrameColor write FFrameColor;
       property FrameVisible: boolean read FFrameVisible write FFrameVisible;
     end;

    procedure Register;

    implementation

    procedure DrawWindowFrame(wnd: HWND; AColor: TColor);
    var
     c: TCanvas;
     R, DR: TRect;

    begin
     GetWindowRect(wnd, R);

     DR.Left := 0;
     DR.Top := 0;
     DR.Width := R.Right - R.Left;
     DR.Height := R.Bottom - R.Top;

     c := TCanvas.Create;
     with c do
     begin
       Handle := GetWindowDC(wnd);
       Brush.Style := bsClear;
       Pen.Color := AColor;
       Pen.Style := psDot;
       Pen.Width := 1;
       Rectangle(DR);
       ReleaseDC(wnd, Handle);
       Handle := 0;
       Free;
     end;
    end;

    procedure TDmPanel.WMPaint(var m: TWMPaint);
    begin
     m.Result := 0;
     DefaultHandler(m);
     if FrameVisible then DrawWindowFrame(Handle, FFrameColor);
    end;

    procedure Register;
    begin
     RegisterComponents('TDmClasses', [TDmPanel]);
    end;

    end.

  • dmk © (22.04.15 03:07) [1]
    Delphi XE6, win64
  • Pavia © (22.04.15 12:39) [2]
    Вместо WM_PAINT использовать WM_PAINTicon

    Если честно то код очень странный. Такое впечатление, что писал человек не читавший про компоненты ни строчки.
  • Pavia © (22.04.15 12:45) [3]
    Выше Ерунду какую то написал.
  • Pavia © (22.04.15 13:08) [4]
    procedure TDmPanel.WMPaint(var m: TWMPaint);
    begin
     inherited;
       m.Result := 0;
     if FrameVisible then DrawWindowFrame(Handle, FFrameColor);
    end;

    Вот так работает.
  • dmk © (22.04.15 13:12) [5]
    >WM_PAINTicon
    Мне это не нужно.

    http://s27.postimg.org/87cewfusj/image.jpg
    Вот проблема.

    >писал человек не читавший про компоненты ни строчки.
    Не читал. Первый раз. Все когда-то происходит первый раз.

    >Выше Ерунду какую то написал.
    Эта ерунда работает идеально, как и задумано, но возник такой эффект с исчезновением Ctl3D.
  • dmk © (22.04.15 13:18) [6]
    Pavia ©   (22.04.15 13:08) [4]

    Помогло! Спасибо.
  • dmk © (22.04.15 13:22) [7]
    Почему-то считал, что inherited нужен там, где стоит override.
  • icWasya © (22.04.15 15:05) [8]
    Все обработчики Messages являются виртуальными(dynamic) функциями.
    При этом inherited вызывает метод предка не с таким именем, а с таким же номером события. В данном случае вызовется предыдущий обработчик WM_PAINT, как бы он не назывался в предке.
  • dmk © (22.04.15 19:41) [9]
    Спасибо!
  • Adelaide (25.11.15 02:29) [10]
    Удалено модератором
  • Alice (25.11.15 03:24) [11]
    Удалено модератором
  • Karina (25.11.15 03:47) [12]
    Удалено модератором
  • имя (21.04.16 13:38) [13]
    Удалено модератором
  • имя (21.04.16 14:08) [14]
    Удалено модератором
  • имя (21.04.16 14:31) [15]
    Удалено модератором
  • имя (21.04.16 14:35) [16]
    Удалено модератором
  • имя (21.04.16 14:51) [17]
    Удалено модератором
  • имя (21.04.16 15:01) [18]
    Удалено модератором
  • имя (21.04.16 15:11) [19]
    Удалено модератором
 
Конференция "Компоненты" » Обычный наследник от TPanel
Есть новые Нет новых   [93938   +46][b:0.001][p:0.005]