Форум программистов, компьютерный форум, киберфорум
Наши страницы

Assembler для начинающих

Войти
Регистрация
Восстановить пароль
 
Boogerman
1 / 1 / 0
Регистрация: 22.09.2013
Сообщений: 22
#1

Сворачивание и разворачивание окон - Assembler

10.11.2013, 09:14. Просмотров 502. Ответов 5
Метки нет (Все метки)

Здравствуйте!!! Мне нужно вывести на экран три окна. Щелчок левой кнопкой в правой половине любого окна приводит к свертке в пиктограмму остальных. Обратное разворачивание, если они уже свернуты, осуществить при
нажатии любой цифровой клавиши. Я пишу на MASM. Написал главную функцию, а вот с оконной трудности, а именно, не знаю, как реализовать свёртывание и развёртывание окон. Подскажите пожалуйста, как это реализовать. Заранее спасибо!!!
Вот мой код:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
.386
.model flat,stdcall
option casemap:none
include c:\masm32\include\windows.inc
include c:\masm32\include\user32.inc
include c:\masm32\include\kernel32.inc
includelib c:\masm32\lib\user32.lib
includelib c:\masm32\lib\kernel32.lib
WinMain proto :DWORD,:DWORD,:DWORD,:DWORD
.data
WinName1 db "Окно №1",0
WinName2 db "Окно №2",0
WinName3 db "Окно №3",0
X1 DWORD ?
Y1 DWORD ?
X2 DWORD ?
Y2 DWORD ?
X3 DWORD ?
Y3 DWORD ?
hWnd1 HWND ?
hWnd2 HWND ?
hWnd3 HWND ?
hInstance HINSTANCE ?
CommandLine LPSTR ?
.code
start:
invoke GetModuleHandle, NULL
mov hInstance,eax
invoke GetCommandLine
mov CommandLine,eax
invoke WinMain, hInstance,NULL,CommandLine,SW_SHOWDEFAULT
;запуск WinMain и после ее завершения остановка
;процесса
invoke ExitProcess,eax
 
 
WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
LOCAL wc1:WNDCLASSEX
LOCAL wc2:WNDCLASSEX
LOCAL wc3:WNDCLASSEX
 
; WNDCLASSEX аналогична WNDCLASS за исключением 2
;полей cbSize – размера структуры в байтах и hIconSm –
;дескриптора пиктограммы приложения размером 16х16,
;используемой в заголовке окна данного класса
LOCAL msg:MSG
 
 
mov X1,500
mov Y1,350
 
; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ окно №1 ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
 
mov wc1.cbSize,SIZEOF WNDCLASSEX
mov wc1.style, CS_HREDRAW or CS_VREDRAW; or CS_DBLCLKS
; стиль класса обеспечивает реакцию на двойные щелчки
 
; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ задание стиля окна №1¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
 
mov wc1.lpfnWndProc, OFFSET WndProc
mov wc1.cbClsExtra,NULL
mov wc1.cbWndExtra,NULL
push hInstance
pop wc1.hInstance
mov wc1.hbrBackground,COLOR_BTNFACE+1
mov wc1.lpszMenuName,NULL
mov wc1.lpszClassName,OFFSET WinName1
invoke LoadIcon,NULL,IDI_APPLICATION
mov wc1.hIcon,eax
mov wc1.hIconSm,eax
invoke LoadCursor,NULL,IDC_CROSS
mov wc1.hCursor,eax
 
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
invoke RegisterClassEx, addr wc1
 
mov X2,200
mov Y2,150
; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ окно №2 ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
 
mov wc2.cbSize,SIZEOF WNDCLASSEX
mov wc2.style, CS_HREDRAW or CS_VREDRAW; or CS_DBLCLKS
; стиль класса обеспечивает реакцию на двойные щелчки
 
; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ задание стиля окна №2¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
 
mov wc2.lpfnWndProc, OFFSET WndProc
mov wc2.cbClsExtra,NULL
mov wc2.cbWndExtra,NULL
push hInstance
pop wc2.hInstance
mov wc2.hbrBackground,COLOR_BTNFACE+1
mov wc2.lpszMenuName,NULL
mov wc2.lpszClassName,OFFSET WinName2
invoke LoadIcon,NULL,IDI_APPLICATION
mov wc2.hIcon,eax
mov wc2.hIconSm,eax
invoke LoadCursor,NULL,IDC_CROSS
mov wc2.hCursor,eax
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
 
invoke RegisterClassEx, addr wc2
 
mov X3,250
mov Y3,200
 
; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ окно №3 ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
 
mov wc3.cbSize,SIZEOF WNDCLASSEX
mov wc3.style, CS_HREDRAW or CS_VREDRAW; or CS_DBLCLKS
; стиль класса обеспечивает реакцию на двойные щелчки
 
; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ задание стиля окна №3¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
 
mov wc3.lpfnWndProc, OFFSET WndProc
mov wc3.cbClsExtra,NULL
mov wc3.cbWndExtra,NULL
push hInstance
pop wc3.hInstance
mov wc3.hbrBackground,COLOR_BTNFACE+1
mov wc3.lpszMenuName,NULL
mov wc3.lpszClassName,OFFSET WinName3
invoke LoadIcon,NULL,IDI_APPLICATION
mov wc3.hIcon,eax
mov wc3.hIconSm,eax
invoke LoadCursor,NULL,IDC_CROSS
mov wc3.hCursor,eax
;***********************************************************************************
invoke RegisterClassEx, addr wc3
 
 
INVOKE CreateWindowEx,NULL,ADDR WinName1,
ADDR WinName1, WS_OVERLAPPEDWINDOW,200, 200,
X1,Y1,NULL, NULL,hInst,NULL
 
mov hWnd1,eax
invoke ShowWindow, hWnd1,SW_SHOWNORMAL
invoke UpdateWindow, hWnd1
 
 
 
 
INVOKE CreateWindowEx,NULL,ADDR WinName2,
ADDR WinName2, WS_OVERLAPPEDWINDOW,600, 300,
X2,Y2,NULL, NULL,hInst,NULL
 
mov hWnd2,eax
invoke ShowWindow, hWnd2,SW_SHOWNORMAL
invoke UpdateWindow, hWnd2
 
 
 
INVOKE CreateWindowEx,NULL,ADDR WinName3,
ADDR WinName3, WS_OVERLAPPEDWINDOW,650, 400,
X3,Y3,NULL, NULL,hInst,NULL
 
mov hWnd3,eax
invoke ShowWindow, hWnd3,SW_SHOWNORMAL
invoke UpdateWindow, hWnd3
 
 
 
.WHILE TRUE
begin: invoke GetMessage, ADDR msg,NULL,0,0
.BREAK .IF (!eax)
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
.ENDW
mov eax,msg.wParam
ret
WinMain endp
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.11.2013, 09:14
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Сворачивание и разворачивание окон (Assembler):

Перманентное сворачивание Internet Explorer - Assembler
День добрый, подскажите пожалуйста, как можно сделать так, чтобы после того, как я свернул IE, можно было его развернуть только введя...

Сворачивание курсора (резидентная программа) - Assembler
Здравствуйте. Нужна помощь. Нужно написать резидентную программу, которая бы в текстовом режиме работы монитора реализовала сворачивание...

Выравнивание окон :) - Assembler
include '%fasm%/win64ax.inc' section '.code' executable start: sub rsp,8 sh: invoke...

Закрытие всех окон - Assembler
Здравствуйте. Подскажите, пожалуйста, как при запуске программы закрыть все открытые окна, кроме своего. Если можно, то киньте код. ...

По верх остальных окон - Assembler
Есть разные программы, которые могут быть открыты по верх остальных окон.(Например Light Alloy). Могу ли я сделать свою программу такой...

Сворачивание и разворачивание окон - C++ Builder
У меня есть главная форма, есть несколько дочерних. В главной я кнопкой выбираю дочернюю, она открывается Show, главная скрывается Hide....

5
Not at all!
108 / 190 / 18
Регистрация: 06.10.2013
Сообщений: 360
10.11.2013, 10:13 #2
Что-то типа этого. Свернутся по щелчку в любом месте клиентской области, развернутся по нажатию клавиши "1".
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
invoke RegisterHotKey,hWnd1,1,0,31h
 
.WHILE TRUE
begin: invoke GetMessage, ADDR msg,NULL,0,0
.BREAK .IF (!eax)
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
.ENDW
mov eax,msg.wParam
ret
WinMain endp
 
WndProc proc uses ebx edi esi hwnd:dword,msg:dword,wparam:dword,lparam:dword
 
cmp msg,WM_HOTKEY
jnz @f
invoke SendMessage,hWnd1,WM_SYSCOMMAND,SC_RESTORE,0
invoke SendMessage,hWnd2,WM_SYSCOMMAND,SC_RESTORE,0
invoke SendMessage,hWnd3,WM_SYSCOMMAND,SC_RESTORE,0
 
jmp @r
 
@@:
cmp msg,WM_LBUTTONUP
jne @f
 
invoke SendMessage,hWnd1,WM_SYSCOMMAND,SC_MINIMIZE,0
invoke SendMessage,hWnd2,WM_SYSCOMMAND,SC_MINIMIZE,0
invoke SendMessage,hWnd3,WM_SYSCOMMAND,SC_MINIMIZE,0
 
jmp @r
 
@@:
cmp msg,WM_DESTROY
jnz @f
 
invoke PostQuitMessage,0
 
jmp @r
 
@@:
invoke DefWindowProc,hwnd,msg,wparam,lparam
ret
 
@r:
xor eax,eax
ret
 
WndProc endp
Перед вызовом ExitProcess вставьте invoke UnregisterHotKey,hWnd1,1.
1
Boogerman
1 / 1 / 0
Регистрация: 22.09.2013
Сообщений: 22
10.11.2013, 13:09  [ТС] #3
А ещё подскажите пожалуйста, как сделать разворачивание окна при нажатии вообще любой цифровой клавиши?

Добавлено через 59 минут
Уже не надо, с этим разобрался))) Но появился другой вопрос: как сделать так, чтобы считывался щелчок левой кнопкой мыши именно в правой части окна?
0
Not at all!
108 / 190 / 18
Регистрация: 06.10.2013
Сообщений: 360
10.11.2013, 13:34 #4
При получения сообщения WM_LBUTTONUP проверяйте координаты курсора. Если не попадают в правую часть - мимо. Попадают - обработали. А invoke UnregisterHotKey,hWnd1,1 лучше делать при получении сообщения WM_DESTROY, потому что пока дойдёт дело до ExitProcess, окно уже будет разрушено.

Добавлено через 16 минут
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@@:
cmp msg,WM_LBUTTONUP
jne @f
 
invoke GetClientRect,hwnd,addr rect
mov eax,rect.right
shr eax,1
mov rect.left,eax
 
invoke GetCursorPos,addr pt
invoke ScreenToClient,hwnd,addr pt
 
invoke PtInRect,addr rect,pt.x,pt.y
test eax,eax
jz @r
 
invoke SendMessage,hWnd1,WM_SYSCOMMAND,SC_MINIMIZE,0
invoke SendMessage,hWnd2,WM_SYSCOMMAND,SC_MINIMIZE,0
invoke SendMessage,hWnd3,WM_SYSCOMMAND,SC_MINIMIZE,0
 
jmp @r
1
Boogerman
1 / 1 / 0
Регистрация: 22.09.2013
Сообщений: 22
11.11.2013, 12:40  [ТС] #5
Всё понял! Спасибо большое!!!

Добавлено через 22 часа 12 минут
А вот ещё вопрос: при ассемблированиии выдаются ошибки:
C:\masm32\lab3.asm(197) : error A2006: undefined symbol : rect
C:\masm32\lab3.asm(197) : error A2114: INVOKE argument type mismatch : argument
: 2
C:\masm32\lab3.asm(202) : error A2006: undefined symbol : pt
C:\masm32\lab3.asm(202) : error A2114: INVOKE argument type mismatch : argument
: 1
C:\masm32\lab3.asm(203) : error A2006: undefined symbol : pt
C:\masm32\lab3.asm(203) : error A2114: INVOKE argument type mismatch : argument
: 2
C:\masm32\lab3.asm(205) : error A2006: undefined symbol : pt
C:\masm32\lab3.asm(205) : error A2114: INVOKE argument type mismatch : argument
: 3
C:\masm32\lab3.asm(205) : error A2114: INVOKE argument type mismatch : argument
: 2
C:\masm32\lab3.asm(205) : error A2006: undefined symbol : rect
C:\masm32\lab3.asm(205) : error A2114: INVOKE argument type mismatch : argument
: 1
C:\masm32\lab3.asm(198) : error A2006: undefined symbol : rect
C:\masm32\lab3.asm(200) : error A2006: undefined symbol : rect

Подскажите пожалуйста, как их исправить?
0
Not at all!
108 / 190 / 18
Регистрация: 06.10.2013
Сообщений: 360
11.11.2013, 13:27 #6
Boogerman, мало я скопипастил. pt & rect - локальные переменные в WndProc.
Assembler
1
2
3
WndProc proc uses ebx edi esi hwnd:dword,msg:dword,wparam:dword,lparam:dword
local pt:POINT
local rect:RECT
1
11.11.2013, 13:27
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.11.2013, 13:27
Привет! Вот еще темы с ответами:

Сворачивание и разворачивание окон - Delphi
Привет, подскажите пожалуйста, почему при сворачивании/разворачивании форм через панель задач, после 3-4 раза, появляется главная форма...

Сворачивание / разворачивание текста - JavaScript
Подскажите как скрыть текст, тобишь текста много и нужно скрыть его и сделать крестик который бы разворачивал его?

Сворачивание/разворачивание формы - C#
Возникла небольшая проблема при сворачивании/разворачивании формы. Дело в том, что в программе открытие рабочей формы предшествует...

Сворачивание и разворачивание блоков - JavaScript
Доброго времени суток, уважаемые форумчане! Нужна Ваша помощь... Есть код: <div style="float:left; width:310px; height:100%"> <div...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru