Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.03.2007, 15:19   #1
Аlex
Форумчанин
 
Регистрация: 16.11.2006
Сообщений: 175
По умолчанию а первый взгляд просто..

У меня вдруг возникла вот такая ситуация: надо короче в процедуре OnMouseMove узнать когда будет отпущена левая кнопка хвостатой причем на скрине. Ну типа чтобы форму можно было перетаскивать, зацепив в любом месте.Только дело в том, что формы от формы не осталось (она вся перекрыта компонентами).Я написал так:
Код:
procedure TForm1.Label1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
  var
  crs:Tpoint;
begin
GetCursorPos(crs);
while {нажата левая кнопка} do
begin
Form1.Top:=crs.X-X;
Form1.Left:=crs.Y-Y;
end;
end;
Осталось только проверить когда нажата левая кнопка мыши и когда отпущена и завершить цикл.Кто чем может подскажите плз.
чайник юзеру не товарищ, а сам себе враг...

Последний раз редактировалось Аlex; 24.03.2007 в 15:22.
Аlex вне форума Ответить с цитированием
Старый 24.03.2007, 18:22   #2
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

удали єтот код

вот лучшее рещение

Код:
procedure MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  ReleaseCapture;
  Perform(WM_SYSCOMMAND, $F012, 0);
end;
BOBAH13 вне форума Ответить с цитированием
Старый 25.03.2007, 21:20   #3
Аlex
Форумчанин
 
Регистрация: 16.11.2006
Сообщений: 175
Хорошо

!!! Интересно только как оно работает
чайник юзеру не товарищ, а сам себе враг...
Аlex вне форума Ответить с цитированием
Старый 02.04.2007, 17:57   #4
Voland
Heavy metal
Пользователь
 
Аватар для Voland
 
Регистрация: 02.04.2007
Сообщений: 42
По умолчанию

А ещё лучше (и проще) перехватывать сообщение WM_NCHITTEST и в нужных местах возвращать HTCAPTION. Всё остальное винда сделает сама.
Voland вне форума Ответить с цитированием
Старый 02.04.2007, 20:29   #5
Сильванович Михаил
Студент
Форумчанин
 
Регистрация: 10.11.2006
Сообщений: 196
По умолчанию

var
OldLeft,OldTop: integer;
Dragging: boolean;

procedure TForm1.FormCreate(Sender: TObject);
begin
Dragging:=false;
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if (button=mbLeft)and(x>3)and(x<130)an d(y>2)and(y<20) then
begin
Dragging:=true;
OldLeft:=X;
OldTop:=Y;
end;
end;


procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if Dragging then
begin
Left:=Left+X-OldLeft;
Top:=Top+Y-OldTop;
end;
end;
procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Dragging:=false;
end;

<- Помню форму я перетаскивал так. (когда нацеплял на нее свой "регион")
Visita Interiorem Terrae Rectificando Operae Lapidem...
Сильванович Михаил вне форума Ответить с цитированием
Старый 03.04.2007, 11:05   #6
Voland
Heavy metal
Пользователь
 
Аватар для Voland
 
Регистрация: 02.04.2007
Сообщений: 42
По умолчанию

^^^ Я точно так же делал, пока не узнал про NCHITTEST. Зачем мучиться, если всё уже предусмотрено. Вот так:

Код:
...
type
  TForm1 = class(TForm)
    Shape1: TShape;
    procedure WMNcHitTest(var msg: TWMNCHitTest); message WM_NCHITTEST;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses Types;

{$R *.dfm}

{ TForm1 }

procedure TForm1.WMNcHitTest(var msg: TWMNCHitTest);
var pt: TPoint;
begin
  pt:=ScreenToClient(SmallPointToPoint(msg.Pos));
  if PtInRect(ClientRect, pt) and PtInRect(Shape1.BoundsRect, pt) then
    msg.Result:=HTCAPTION else inherited;
end;
Теперь форму можно будет таскать за Shape1. И даже если дважды щёлкнуть по ней, окно развернётся на весь экран, как и на настоящем заголовке.
Voland вне форума Ответить с цитированием
Старый 04.04.2007, 12:40   #7
Аlex
Форумчанин
 
Регистрация: 16.11.2006
Сообщений: 175
По умолчанию

Цитата:
Сообщение от Voland Посмотреть сообщение
^^^ Я точно так же делал, пока не узнал про NCHITTEST. Зачем мучиться, если всё уже предусмотрено. Вот так:
...
Есть некоторое неудобство при ее использовании например с нажатием кнопок могут возникнуть проблемы и контекстное меню будет как у заголовка. Мне например больше нравиться предыдущий способ (он кстати и намного короче)
чайник юзеру не товарищ, а сам себе враг...
Аlex вне форума Ответить с цитированием
Старый 05.04.2007, 18:34   #8
Voland
Heavy metal
Пользователь
 
Аватар для Voland
 
Регистрация: 02.04.2007
Сообщений: 42
По умолчанию

Ну не знаю, я никаких проблем не замечал. А контекстное меню, кстати, не будет там появляться.
Voland вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Мой первый макрос valerij Microsoft Office Excel 102 19.11.2008 10:45
MsSQL - первый раз установил майкрософт SQL vados SQL, базы данных 16 19.07.2008 20:01
Первый баг (фото) mutabor Свободное общение 1 06.05.2008 11:51
Вроде на первый взгляд всЁ просто...... Solny6ko YasnoE Помощь студентам 4 17.09.2007 08:23