Главная страница
    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-1140739183
Zacho
2006-02-24 02:59
2006.03.19
NEC ND4551A &amp; Light Scribe


15-1141060551
whisky
2006-02-27 20:15
2006.03.19
Поиск компонентов


3-1138471115
einstein
2006-01-28 20:58
2006.03.19
Преобразование значения ячейки (PAnsiChar в String)


15-1140778361
Суслик
2006-02-24 13:52
2006.03.19
Вопрос про перечилимые типы


2-1141628718
mfender
2006-03-06 10:05
2006.03.19
TTreeView &amp; OnChange





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский