Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
15-1140730129
McSimm(proxy)
2006-02-24 00:28
2006.03.19
Как такое может быть.?


15-1140501175
Ega23
2006-02-21 08:52
2006.03.19
С Днём рождения! 21 февраля


2-1141364726
rosl
2006-03-03 08:45
2006.03.19
фильтр без регистра


1-1139902820
NeyroSpace
2006-02-14 10:40
2006.03.19
Обработка ошибок при инициализации приложения


4-1131958580
Чапаев
2005-11-14 11:56
2006.03.19
Непонятности с GetWindowModuleFileName





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский