Вызов FormMouseDown в Delphi - PullRequest
       1

Вызов FormMouseDown в Delphi

2 голосов
/ 08 декабря 2011

У меня есть эскиз картинки. Я написал код для перерисовки этого изображения в Delphi, как только пользователь нажмет эту кнопку. Однако требуется, чтобы пользователь мог щелкнуть по миниатюре и щелкнуть в любом месте формы, чтобы создать изображение.

Например, допустим, у меня есть миниатюра изображения круга, теперь пользователь должен щелкнуть этот эскиз и щелкнуть где-нибудь в форме, и должен появиться круг.

Для этого я узнал, что нам нужно использовать

TForm1.FormMouseDown(Sender: TObject;Button: TMouseButton; Shift: TShiftState;X, Y: Integer) ;

Я не понял, как отправить координаты X, Y на это? Пример:

procedure TMDIChild.FormMouseDown(Sender: TObject;Button: TMouseButton; Shift: TShiftState;X, Y: Integer);
begin
  Canvas.Ellipse(x-20,y-20,x+20,y+20) ;
end;

Должен нарисовать эллипс (круг), если щелкнуть левой кнопкой мыши где-нибудь в форме после нажатия на миниатюру. Но x, y должен быть текущим указателем мыши, и как мне получить текущий указатель мыши после того, как пользователь нажал на миниатюру?

Я очень ценю вашу помощь.

Спасибо, Гиридхар.

Ответы [ 3 ]

2 голосов
/ 08 декабря 2011

Вы можете попробовать

Mouse.CursorPos.x and Mouse.CursorPos.y

, и если вы хотите изменить источник координат (экран или форма), вы должны использовать ScreenToClient() или ClientToScreen().

0 голосов
/ 08 декабря 2011

Перетащите ящик для рисования на форму и напишите некоторый код в событии OnPaint элемента управления для рисования, например:

procedure TForm1.PaintBox1Paint(Sender: TObject);
var
 pb:TPaintBox;
 h,w:Integer;
begin
    pb := TPaintBox(Sender);
    h := pb.Height;
    w := pb.Width;
    pb.Canvas.Ellipse( 10, 10, w-10, h-10 );
end;

Нет способа рисовать непосредственно из FormMouseDown.Поэтому добавьте некоторый код в FormMouseDown для захвата координат, сохраните их в переменной, а затем лишите законной силы свой элемент управления paintbox (Paintbox1.Invalidate), и эллипс будет нарисован элементом управления paintbox.(Вы можете, например, положить ящик для краски поверх другого элемента управления).

0 голосов
/ 08 декабря 2011

Я не до конца понимаю проблему, но вижу одну вещь неправильно.Вы не можете ожидать рисования на холсте формы при событии мыши и надеетесь, что то, что вы рисуете, останется.Рисование в Windows просто не работает таким образом.Вам нужно нарисовать форму в ответ на сообщение WM_PAINT.

Нет постоянной поверхности рисования, связанной с окном.Когда нужно покрасить окно, система отправляет сообщение WM_PAINT в вашу очередь сообщений.Затем вы обязаны нарисовать текущее состояние окна.

Самый простой способ добиться этого в вашем случае - это нарисовать растровое изображение вне экрана в ответ на сообщения мыши, а затем отобразить это растровое изображение как частьцикл рисования.Вы можете получить доступ к циклу рисования, указав TPaintBox в своей форме и обработав событие OnPaint.В этом случае просто перетяните растровое изображение на холст поля рисования.

Вам нужно будет перекрасить ящик рисования при каждом обновлении растрового изображения.Сделайте это, вызвав метод Invalidate окна рисования.

Я рекомендую прочитать книгу Петцольда Программирование Windows , чтобы получить полное представление о том, как рисование работает в Windows.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...