Конференция "KOL" » Форма с полупрозрачной тенью [Delphi, Windows]
 
  • Сашик (27.03.08 14:36) [0]
    Привожу процедуру прорисовки тени от модальной формы (Window XP). Жду замечаний и советов...
    Подключение к форме:

    FormShadow:= NewShadowForm(Form1.Form);
    Form1.Form.AttachProc(WndProcFormShadow);



    unit FmShadow;
    interface

    uses Windows, Messages, KOL {$IFNDEF VER120}, Variants{$ENDIF};

    function WndProcFormShadow(Self_: PControl; var Msg: TMsg; var Rslt: Integer): Boolean;
    function NewShadowForm(pForm: PControl): PControl;

    var
    FormShadow: PControl;

    implementation

    var
    ShadowSize: Integer = 20;
    ShadowColor: TColor = clBlack;
    ShadowAlphaBlend: Byte = 120;

    function WndProcFormShadow(Self_: PControl; var Msg: TMsg; var Rslt: Integer): Boolean;
    var Bounds: TRect;
    begin
     if (Msg.Message = WM_WINDOWPOSCHANGED) or
     (Msg.Message = WM_KILLFOCUS) then begin
      GetWindowRect(Self_.Handle, Bounds);
      SetWindowPos(FormShadow.Handle, Self_.Handle, Bounds.Left + ShadowSize,
       Bounds.Top + ShadowSize, Bounds.Right - Bounds.Left,
        Bounds.Bottom - Bounds.Top, SWP_NOACTIVATE + SWP_SHOWWINDOW);
     end;
    Result:= False;
    end;

    function NewShadowForm(pForm: PControl): PControl;
    var r: TRect; aWidth, aHeight: Integer;
    Src, Dst: HRGN;
    begin
     Result:= NewForm(Applet, '');
     pForm.CanResize:= False;
     pForm.StayOnTop:= True;
     pForm.Style := pForm.Style and not WS_MAXIMIZEBOX;
     with Result^ do begin
      HasBorder:= False;
      HasCaption:= False;
      Color:= ShadowColor;
      GetWindowRect(pForm.Handle, r);
      aWidth:= r.Right - r.Left;
      aHeight:= r.Bottom - r.Top;
      Src:= CreateRectRgn(0, 0, aWidth, aHeight);
      Dst:= CreateRectRgn(0, 0, aWidth - ShadowSize, aHeight - ShadowSize);
      CombineRgn(Src, Src, Dst, RGN_DIFF);
      SetWindowRgn(Handle, Src, True);
      AlphaBlend:= ShadowAlphaBlend;
      SetWindowPos(Handle, HWND_TOP, r.Left + ShadowSize, r.Top + ShadowSize,
       aWidth, aHeight, SWP_NOACTIVATE + SWP_SHOWWINDOW);
      DeleteObject(Src);
      DeleteObject(Dst);
     end;
    end;
    end.

  • Ар2р (17.09.08 08:47) [1]
    FormShadow:= NewShadowForm(Form1.Form);
    Form1.Form.AttachProc(WndProcFormShadow);

    и как это юзать ? у формы нет сво-ва form!
  • MTsv DN (17.09.08 11:50) [2]
    > у формы нет сво-ва form!
    Посмотрите название конференции - KOL!!!
  • Сашик (23.09.08 00:22) [3]
    Прошу прощения... Имеется ввиду Form:= NewForm(...). Скорее всего код взят из проекта c MCK, а там Form1.Form имеет место наряду с Form. В Delphi 4 по крайней мере ошибок не выдается...

    msgok(Form.Caption);
    msgok(Form1.Form.Caption);


    В обоих случаях выдает сообщение "Form1"
  • MTsv DN (23.09.08 10:52) [4]
    msgok(Form.Caption);
    msgok(Form1.Form.Caption);


    Вообще-то в KOL - это одно и тоже при наличии одной формы...
 
Конференция "KOL" » Форма с полупрозрачной тенью [Delphi, Windows]
Есть новые Нет новых   [134431   +16][b:0][p:0.002]