Форум: "WinAPI";
Текущий архив: 2006.03.19;
Скачать: [xml.tar.bz2];
ВнизПеретаскивание формы на 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 вся ветка
Форум: "WinAPI";
Текущий архив: 2006.03.19;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.011 c