Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.09.13;
Скачать: [xml.tar.bz2];

Вниз

Как рисовать на форме поверх всего ?   Найти похожие ветки 

 
b/@. ©   (2009-07-14 16:45) [0]

Добрый день.

Подскажите пожалуйста - можно ли, а если можно то как, рисовать на форме поверх всех элементов?

Вот к примеру такой код рисует рамочку

procedure TForm1.FormPaint(Sender: TObject);
begin
 Canvas.Rectangle(10, 10 , ClientWidth - 10, ClientHeight - 10);
end;

но при этом, на всех контролах, таких как листбоксы, кнопки, групбоксы и т.п. рамочка не рисуется.

Есть ли простые способы рисовать на форме напрямую ?


 
Palladin ©   (2009-07-14 17:01) [1]

ага... на десктопе рисовать...


 
Rouse_ ©   (2009-07-14 17:02) [2]

Можно.

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TForm1 = class(TForm)
   procedure FormCreate(Sender: TObject);
   procedure FormPaint(Sender: TObject);
   procedure FormResize(Sender: TObject);
   procedure FormDestroy(Sender: TObject);
 private
   ButtonsData: array [0..19] of TButton;
   procedure GenerateButtons;
   procedure ReleaseButtons;
   procedure ButtonClick(Sender: TObject);
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

function ButtonSubclassProc(hWnd: HWND; Msg: Integer;
 wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
var
 OldWndProc, LeftOffset, TopOffset: Integer;
 WndRect, ParentRect, ParentClientRect: TRect;
 TmpCanvas: TCanvas;
 X1, Y1, X2, Y2: Integer;
begin
 OldWndProc := GetWindowLong(hWnd, GWL_USERDATA);
 Result := CallWindowProc(Pointer(OldWndProc), hWnd, Msg, wParam, lParam);
 if Msg = WM_PAINT then
 begin
   GetWindowRect(hWnd, WndRect);
   GetWindowRect(GetParent(hWnd), ParentRect);
   GetClientRect(GetParent(hWnd), ParentClientRect);
   TopOffset := (ParentRect.Bottom - ParentRect.Top) -
     (ParentClientRect.Bottom - ParentClientRect.Top);
   LeftOffset := (ParentRect.Right - ParentRect.Left) -
     (ParentClientRect.Right - ParentClientRect.Left);
   X1 := ParentClientRect.Left + LeftOffset div 2 - (WndRect.Left - ParentRect.Left);
   Y1 := ParentClientRect.Top + TopOffset -
     (WndRect.Top - ParentRect.Top) - LeftOffset div 2;
   X2 := X1 + (ParentClientRect.Right - ParentClientRect.Left);
   Y2 := Y1 + (ParentClientRect.Bottom - ParentClientRect.Top);
   TmpCanvas := TCanvas.Create;
   try
     TmpCanvas.Handle := GetDC(hWnd);
     TmpCanvas.Pen.Color := clRed;
     TmpCanvas.Pen.Width := 4;
     TmpCanvas.MoveTo(X1, Y1);
     TmpCanvas.LineTo(X2, Y2);
   finally
     ReleaseDC(hWnd, TmpCanvas.Handle);
     TmpCanvas.Free;
   end;
 end;
end;

procedure TForm1.ButtonClick(Sender: TObject);
begin
 ReleaseButtons;
 GenerateButtons;
 Invalidate;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 DoubleBuffered := True;
 GenerateButtons;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
 ReleaseButtons;
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
 Canvas.Pen.Color := clRed;
 Canvas.Pen.Width := 4;
 Canvas.MoveTo(0, 0);
 Canvas.LineTo(ClientWidth, ClientHeight);  
end;

procedure TForm1.FormResize(Sender: TObject);
begin
 Invalidate;
end;

procedure TForm1.GenerateButtons;
var
 I: Integer;
begin
 Randomize;
 for I := 0 to 19 do
 begin
   ButtonsData[I] := TButton.Create(Self);
   ButtonsData[I].Parent := Self;
   ButtonsData[I].Left := Random(ClientWidth - ButtonsData[I].Width);
   ButtonsData[I].Top := Random(ClientHeight - ButtonsData[I].Height);
   ButtonsData[I].Caption := "Button" + IntToStr(I + 1);
   ButtonsData[I].OnClick := ButtonClick;
   SetWindowLong(ButtonsData[I].Handle,
     GWL_USERDATA, GetWindowLong(ButtonsData[I].Handle, GWL_WNDPROC));
   SetWindowLong(ButtonsData[I].Handle,
     GWL_WNDPROC, Integer(@ButtonSubclassProc));
 end;
end;

procedure TForm1.ReleaseButtons;
var
 I: Integer;
begin
 for I := 0 to 19 do
   ButtonsData[I].Free;
end;

end.


 
b/@. ©   (2009-07-14 17:12) [3]


> Rouse_ ©   (14.07.09 17:02) [2]

Т.е. для каждого класса контролов мне нужно релизововать подобное ?

А вот по поводу этого DoubleBuffered := True;
Можно ли рисовать напрямую этот в буффер ?


 
Игорь Шевченко ©   (2009-07-14 17:14) [4]


> Есть ли простые способы рисовать на форме напрямую ?


если не секрет, нафига поверх кнопок и листбоксов рисовать ?


 
b/@. ©   (2009-07-14 17:21) [5]


> Игорь Шевченко ©   (14.07.09 17:14) [4]
> если не секрет, нафига поверх кнопок и листбоксов рисовать ?

Хочу в определённые моменты рисовать на форме контурную ромашку, но при этом не прятать все контролы.
А так как всякого рода листбоксов, кнопок и т.п. напичкано довольно много, то от моей ромашки видно только ошмётки :(


 
Rouse_ ©   (2009-07-14 17:24) [6]


> Т.е. для каждого класса контролов мне нужно релизововать подобное ?

Угу


> А вот по поводу этого DoubleBuffered := True;

Это в справке есть - грубо, это свойства убирает мерцание


 
b/@. ©   (2009-07-14 17:25) [7]


> Rouse_ ©   (14.07.09 17:02) [2]
> Можно.

Прошу прощения. Всё получилось. Спасибо :)

PS: Хоть я пока и не понимаю как это работает...


 
b/@. ©   (2009-07-14 17:27) [8]


> Rouse_ ©   (14.07.09 17:24) [6]
> > А вот по поводу этого DoubleBuffered := True;
> Это в справке есть - грубо, это свойства убирает мерцание

Я не об этом - в справке написано сначала контролы рисуются на битмап в памяти, вот я и подумал - что если получить доступ к этому буферу и рисовать туда после отрисовки всей формы...


 
Игорь Шевченко ©   (2009-07-14 17:31) [9]


> Хочу в определённые моменты рисовать на форме контурную
> ромашку, но при этом не прятать все контролы


так сделай окно с регионом в виде контурной ромашки и рисуй его поверх формы


 
b/@. ©   (2009-07-14 17:38) [10]


> Игорь Шевченко ©   (14.07.09 17:31) [9]
> так сделай окно с регионом в виде контурной ромашки и рисуй его поверх формы

Думал сначала сделать снапшот окна формы, и вывести на битмап.
Но потом начал искать более "простые" способы :)
Раз при DoubleBuffered получается фактически то же самое - то дело за малым - получить доступ к этому буфферу...


 
Rouse_ ©   (2009-07-14 17:43) [11]


> Раз при DoubleBuffered получается фактически то же самое
> - то дело за малым - получить доступ к этому буфферу...

Ты и так рисуешь сначала на нем :) Просто для тебя это не заметно :)


 
Игорь Шевченко ©   (2009-07-14 17:44) [12]


> то дело за малым - получить доступ к этому буфферу...


не выйдет. RTFS: Controls.pas TWinControl.WMPaint



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

Форум: "Начинающим";
Текущий архив: 2009.09.13;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.009 c
15-1247637289
rnts
2009-07-15 09:54
2009.09.13
Plugin Photoshop из ч/б в цвет


6-1206625813
vlad
2008-03-27 16:50
2009.09.13
модем


15-1247212772
Pavia
2009-07-10 11:59
2009.09.13
Куда пойти?


15-1247449853
brother
2009-07-13 05:50
2009.09.13
Про юных хакеров.


2-1247490487
TStas
2009-07-13 17:08
2009.09.13
Какое сообщение послать чужому окну, чтобы оно развернулось?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский