Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как перетягивать форму без заголовка? [Delphi, Windows]


_Beginner_ ©   (2005-09-27 22:09:00) 

Здравствуйте!
Недавно попробовал библиотеку КОЛ и очень понравилось, но возникли некоторые прроблемы. Некоторые я уже забыл, но ещё одна есть:
создал форму без заголовка и написал стандартный обработчик для события ОнМаусДаун, чтоб перетягивать форму:
ReleaseCapture;
Perform(WM_SysCommand,$F012,0);
на что делфи пишет, что не понимает Perform? Как это исправить, чтоб работало?
И ещё: часто надо использовать IntToStr(), а оболочка пишет, что такого не знает, приходится подключать SysUtils, но он вроде уже подключён до этого, как-то странно.
Научите, пожалуйста, как правильно.
Заранее благодарен.


homm   (2005-10-08 23:04:00) [1]

2 Muxaspb
Первое что приходит в голову - ClipCursor.
Второе проверять Component.Left + Component.Width > Parent.Widht и аналогично высоту в WM_SIZING, и если больше то поправлять.


Muxaspb   (2005-10-08 16:15:00) [2]

А кто-нибудь знает, как перетягивать компонент внутри определенной области, например, панель внутри клиентской области формы, чтобы она не выходила за ее пределы.


_Beginner_   (2005-10-07 18:15:00) [3]

Большое спасибо, обязательно попробую и сообщу о результатах


Wiz@rd   (2005-09-28 21:36:00) [4]

Вообще то мой вариант позволяет тащить кого-угодно за что угодно, если нужен мгновенный драг то можно добавить SystemParametersInfo (SPI_SETDRAGFULLWINDOWS, 0, nil, 0)
также в KOL можно сделать так:

procedure TMainForm.pnlCaptionMouseDown(Sender: PControl;
 var Mouse: TMouseEventData);
begin
 if Mouse.Button = mbLeft then FDown := True;
end;

procedure TMainForm.pnlCaptionMouseMove(Sender: PControl;
 var Mouse: TMouseEventData);
begin
 if FDown then Form.DragStartEx;
end;

procedure TMainForm.pnlCaptionMouseUp(Sender: PControl;
 var Mouse: TMouseEventData);
begin
 FDown := False;
 Form.DragStopEx;
end;


ECM   (2005-09-28 11:08:00) [5]

ИМХО: Перетаскивание формы без заголовка "кошернее" сделать через обработку сообщения WM_NCHITTEST  - просто сообщить Windows что клиентская часть окна и есть ее заголовок:

function TForm1.KOLForm1Message(var Msg: tagMSG;
 var Rslt: Integer): Boolean;
begin
 Result := FALSE;
 if (Msg.message = WM_NCHITTEST) then begin
   Rslt := DefWindowProc(Form.Handle,Msg.message,Msg.wParam,Msg.lParam);
   if Rslt = HTCLIENT then begin
       Rslt := HTCAPTION;
       Result := TRUE;
   end;
 end;
end;


По-поводу Perform:
В KOL это можно было записать так: Form.Perform(WM_SysCommand,$F012,0);


Wiz@rd   (2005-09-28 09:20:00) [6]

ОнМаусДаун:
SendMessage (Handle, WM_SYSCOMMAND, SC_MOVE+1,0);


SPeller   (2005-09-28 04:08:00) [7]

В FAQ был ответ на этот вопрос.


Ajax   (2005-09-28 00:16:00) [8]

Для перетаскивании формы используй Form.DragStart.
Вместо StrToInt используй Str2Int.


Наверх

Титульная страница Поиск, карта сайта Написать письмо