Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.03.19;
Скачать: CL | DM;

Вниз

Перетаскивание формы на WinApi   Найти похожие ветки 

 
iNBox   (2005-12-21 22:28) [0]

Здравствуйте!
У меня вопрос как реализовать перетаскивание формы если программа написанна на WinAPI, все свои окна я вызываю из ресурсов.


 
Джо ©   (2005-12-21 23:06) [1]


> как реализовать перетаскивание формы

Мышкой.

> если программа написанна на WinAPI

В WinAPI нет никаких форм, клянусь.


 
ArtemESC ©   (2005-12-21 23:07) [2]

>>программа написанна на WinAPI
Новый язык??


 
iNBox   (2005-12-21 23:21) [3]

Программа написанна на Delphi без VCL,все формы лежат в ресурсах программы.Вопрос как сделать так что бы окно программы можно было перетаскивать не только за заголовок окна?


 
Джо ©   (2005-12-21 23:36) [4]


>  [3] iNBox   (21.12.05 23:21)

Да в общем и целом, практически так же, как и с использование VCL. Т.е, в оконной процедуре обрабатывать сообщение WM_LBUTTONDOWN, в нем вызвать ReleaseCapture и послать собственному окну сообщение WM_SysCommand с первым параметром SC_DragMove. Кажется, так. А в чем проблема?


 
марсианин ©   (2005-12-24 01:01) [5]

см. WM_NCHITTEST


 
iNBox   (2005-12-26 15:25) [6]

пытался сделать так:

 WM_LBUTTONDOWN : begin
 ReleaseCapture;
 SendMessage(Window,Msg,WParam,LParam);

 Но перетаскивание не осуществляется.На асме это реализовывается вот так:
invoke ReleaseCapture
 invoke SendMessage,hwnd,WM_NCLBUTTONDOWN, HTCAPTION,0

А как это реализовать на Delphi?Помогите пожалуйста!


 
Джо ©   (2005-12-26 16:39) [7]


>  Но перетаскивание не осуществляется.На асме это реализовывается
> вот так:
> invoke ReleaseCapture
>  invoke SendMessage,hwnd,WM_NCLBUTTONDOWN, HTCAPTION,0
> А как это реализовать на Delphi?Помогите пожалуйста!

А на Делфи это «реализовывается» так:
ReleaseCapture;
SendMessage (hwnd,WM_NCLBUTTONDOWN, HTCAPTION,0);


 
Игорь Шевченко ©   (2005-12-26 17:12) [8]

unit Main;

interface

procedure Run;

implementation
uses
 Windows, Messages;

const
 ClassName = "MyClass";
 WindowName = "MyWindow";

function MyWndProc (Wnd: HWND; Message: UINT; wParam: WPARAM;
 lParam: LPARAM): LRESULT; stdcall;
begin
 case Message of
 WM_DESTROY:
   begin
     PostQuitMessage (0);
     Result := 0;
     Exit;
   end;
 WM_NCHITTEST:
   begin
     Result := DefWindowProcA (Wnd, Message, wParam, lParam);
     if Result = HTCLIENT then
       Result := HTCAPTION;
     Exit;
   end;
 else
   Result := DefWindowProcA (Wnd, Message, wParam, lParam);
 end;
end;

function Init: Boolean;
var
 wc: WNDCLASSEXA;
begin
 FillChar (wc, SizeOf(wc), 0);
 wc.cbSize := SizeOf(wc);
 wc.lpszClassName := ClassName;
 wc.hInstance := HInstance;
 wc.lpfnWndProc := @MyWndProc;
 wc.hCursor := LoadCursor (0, IDC_ARROW);
 wc.hbrBackground := HBRUSH(GetStockObject(WHITE_BRUSH));
 Result := RegisterClassExA (wc) <> 0;
 if not Result then
   Exit;
end;

procedure Done;
begin
 UnregisterClassA (ClassName, HInstance);
end;

procedure Run;
var
 Msg: tagMSG;
 Wnd: HWND;
begin
 if not Init then
   Exit;
 Wnd := CreateWindowExA (0, ClassName, WindowName,
   WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
   CW_USEDEFAULT, CW_USEDEFAULT, HWND_DESKTOP, 0, HInstance, nil);
 Assert(Wnd <> 0);
 ShowWindow(Wnd, SW_SHOW);
 UpdateWindow(Wnd);
 while GetMessage(Msg, 0, 0, 0) do begin
   TranslateMessage (Msg);
   DispatchMessage (Msg);
 end;
 Done;
end;

end.


 
iNBox   (2005-12-26 17:54) [9]

большое всем спасибо!


 
марсианин ©   (2005-12-27 00:57) [10]

осталось это только в ФАК включить


 
Германн ©   (2005-12-27 02:07) [11]


> марсианин ©   (27.12.05 00:57) [10]
>
> осталось это только в ФАК включить

И что? Все, кто читает ФАК, должны будут делать всЁ, что Игорь написАл?
Так это - всего лишь пример, читая который вы, может быть, уловите суть решения сабжа!


 
GrayFace ©   (2005-12-27 07:26) [12]

Ну, для коллекции, еще способ:
  ReleaseCapture;
  SendMessage(Window,WM_SYSCOMMAND,$f012,0);


 
OldNaum ©   (2005-12-27 08:19) [13]

$f012=SC_DragMove, если мне память не изменяет )


 
GrayFace ©   (2005-12-27 13:56) [14]

SC_DragMove не существует. Есть SC_MOVE = $f010


 
Игорь Шевченко ©   (2005-12-27 14:24) [15]

GrayFace ©   (27.12.05 13:56) [14]

Правильно говоришь, SC_DRAGMOVE не существует.

Любое сообщение WM_SYSCOMMAND в качестве WPARAM передает SC_xxxx команду + в младших четырех битах значение HITTEST той точки, где была мышь.

Смотря на значение $F012 мы видим, что оно соответствует SC_MOVE + HTCAPTION (2), а о том, что окно можно перетаскивать за заголовок, известно с времен Windows 3.1


 
Джо ©   (2005-12-27 15:03) [16]


>  [12] GrayFace ©   (27.12.05 07:26)
> Ну, для коллекции, еще способ:

Этот способ уже был занесен в коллекцию еще в п. [4] :))



Страницы: 1 вся ветка

Текущий архив: 2006.03.19;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.043 c
3-1138147573
Святослав
2006-01-25 03:06
2006.03.19
Можно ли получить информацию о выполнении запроса ExecSQL?


2-1141197033
WChek
2006-03-01 10:10
2006.03.19
Работа с параметрами


15-1140629398
Tria
2006-02-22 20:29
2006.03.19
Есть ли у кого-то опыт написания программ на Kylix?


4-1132859053
homm
2005-11-24 22:04
2006.03.19
Изменение порядка прорисовки


2-1141050227
Riva4
2006-02-27 17:23
2006.03.19
Как сделать фильтрацию по дате