Форум: "Основная";
Текущий архив: 2007.02.25;
Скачать: [xml.tar.bz2];
ВнизСообщение не обрабатывается Найти похожие ветки
← →
Calibr © (2006-12-27 11:31) [0]Почему не обрабатывается сообщение WM_LBUTTONUP. Я всеголишь хотел сделать чтоб форму можно было таскать за клиентскую область и при окончании перетаскивания выполнить кое-какие действия. А сообщение почему-то не обрабатывается когда существует процедура WM_NCHITTEST. Подскажите, как решить проблему?
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
private
procedure WMLButtonUp(var Message: TWMLButtonUp); message WM_LBUTTONUP;
procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST;
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.WMLButtonUp(var Message: TWMLButtonUp);
begin
ShowMessage("Отпущена левая кнопка мыши!");
end;
procedure TForm1.WMNCHitTest(var Message: TWMNCHitTest);
begin
Message.Result := HTCaption;
end;
end.
← →
EvChul © (2006-12-27 11:45) [1]Ну как минимум
procedure TForm1.WMNCHitTest(var Message: TWMNCHitTest);
begin
Message.Result := HTCaption;
inherited
end;
← →
Calibr © (2006-12-27 12:01) [2]
> EvChul © (27.12.06 11:45) [1]
ну тогда форма не перетаскивается за клиентскую область!
← →
Юрий Зотов © (2006-12-27 12:14) [3]Сначала inherited, потом Result.
← →
Calibr © (2006-12-27 12:37) [4]
> Юрий Зотов © (27.12.06 12:14) [3]
так тоже не работает!
← →
Германн © (2006-12-27 12:58) [5]
> Calibr © (27.12.06 11:31)
Попробуй обрабатывать WM_NCLBUTTONUP вместо WM_LBUTTONUP
← →
Calibr © (2006-12-27 14:29) [6]
> Германн © (27.12.06 12:58) [5]
Так катит только если форма развернутая! А когда она развернутая, то ее и перемещать не надо!
← →
Elen © (2006-12-27 14:34) [7]
> Я всеголишь хотел сделать чтоб форму можно было таскать
> за клиентскую область и при окончании перетаскивания выполнить
> кое-какие действия.
А DragDrop не подходит?
← →
Юрий Зотов © (2006-12-27 14:40) [8]> Calibr © (27.12.06 14:29) [6]
Возвращая HTCaption, вы "обманываете" систему, говоря ей, что мышь находится в области заголовка (поэтому и происходит перемещение формы за клиентскую область, как за заголовок).
Но раз система думает, что мышь находится в области заголовка, то вместо сообщений WM_xBUTTONxx она будет посылать форме аналогичные сообщения WM_NCxBUTTONxx.
Их и надо обрабатывать.
← →
Calibr © (2006-12-27 14:51) [9]
> Юрий Зотов © (27.12.06 14:40) [8]
Я уже пытался обрабатывать WM_NCLBUTTONUP, но это работает только для формы в развернутом виде, а мне надо чтоб форма была в нормальном виде!
← →
Юрий Зотов © (2006-12-27 15:19) [10]> Calibr © (27.12.06 14:51) [9]
Ваш постинг [6] я читал. То, что Вы пытались обработать сообщение - это понятно. Непонятно другое - а Вы его действительно обработали, или только попытались?
← →
Calibr © (2006-12-27 17:37) [11]
> Юрий Зотов © (27.12.06 15:19) [10]
я сделал так, оно срабатывало при развернутой форме, следовательно я его обработал, но только это - не то, что нужно
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
private
procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST;
procedure WMNCLButtonUp(var Message: TWMNCLButtonUp); message WM_NCLBUTTONUP;
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TForm1 }
procedure TForm1.WMNCHitTest(var Message: TWMNCHitTest);
begin
Inherited;
message.Result := HTCaption;
end;
procedure TForm1.WMNCLButtonUp(var Message: TWMNCLButtonUp);
begin
ShowMessage("123");
end;
end.
← →
EvChul © (2006-12-27 17:50) [12]А может пойти вообще другим путем? Например в обработчике OnMouseDown формы
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
const
SC_DRAGMOVE = $F012;
begin
ReleaseCapture;
Perform(WM_SYSCOMMAND, SC_DRAGMOVE, 0);
end;
← →
easy © (2006-12-28 12:28) [13]
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if ssLeft in Shift then
pt:=Point(X,Y);
end;
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var
R:TRect;
begin
if ssLeft in Shift then begin
GetWindowRect(handle,R);
MoveWindow(handle,R.left+(X-pt.X),R.top+(Y-pt.Y) ,R.right-R.left,R.bottom-R.top,true);
end;
end;
← →
easy © (2006-12-28 12:31) [14]
pt: TPoint;
//****
← →
Calibr © (2006-12-28 16:34) [15]
> easy © (28.12.06 12:28) [13]
Спасибо помогло!
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2007.02.25;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.04 c