Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.02.2012, 15:44   #1
Zhigool'
Пользователь
 
Регистрация: 11.07.2010
Сообщений: 29
По умолчанию масштабирование кнопки относительно родительского окна (fasm)

Привет всем!
Сделал окно в котором есть кнопка. Эта кнопка должна заполнять всё окно при изменении размеров этого окна, т.е. её размеры тоже должны изменяться. Как это реализовать?
Код:
format PE GUI 4.0
entry start
include 'win32w.inc'
include 'encoding\win1251.inc'

section '.data' data readable writeable
_class TCHAR 'Simple Window',0
_title TCHAR 'Простая кнопка',0
_error TCHAR 'Ошибка',0
_classa TCHAR 'BUTTON',0
_text TCHAR 'Кнопка A',0

wc WNDCLASS 0,WindowProc,0,0,0,0,0,COLOR_BTNFACE+1,0,_class

msg MSG

section '.code' code readable executable

start:

invoke GetModuleHandle,0

mov [wc.hInstance],eax

invoke LoadIcon,0,IDI_APPLICATION

mov [wc.hIcon],eax

invoke LoadCursor,0,IDC_ARROW

mov [wc.hCursor],eax

invoke RegisterClass,wc

test eax,eax

jz error

invoke CreateWindowEx,WS_EX_APPWINDOW,_class,_title,WS_SIZEBOX+WS_VISIBLE+WS_DLGFRAME+WS_SYSMENU,128,128,256,192,0,0,[wc.hInstance],0

cmp eax,0

je error

msg_loop:

invoke GetMessage,msg,NULL,0,0

cmp eax,0

je end_loop

invoke TranslateMessage,msg

invoke DispatchMessage,msg

jmp msg_loop

error:

invoke MessageBox,0,_error,'(',MB_OK

end_loop:

invoke ExitProcess,[msg.wParam]

;==================================================

proc WindowProc hwnd,wmsg,wparam,lparam

push ebx esi edi

cmp [wmsg],WM_CREATE

je .wmcreate

cmp [wmsg],WM_COMMAND

je .wmcommand

cmp [wmsg],WM_DESTROY

je .wmdestroy

;==================================================
.defwndproc:

invoke DefWindowProc,[hwnd],[wmsg],[wparam],[lparam]

jmp .finish

.wmcreate:

invoke CreateWindowEx,0,_classa,_text,WS_VISIBLE+WS_CHILD+BS_PUSHBUTTON,0,0,249,165,[hwnd],1001,[wc.hInstance],NULL

jmp .finish

.wmcommand:

cmp [wparam],1001

invoke MessageBox,[hwnd],_text,_title,0

invoke InvalidateRect,[hwnd],0

jmp .finish

.wmdestroy:

invoke PostQuitMessage,0

mov eax,0

.finish:

pop edi esi ebx

ret

endp


section '.idata' import data readable writeable

  library kernel32,'KERNEL32.DLL',\
          user32,'USER32.DLL'

  include 'api\kernel32.inc'
  include 'api\user32.inc'
Zhigool' вне форума Ответить с цитированием
Старый 05.02.2012, 19:32   #2
Zhigool'
Пользователь
 
Регистрация: 11.07.2010
Сообщений: 29
По умолчанию

Насколько я понял алгоритм должен быть следующим:
1) при изменении размера родительского окна, выполняется функция GetClientPos()
2) получившиеся значения в структуре RECT запоминаются
3) вызывается функция SetWindowPos() для кнопки с аргументами из поля RECT
4) перерисовываем кнопку уже с новыми параметрами с помощью InvalidateRect() и UpdateWindow().
Форумчане, я правильно мыслю?
Zhigool' вне форума Ответить с цитированием
Старый 05.02.2012, 19:48   #3
vadimych
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 325
По умолчанию

Zhigool', на масм:
Код:
cmp mesg,WM_SIZE
jnz @f
invoke GetClientRect,hwnd,addr rect
invoke MoveWindow,hbutton,0,0,rect.right,rect.bottom,1
vadimych вне форума Ответить с цитированием
Старый 05.02.2012, 19:57   #4
Zhigool'
Пользователь
 
Регистрация: 11.07.2010
Сообщений: 29
По умолчанию

vadimych,
Код:
;==================================================

proc WindowProc hwnd,wmsg,wparam,lparam

push ebx esi edi

cmp [wmsg],WM_CREATE

je .wmcreate

cmp [wmsg],WM_COMMAND

je .wmcommand

cmp [wmsg],WM_DESTROY

je .wmdestroy

cmp [wmsg],WM_SIZE

je .wmsize

;==================================================
.defwndproc:

invoke DefWindowProc,[hwnd],[wmsg],[wparam],[lparam]

jmp .finish

.wmcreate:

invoke CreateWindowEx,0,_classa,_text,WS_VISIBLE+WS_CHILD+BS_PUSHBUTTON,0,0,249,165,[hwnd],1001,[wc.hInstance],NULL

jmp .finish

.wmcommand:

cmp [wparam],1001

invoke MessageBox,[hwnd],_text,_title,0

jmp .finish

.wmsize:

invoke GetClientRect,[hwnd],rc

invoke MoveWindow,1001,[rc.left],[rc.top],[rc.right],[rc.bottom],1

;invoke InvalidateRect,1001,rc,0

jmp .finish

.wmdestroy:

invoke PostQuitMessage,0

mov eax,0

.finish:

pop edi esi ebx

ret

endp
не получается...
Zhigool' вне форума Ответить с цитированием
Старый 05.02.2012, 20:19   #5
vadimych
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 325
По умолчанию

Zhigool', 1001 - что такое? Хэндл кнопки сохраните в переменной после её создания. И его используйте.
vadimych вне форума Ответить с цитированием
Старый 05.02.2012, 20:34   #6
Zhigool'
Пользователь
 
Регистрация: 11.07.2010
Сообщений: 29
По умолчанию

vadimych,

Код:
....
handl dd ? 
....

.wmcreate:

invoke CreateWindowEx,0,_classa,_text,WS_VISIBLE+WS_CHILD+BS_PUSHBUTTON,0,0,249,165,[hwnd],1001,[wc.hInstance],NULL

mov [handl], eax

jmp .finish
Так? не получается...(

Последний раз редактировалось Zhigool'; 05.02.2012 в 20:36.
Zhigool' вне форума Ответить с цитированием
Старый 05.02.2012, 20:42   #7
Zhigool'
Пользователь
 
Регистрация: 11.07.2010
Сообщений: 29
По умолчанию

ПОЛУЧИЛОСЬ!!!! ))))))))
Код:
format PE GUI 4.0
entry start
include 'win32w.inc'
include 'encoding\win1251.inc'

section '.data' data readable writeable
_class TCHAR 'Simple Window',0
_title TCHAR 'Простая кнопка ',0
_error TCHAR 'Ошибка',0
_classa TCHAR 'BUTTON',0
_text TCHAR 'Кнопка A',0

handl dd ?

wc WNDCLASS 0,WindowProc,0,0,0,0,0,COLOR_BTNFACE+1,0,_class

msg MSG

rc RECT

section '.code' code readable executable

start:

invoke GetModuleHandle,0

mov [wc.hInstance],eax

invoke LoadIcon,0,IDI_APPLICATION

mov [wc.hIcon],eax

invoke LoadCursor,0,IDC_ARROW

mov [wc.hCursor],eax

invoke RegisterClass,wc

test eax,eax

jz error

invoke CreateWindowEx,WS_EX_APPWINDOW,_class,_title,WS_SIZEBOX+WS_VISIBLE+WS_DLGFRAME+WS_SYSMENU,128,128,256,192,0,0,[wc.hInstance],0

cmp eax,0

je error

msg_loop:

invoke GetMessage,msg,NULL,0,0

cmp eax,0

je end_loop

invoke TranslateMessage,msg

invoke DispatchMessage,msg

jmp msg_loop

error:

invoke MessageBox,0,_error,'(',MB_OK

end_loop:

invoke ExitProcess,[msg.wParam]

;==================================================

proc WindowProc hwnd,wmsg,wparam,lparam

push ebx esi edi

cmp [wmsg],WM_CREATE

je .wmcreate

cmp [wmsg],WM_COMMAND

je .wmcommand

cmp [wmsg],WM_DESTROY

je .wmdestroy

cmp [wmsg],WM_SIZE

je .wmsize

;==================================================
.defwndproc:

invoke DefWindowProc,[hwnd],[wmsg],[wparam],[lparam]

jmp .finish

.wmcreate:

invoke CreateWindowEx,0,_classa,_text,WS_VISIBLE+WS_CHILD+BS_PUSHBUTTON,0,0,249,165,[hwnd],1001,[wc.hInstance],NULL

mov [handl], eax

jmp .finish

.wmcommand:

cmp [wparam],1001

invoke MessageBox,[hwnd],_text,_title,0

jmp .finish

.wmsize:

invoke GetClientRect,[hwnd],rc

invoke MoveWindow,[handl],[rc.left],[rc.top],[rc.right],[rc.bottom],1

;invoke UpdateWindow,[hwnd]

;invoke InvalidateRect,1001,rc,0

jmp .finish

.wmdestroy:

invoke PostQuitMessage,0

mov eax,0

.finish:

pop edi esi ebx

ret

endp


section '.idata' import data readable writeable

  library kernel32,'KERNEL32.DLL',\
          user32,'USER32.DLL'

  include 'api\kernel32.inc'
  include 'api\user32.inc'
Пользуйтесь, кому надо!

Огромное спасибо vadimych'у!!

Последний раз редактировалось Zhigool'; 05.02.2012 в 20:45.
Zhigool' вне форума Ответить с цитированием
Старый 05.02.2012, 20:46   #8
vadimych
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 325
По умолчанию

Код:
proc WindowProc hwnd,wmsg,wparam,lparam
local rc:RECT

push ebx esi edi

cmp [wmsg],WM_CREATE

je .wmcreate

cmp [wmsg],WM_DESTROY

je .wmdestroy

cmp [wmsg],WM_SIZE

je .wmsize

;==================================================
.defwndproc:

invoke DefWindowProc,[hwnd],[wmsg],[wparam],[lparam]

jmp .finish

.wmcreate:

invoke CreateWindowEx,0,_classa,_text,WS_VISIBLE+WS_CHILD+BS_PUSHBUTTON,0,0,0,0,[hwnd],0,0,0
mov [hbutton],eax
jmp .finish

.wmsize:
lea ebx,[rc]
invoke GetClientRect,[hwnd],ebx

invoke MoveWindow,[hbutton],0,0,[rc.right],[rc.bottom],1


jmp .finish

.wmdestroy:

invoke PostQuitMessage,0

mov eax,0

.finish:

pop edi esi ebx

ret

endp
vadimych вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как привязать таблицу нового modal окна к Dataset динамически созданного родительского окна? delphicoding Общие вопросы Delphi 6 02.10.2011 22:41
JQuery — Вызов из iframe функции родительского окна JTG JavaScript, Ajax 4 29.03.2011 17:47
Масштабирование окна при разных разрешениях artemavd Общие вопросы Delphi 1 16.07.2009 17:15
Как закрепить картинку относительно окна браузера? Svetix HTML и CSS 18 18.04.2009 23:12
Получить Handle TEdit'a, зная дескриптор родительского окна Cold_Night Win Api 2 13.02.2009 16:47