| Посл.ответ | 
Сообщение | 
  Ранг: 107.6 (ветеран) Активность: 0.11↘0 Статус: Участник 
 
 | 
Создано: 15 июня 2007 20:54   · Личное сообщение ·  #1 
Привет всем!
 Слышал, что существует АПИ-функция, позволяющая перемещать окно за любую область. Кто-нить о такой знает?
 И вообще, как такое на Borland C++ реализовать?
 ----- программистом не рождаются - им умирают  | Сообщение посчитали полезным:  | 
 | 
  Ранг: 387.4 (мудрец) Активность: 0.17↘0 Статус: Участник системщик 
 
 | 
Создано: 15 июня 2007 20:58   · Личное сообщение ·  #2 
то есть "за любую область"? SetWindowPos() ?
   | Сообщение посчитали полезным:  | 
 Ранг: 309.8 (мудрец), 21thx Активность: 0.17↘0 Статус: Участник 
 
 | 
Создано: 15 июня 2007 21:02   · Личное сообщение ·  #3 
из DialogProc:
 
 	.elseif [wParam]==WM_LBUTTONDOWN
 		invoke ReleaseCapture
 		invoke SendMessage,[hWin],WM_SYSCOMMAND,0F012h,0 ; Magic number =)
----- Shalom ebanats!  | Сообщение посчитали полезным:  | 
  Ранг: 260.9 (наставник) Активность: 0.12↘0 Статус: Участник John Smith 
 
 | 
Создано: 15 июня 2007 21:02   · Личное сообщение ·  #4 
а мне кажется за любое место в диалоге таскать. ждём вразумительного описания воппроса...
 ----- Недостаточно только получить знания:надо найти им приложение  | Сообщение посчитали полезным:  | 
 Ранг: 226.0 (наставник), 67thx Активность: 0.16↘0 Статус: Участник 
 
 | 
Создано: 15 июня 2007 21:08 · Поправил: SergX   · Личное сообщение ·  #5 
Нужно обрабатывать сообщения.
 На делфи можно так:
 procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
 begin
 //Form1.AlphaBlend:=True; Form1.AlphaBlendValue:=180;
 ReleaseCapture;
 Perform(WM_SYSCOMMAND, $F012, 0);
 //Form1.AlphaBlend:=False; Form1.AlphaBlendValue:=245;
 end;
 Или так:
 Function XXX(hWin: HWND; uMsg: UINT; wp: WPARAM; lp: LPARAM): bool; stdcall;
 Begin
 Case uMsg of
 WM_LBUTTONDOWN:
  Begin
  Result:=BOOL(DefWindowProc(hWin, uMsg, wp, lp));
  PostMessage(hWin, WM_SYSCOMMAND, $f012, 0);
  End;
 .
 .
 .
 WM_DESTROY, WM_CLOSE: PostQuitMessage(0);
 End;
 End;
   | Сообщение посчитали полезным:  | 
 Ранг: 115.1 (ветеран), 3thx Активность: 0.07↘0 Статус: Участник 
 
 | 
Создано: 15 июня 2007 21:10   · Личное сообщение ·  #6 
format PE GUI 4.0
 entry start
 include '%fasminc%\win32a.inc'
 IDC_EXIT   = 100
 HTCAPTION  =   2
 macro WM_CASE reg, [msg]
 {
   forward
     cmp reg, WM_#msg
     je .#msg
 }
 section '.rsrc' code readable writeable executable
 data resource
  ; resource directory
   directory RT_DIALOG,dialogs,
             RT_ICON, icons,
             RT_GROUP_ICON, group_icons
  ; resource subdirectories
   resource dialogs,
            200, LANG_ENGLISH+SUBLANG_DEFAULT, main_dialog
   resource icons,
            1, LANG_NEUTRAL, icon_data
   resource group_icons,
            400, LANG_NEUTRAL, main_icon
   dialog main_dialog,'Test',0,0,164,140,DS_MODALFRAME+DS_CENTER+WS_POPUP+WS_VIS IBLE+WS_CAPTION+WS_SYSMENU,
                                         WS_EX_DLGMODALFRAME, ,'Tahoma',8
     dialogitem 'BUTTON','Exit',IDC_EXIT,115,120,42,14,WS_VISIBLE+WS_TABSTOP+BS_DEFPUS HBUTTON
   enddialog
   icon main_icon, icon_data, 'ida.ico'
 end data
 align 4
 proc DlgProc, hDlg, uMsg, wParam, lParam
     mov eax, [uMsg]
     WM_CASE eax, INITDIALOG, COMMAND, CLOSE, LBUTTONDOWN
 .r0:
     xor eax, eax
     jmp .return
 .INITDIALOG:
     invoke LoadIcon, [hInstance], 400
     invoke SendMessage, [hDlg], WM_SETICON, ICON_BIG, eax
     jmp .r1
 .COMMAND:
     mov eax, [wParam]
     cmp ax, IDCANCEL
     je .exit
     cmp ax, IDC_EXIT
     jne .r0
 .exit:
     invoke SendMessage, [hDlg], WM_CLOSE, 0, 0
     jmp .r1
 .LBUTTONDOWN:
     invoke SendMessage, [hDlg], WM_NCLBUTTONDOWN, HTCAPTION, [lParam]
     jmp .r1
 .CLOSE:
     invoke EndDialog, [hDlg], 0
 .r1:
     xor eax, eax
     inc eax
 .return:
     ret
 endp
 start:
     invoke GetModuleHandle, NULL
     mov [hInstance], eax
     invoke DialogBoxParam, eax, 200, 0, DlgProc, 0
     invoke ExitProcess, 0
 hInstance       dd  ?
 data import
 library kernel32,'KERNEL32.DLL',
         user32,'USER32.DLL'
 include '%fasminc%\APIA\KERNEL32.INC'
 include '%fasminc%\APIA\USER32.INC'
 end data
   | Сообщение посчитали полезным:  | 
 Ранг: 161.0 (ветеран) Активность: 0.12↘0 Статус: Участник 
 
 | 
Создано: 15 июня 2007 21:34   · Личное сообщение ·  #7 
private
     { Private declarations }
       procedure WMNCHitTest(var M: TWMNCHitTest); 
                  message wm_NCHitTest;
 procedure TForm1. WMNCHitTest(var M: TWMNCHitTest);
 begin 
  inherited; 
   with M do
      if M.Result = htClient then 
     M.Result := htCaption;
 end;
   | Сообщение посчитали полезным:  | 
  Ранг: 107.6 (ветеран) Активность: 0.11↘0 Статус: Участник 
 
 | 
Создано: 15 июня 2007 23:09 · Поправил: Gambit   · Личное сообщение ·  #8 
Фига се.. ответов!   
s0larian пишет:
 то есть "за любую область"? SetWindowPos() ? 
Rascal пишет:
 а мне кажется за любое место в диалоге таскать 
Я имел ввиду следующий случай. Есть простое окно (типа того, что описано в одном из первых туторов айсилона).  Стиль окна WS_OVERLAPPEDWINDOW, т.е. оно имеет заголовок и все, что на нем полагается. Перемещать окно (при помощи крысы) можно только за заголовок. Что можно сделать, чтобы была возможность перемещать окно мышкой не только за заголовок, но и за любую его область?
 SLV
Пасиба!!!
 С асма перевел на С++, если кому интересно, это выглядит так:
 case WM_LBUTTONDOWN:
 {
 SendMessage (hWnd,WM_SYSCOMMAND,61458,0);
 }
И ЭТО РАБОТАЕТ     
----- программистом не рождаются - им умирают  | Сообщение посчитали полезным:  | 
 Ранг: 17.3 (новичок), 1thx Активность: 0.01↘0 Статус: Участник 
 
 | 
Создано: 16 июня 2007 01:56   · Личное сообщение ·  #9 
Я делал как  __ на fasm. Если в кратце, то:
 
 WM_NCLBUTTONDOWN equ 0a1h	
 HTCAPTION	 equ 2
 ...
 proc DialogProc,hwnddlg,msg,wparam,lparam
 ...
     cmp    [msg],WM_LBUTTONDOWN 	
     je	      move
 ...
     move:
     invoke SendMessage,[hwnddlg],WM_NCLBUTTONDOWN,HTCAPTION, 0
     jmp     processed
 ...
     processed:
     xor eax,eax
     ret
  | Сообщение посчитали полезным:  | 
  Ранг: 85.4 (постоянный) Активность: 0.08↘0 Статус: Участник 
 
 | 
Создано: 16 июня 2007 08:40   · Личное сообщение ·  #10 
Gambit пишет:
 case WM_LBUTTONDOWN: 
 { 
 SendMessage (hWnd,WM_SYSCOMMAND,61458,0); 
 } 
а ReleaseCapture?
 -----  radio uno in ibisa ...  | Сообщение посчитали полезным:   | 
 Ранг: 26.1 (посетитель) Активность: 0.01↘0 Статус: Участник 
 
 | 
Создано: 16 июня 2007 09:32 · Поправил: tum0rc0re   · Личное сообщение ·  #11 
Еще как вариант   
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
   Shift: TShiftState; X, Y: Integer);
 begin
   if Button = mbLeft then
   begin
     ReleaseCapture;
     Perform(WM_SYSCOMMAND, SC_MOVE or HTCAPTION, 0);
   end;
 end;
  | Сообщение посчитали полезным:  | 
  Ранг: 107.6 (ветеран) Активность: 0.11↘0 Статус: Участник 
 
 | 
Создано: 16 июня 2007 11:13   · Личное сообщение ·  #12 
Icelot пишет:
 а ReleaseCapture? 
А это обязательно? У меня без него работает =\
 ----- программистом не рождаются - им умирают  | Сообщение посчитали полезным:   | 
  Ранг: 85.4 (постоянный) Активность: 0.08↘0 Статус: Участник 
 
 | 
Создано: 16 июня 2007 11:19   · Личное сообщение ·  #13 
Gambit желательно сделать, в мсдн почитай чего она делает.
 -----  radio uno in ibisa ...  | Сообщение посчитали полезным:   | 
  Ранг: 107.6 (ветеран) Активность: 0.11↘0 Статус: Участник 
 
 | 
Создано: 16 июня 2007 11:55   · Личное сообщение ·  #14 
Да нет, я ни одной ф-ции не использую без того чтобы в мсдн залезть)) Вот только я так и не понял: зачем она в моем случае, если и без нее моя прога работает ?
 ЗЫ: Причем, работает даже на Win98 (только что на VMware проверил)...
 ----- программистом не рождаются - им умирают  | Сообщение посчитали полезным:  | 
  Ранг: 85.4 (постоянный) Активность: 0.08↘0 Статус: Участник 
 
 | 
Создано: 16 июня 2007 13:13   · Личное сообщение ·  #15 
Эта функция освобождает окно от захвата сообщений мыши. У тебя работает нормально, т.к. захват не был установлен до этого. Если вдруг будет(SetCapture) то хз, как окно тогда будет перемещаться. Судя по всему не правильно)
 -----  radio uno in ibisa ...  | Сообщение посчитали полезным:  | 
  Ранг: 107.6 (ветеран) Активность: 0.11↘0 Статус: Участник 
 
 | 
Создано: 16 июня 2007 13:46   · Личное сообщение ·  #16 
Icelot пишет:
 Если вдруг будет(SetCapture) то хз, как окно тогда будет перемещаться. 
Но ведь SetCapture на мое окно могу установить только я и получается, что если я не вызывал эту апишку, то и ReleaseCapture мне не нужен, так?)
 ----- программистом не рождаются - им умирают  | Сообщение посчитали полезным:   | 
 Ранг: 26.1 (посетитель) Активность: 0.01↘0 Статус: Участник 
 
 | 
Создано: 16 июня 2007 14:00   · Личное сообщение ·  #17 
Gambit пишет:
 Но ведь SetCapture на мое окно могу установить только я и получается, что если я не вызывал эту апишку, то и ReleaseCapture мне не нужен, так?) 
Кто мешает другому узнать HWND твоего окна и сделать SetCapture?    Почетче выражайся ;)
   | Сообщение посчитали полезным:   | 
  Ранг: 85.4 (постоянный) Активность: 0.08↘0 Статус: Участник 
 
 | 
Создано: 16 июня 2007 14:24   · Личное сообщение ·  #18 
ИМХО надёжность дороже пары байт ;)
 -----  radio uno in ibisa ...  | Сообщение посчитали полезным:  | 
  Ранг: 107.6 (ветеран) Активность: 0.11↘0 Статус: Участник 
 
 | 
Создано: 16 июня 2007 14:45   · Личное сообщение ·  #19 
Лана, лана, пожалуй правда надежность дороже)
 ----- программистом не рождаются - им умирают  | Сообщение посчитали полезным:  | 
  Ранг: 107.6 (ветеран) Активность: 0.11↘0 Статус: Участник 
 
 | 
Создано: 17 июня 2007 22:50   · Личное сообщение ·  #20 
Нигде не могу найти нормальный тутор, как вручную создавать и прикреплять ресурсы на Borland C++.   Подскажите, плиз, где можно найти?
 ----- программистом не рождаются - им умирают  | Сообщение посчитали полезным:  | 
  Ранг: 990.2 (! ! !), 380thx Активность: 0.68↘0 Статус: Модератор Author of DiE 
 
 | 
Создано: 17 июня 2007 23:23 · Поправил: Hellspawn   · Личное сообщение ·  #21 
не знаю как в Borland C++, но в дельфях можно сделать полу-автоматически)))
 кликаешь project -> Add to Project -> выбираешь тип файла *.rc и открываешь test.rc
 test.rc:
 имя_ресурса тип_ресурса сам_ресурс
 Test RCDATA test.exe
 всё) дальше в папке появится test.res а в юните {$R 'test.res' 'test.rc'}   
а создать можно ресур хакером   
----- [nice coder and reverser]  | Сообщение посчитали полезным:  | 
  Ранг: 107.6 (ветеран) Активность: 0.11↘0 Статус: Участник 
 
 | 
Создано: 17 июня 2007 23:36   · Личное сообщение ·  #22 
Hellspawn пишет:
 кликаешь project -> Add to Project -> выбираешь тип файла 
Не-е    Я мазохист ;)
 Мне интересно именно как это делать полностью ручками. А "полу-автоматически" - таких у меня статей дцать точно есть   
----- программистом не рождаются - им умирают  | Сообщение посчитали полезным:   | 
  Ранг: 107.6 (ветеран) Активность: 0.11↘0 Статус: Участник 
 
 | 
Создано: 30 июня 2007 10:12 · Поправил: Gambit   · Личное сообщение ·  #23 
Если кому интересно, то нормальное описание подключения ресурсов здесь:
 _http://www.tiflocomp.ru/docs/programming/bcc_free.php
 ----- программистом не рождаются - им умирают  | Сообщение посчитали полезным:  |