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

Узнай цену своей работы

Формулировка задачи:

Здравствуйте!!! Мне нужно вывести на экран три окна. Щелчок левой кнопкой в правой половине любого окна приводит к свертке в пиктограмму остальных. Обратное разворачивание, если они уже свернуты, осуществить при нажатии любой цифровой клавиши. Я пишу на MASM. Написал главную функцию, а вот с оконной трудности, а именно, не знаю, как реализовать свёртывание и развёртывание окон. Подскажите пожалуйста, как это реализовать. Заранее спасибо!!! Вот мой код:
.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

Решение задачи: «Сворачивание и разворачивание окон»

textual
Листинг программы
WndProc proc uses ebx edi esi hwnd:dword,msg:dword,wparam:dword,lparam:dword
local pt:POINT
local rect:RECT

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4.286 из 5