Консультация № 85164
02.05.2007, 23:00
0.00 руб.
0 3 3
Здравствуйте.
К сожалению ответы на вопрос №84888 мне не помогли. Сейчас привожу тот же вопрос, но в другой, более развернутой, формулировке:

При щелчке мыши по форме, рисуется большой кружок, причем поверх всех контролов и заголовка формы. Дак вот вопрос, как при нажатии на кнопке Button1, все что было нарисовано, безвозвратно исчезло, как например, если форму свернуть и потом восстановить?
Очень надеюсь на Вашу помощь, т.к. эта проблема меня волнует уже больше года.

Приложение:
unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); procedure FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); end;var Form1: TForm1;implementation{$R *.dfm}{Кнопка, при нажатии на которой, форма должна быть очищена от кружочков и должна принять первоначальный вид.}procedure TForm1.Button1Click(Sender: TObject);begin// Вот здесь нужно вставить Ваш кодend;procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);const d = 48;var ACanvas: TCanvas;begin ACanvas:=TCanvas.Create; try ACanvas.Handle:=GetWindowDC(Form1.Handle); with ACanvas do begin Brush.Color:=clActiveCaption; Inc(x, 5); Inc(Y, 30); ACanvas.Ellipse(Bounds(X-d div 2,Y-d div 2,d,d)); end; finally ReleaseDC(Form1.Handle, ACanvas.Handle); ACanvas.Free; end;end;end.

Обсуждение

Неизвестный
02.05.2007, 23:16
общий
это ответ
Здравствуйте, Louken!

Могу дать Вам два варианта решения:
1) Просто перерисовываем форму: <b>Form1.Repaint;</b>.
Но в данном способе есть один минус - не перерисовуется заголовок окна. :(

2) Просто скрываем форму и сразу же ее отображаем - визуально вы этого не заметите (просто маленький фокус):
<code>ShowWindow(Handle,SW_HIDE);
ShowWindow(Handle,SW_SHOWNORMAL);</code>

Good Luck!!!

Приложение:
unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); procedure FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); end;var Form1: TForm1;implementation{$R *.dfm}{Кнопка, при нажатии на которой, форма должна быть очищена от кружочков и должна принять первоначальный вид.}procedure TForm1.Button1Click(Sender: TObject);begin// Вот здесь нужно вставить Ваш код{ Form1.Repaint;} // первый вариант ShowWindow(Handle,SW_HIDE); // второй вариант ShowWindow(Handle,SW_SHOWNORMAL);}end;procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);const d = 48;var ACanvas: TCanvas;begin ACanvas:=TCanvas.Create; try ACanvas.Handle:=GetWindowDC(Form1.Handle); with ACanvas do begin Brush.Color:=clActiveCaption; Inc(x, 5); Inc(Y, 30); ACanvas.Ellipse(Bounds(X-d div 2,Y-d div 2,d,d)); end; finally ReleaseDC(Form1.Handle, ACanvas.Handle); ACanvas.Free; end;end;end.
Неизвестный
03.05.2007, 05:50
общий
это ответ
Здравствуйте, Louken!

сдвинул немного ваши фигуру ибо перерисовывать заголовок с помощью
form1.Repaint;
form1.Refresh;
не получается


Приложение:
unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); procedure Button1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); private { Private declarations } public { Public declarations } end;var Form1: TForm1;implementation{$R *.dfm}{Êíîïêà, ïðè íàæàòèè íà êîòîðîé, ôîðìà äîëæíà áûòü î÷èùåíà îò êðóæî÷êîâ è äîëæíà ïðèíÿòü ïåðâîíà÷àëüíûé âèä.}procedure TForm1.Button1Click(Sender: TObject);beginform1.Repaint;form1.Refresh;//form1.Update;//form1.// Âîò çäåñü íóæíî âñòàâèòü Âàø êîäend;procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);const d = 48;var ACanvas: TCanvas;begin ACanvas:=TCanvas.Create; try ACanvas.Handle:=GetWindowDC(Form1.Handle); with ACanvas do begin Brush.Color:=clActiveCaption; Inc(x, 30); Inc(Y, 40); ACanvas.Ellipse(Bounds(X-d div 2,Y-d div 2,d,d)); end; finally ReleaseDC(Form1.Handle, ACanvas.Handle); ACanvas.Free; end;end;end.
Неизвестный
03.05.2007, 10:32
общий
это ответ
Здравствуйте, Louken!

Зря вы все-таки мой совет не попробовали. Я взял ваш код и вставил вот такой. Все работает. Проверялось под XP & D6.

procedure TForm1.Button1Click(Sender: TObject);
begin
Repaint;
SendMessage(Handle, WM_NCPAINT, 0, 0);
end;
Форма ответа