Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.08.27;
Скачать: CL | DM;

Вниз

Форма с полупрозрачной тенью   Найти похожие ветки 

 
Сашик   (2008-03-27 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р   (2008-09-17 08:47) [1]

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

и как это юзать ? у формы нет сво-ва form!


 
MTsv DN   (2008-09-17 11:50) [2]

> у формы нет сво-ва form!
Посмотрите название конференции - KOL!!!


 
Сашик   (2008-09-23 00:22) [3]

Прошу прощения... Имеется ввиду Form:= NewForm(...). Скорее всего код взят из проекта c MCK, а там Form1.Form имеет место наряду с Form. В Delphi 4 по крайней мере ошибок не выдается...

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

В обоих случаях выдает сообщение "Form1"


 
MTsv DN   (2008-09-23 10:52) [4]

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

Вообще-то в KOL - это одно и тоже при наличии одной формы...



Страницы: 1 вся ветка

Текущий архив: 2010.08.27;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.049 c
15-1264366744
Nic
2010-01-24 23:59
2010.08.27
Схема Беллмана


15-1267567565
Delphi5.01
2010-03-03 01:06
2010.08.27
Редакт. настр. прокси для Firefox и Opera (решение оплачивается)


2-1273303750
FIL-23
2010-05-08 11:29
2010.08.27
поиск в Query


15-1275769777
Юрий
2010-06-06 00:29
2010.08.27
С днем рождения ! 6 июня 2010 воскресенье


15-1273757901
JohnKorsh
2010-05-13 17:38
2010.08.27
Порты USB.