Сейчас на форуме: hgdagon, asfa (+4 невидимых)

 eXeL@B —› Программирование —› Перемещение окна за любую область
Посл.ответ Сообщение


Ранг: 107.6 (ветеран)
Активность: 0.110
Статус: Участник

Создано: 15 июня 2007 20:54
· Личное сообщение · #1

Привет всем!
Слышал, что существует АПИ-функция, позволяющая перемещать окно за любую область. Кто-нить о такой знает?
И вообще, как такое на Borland C++ реализовать?

-----
программистом не рождаются - им умирают





Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 15 июня 2007 20:58
· Личное сообщение · #2

то есть "за любую область"? SetWindowPos() ?



Ранг: 309.8 (мудрец), 21thx
Активность: 0.170
Статус: Участник

Создано: 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.120
Статус: Участник
John Smith

Создано: 15 июня 2007 21:02
· Личное сообщение · #4

а мне кажется за любое место в диалоге таскать. ждём вразумительного описания воппроса...

-----
Недостаточно только получить знания:надо найти им приложение




Ранг: 226.0 (наставник), 67thx
Активность: 0.160
Статус: Участник

Создано: 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.070
Статус: Участник

Создано: 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.120
Статус: Участник

Создано: 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.110
Статус: Участник

Создано: 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.010
Статус: Участник

Создано: 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.080
Статус: Участник

Создано: 16 июня 2007 08:40
· Личное сообщение · #10

Gambit пишет:
case WM_LBUTTONDOWN:
{
SendMessage (hWnd,WM_SYSCOMMAND,61458,0);
}

а ReleaseCapture?

-----
radio uno in ibisa ...




Ранг: 26.1 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 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.110
Статус: Участник

Создано: 16 июня 2007 11:13
· Личное сообщение · #12

Icelot пишет:
а ReleaseCapture?

А это обязательно? У меня без него работает =\

-----
программистом не рождаются - им умирают





Ранг: 85.4 (постоянный)
Активность: 0.080
Статус: Участник

Создано: 16 июня 2007 11:19
· Личное сообщение · #13

Gambit желательно сделать, в мсдн почитай чего она делает.

-----
radio uno in ibisa ...





Ранг: 107.6 (ветеран)
Активность: 0.110
Статус: Участник

Создано: 16 июня 2007 11:55
· Личное сообщение · #14

Да нет, я ни одной ф-ции не использую без того чтобы в мсдн залезть)) Вот только я так и не понял: зачем она в моем случае, если и без нее моя прога работает ?
ЗЫ: Причем, работает даже на Win98 (только что на VMware проверил)...

-----
программистом не рождаются - им умирают





Ранг: 85.4 (постоянный)
Активность: 0.080
Статус: Участник

Создано: 16 июня 2007 13:13
· Личное сообщение · #15

Эта функция освобождает окно от захвата сообщений мыши. У тебя работает нормально, т.к. захват не был установлен до этого. Если вдруг будет(SetCapture) то хз, как окно тогда будет перемещаться. Судя по всему не правильно)

-----
radio uno in ibisa ...





Ранг: 107.6 (ветеран)
Активность: 0.110
Статус: Участник

Создано: 16 июня 2007 13:46
· Личное сообщение · #16

Icelot пишет:
Если вдруг будет(SetCapture) то хз, как окно тогда будет перемещаться.

Но ведь SetCapture на мое окно могу установить только я и получается, что если я не вызывал эту апишку, то и ReleaseCapture мне не нужен, так?)

-----
программистом не рождаются - им умирают




Ранг: 26.1 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 16 июня 2007 14:00
· Личное сообщение · #17

Gambit пишет:
Но ведь SetCapture на мое окно могу установить только я и получается, что если я не вызывал эту апишку, то и ReleaseCapture мне не нужен, так?)


Кто мешает другому узнать HWND твоего окна и сделать SetCapture? Почетче выражайся ;)




Ранг: 85.4 (постоянный)
Активность: 0.080
Статус: Участник

Создано: 16 июня 2007 14:24
· Личное сообщение · #18

ИМХО надёжность дороже пары байт ;)

-----
radio uno in ibisa ...





Ранг: 107.6 (ветеран)
Активность: 0.110
Статус: Участник

Создано: 16 июня 2007 14:45
· Личное сообщение · #19

Лана, лана, пожалуй правда надежность дороже)

-----
программистом не рождаются - им умирают





Ранг: 107.6 (ветеран)
Активность: 0.110
Статус: Участник

Создано: 17 июня 2007 22:50
· Личное сообщение · #20

Нигде не могу найти нормальный тутор, как вручную создавать и прикреплять ресурсы на Borland C++. Подскажите, плиз, где можно найти?

-----
программистом не рождаются - им умирают





Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
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.110
Статус: Участник

Создано: 17 июня 2007 23:36
· Личное сообщение · #22

Hellspawn пишет:
кликаешь project -> Add to Project -> выбираешь тип файла

Не-е Я мазохист ;)
Мне интересно именно как это делать полностью ручками. А "полу-автоматически" - таких у меня статей дцать точно есть

-----
программистом не рождаются - им умирают





Ранг: 107.6 (ветеран)
Активность: 0.110
Статус: Участник

Создано: 30 июня 2007 10:12 · Поправил: Gambit
· Личное сообщение · #23

Если кому интересно, то нормальное описание подключения ресурсов здесь:
_http://www.tiflocomp.ru/docs/programming/bcc_free.php

-----
программистом не рождаются - им умирают



 eXeL@B —› Программирование —› Перемещение окна за любую область
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати