;Код основной программы:
.386
.model flat, stdcall
option casemap :none
include \masm32\include\windows.inc
include \masm32\include\masm32.inc
include \masm32\include\gdi32.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\Comctl32.inc
include \masm32\include\comdlg32.inc
include \masm32\include\shell32.inc
include \masm32\include\oleaut32.inc
include \masm32\include\msvcrt.inc
include \masm32\macros\macros.asm
includelib \masm32\lib\masm32.lib
includelib \masm32\lib\gdi32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\Comctl32.lib
includelib \masm32\lib\comdlg32.lib
includelib \masm32\lib\shell32.lib
includelib \masm32\lib\oleaut32.lib
includelib \masm32\lib\msvcrt.lib
; Прототипы функций
WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
RegisterWinClass PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD
MsgLoop PROTO
Main PROTO
;коды используемых ресурсов
IDD_BUTTON_1 EQU 205
IDD_BUTTON_2 EQU 207
IDD_CB1 EQU 501
IDD_CB2 EQU 502
IDD_CB3 EQU 503
IDD_DLG1 equ 101
IDD_DLG2 equ 102
IDC_EDIT_1 equ 301
IDB_MAIN1 equ 601
IDB_MAIN2 equ 602
.data
cb1 dd 0 ; 3 Check boxes
cb2 dd 0
cb3 dd 0
.data?
hInstance dd ? ;описатель экземпляра процесса
CommandLine dd ? ;командная строка
hIcon dd ? ;описатель пиктограммы
hCursor dd ? ;описатель курсора
hWnd dd ? ;описатель главного окна приложения
hBitmap1 dd ? ;описатель растрового изображения
hMemDC1 dd ? ;описатель совместимого контекста устройства (DC)
hBitmap2 dd ? ;описатель растрового изображения
hMemDC2 dd ? ;описатель совместимого контекста устройства (DC)
PSHeader PROPSHEETHEADERA <> ;заголовок PropertySheet
PSPages PROPSHEETPAGE <> ;страницы PropertySheet
PROPSHEETPAGE <>
.code
start:
mov hInstance, rv(GetModuleHandle, NULL) ;описатель экземпляра процесса
mov CommandLine, rv(GetCommandLine) ;командная строка
mov hIcon, rv(LoadIcon,hInstance,NULL) ;пиктограмма
mov hCursor, rv(LoadCursor,NULL,IDC_ARROW) ;курсор
call Main ;запускаем
invoke ExitProcess,eax ;завершаем процесс
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
Main proc
STRING szClassName,"PropertyDialog_Class" ;класс основного окна
invoke RegisterWinClass,ADDR WndProc,ADDR szClassName, ;регистрируем класс окна
hIcon,hCursor,COLOR_BTNFACE+1
;создаем основное окно
invoke CreateWindowEx,WS_EX_LEFT,\
ADDR szClassName,\
NULL,\
WS_CAPTION or WS_THICKFRAME or WS_MINIMIZEBOX,\
10,10,450,250,\
NULL,NULL,\
hInstance,NULL
mov hWnd,eax ;сохраним описатель окна
invoke ShowWindow,hWnd, SW_SHOWNORMAL ;показать
invoke UpdateWindow,hWnd ;обновить
call MsgLoop ;основной цикл обработки сообщений
ret
Main endp
;регистрируем класс окна
RegisterWinClass proc lpWndProc:DWORD, lpClassName:DWORD,\
Icon:DWORD, Cursor:DWORD, bColor:DWORD
LOCAL wc:WNDCLASSEX
mov wc.cbSize, sizeof WNDCLASSEX
mov wc.style, CS_BYTEALIGNCLIENT or CS_BYTEALIGNWINDOW
m2m wc.lpfnWndProc, lpWndProc
mov wc.cbClsExtra, NULL
mov wc.cbWndExtra, NULL
m2m wc.hInstance, hInstance
m2m wc.hbrBackground, bColor
mov wc.lpszMenuName, NULL
m2m wc.lpszClassName, lpClassName
m2m wc.hIcon, Icon
m2m wc.hCursor, Cursor
m2m wc.hIconSm, Icon
invoke RegisterClassEx, ADDR wc
ret
RegisterWinClass endp
;цикл обработки сообщений
MsgLoop proc uses esi edi
LOCAL msg:MSG
xor edi, edi
lea esi, msg
jmp jumpin
StartLoop:
invoke TranslateMessage, esi
invoke DispatchMessage, esi
jumpin:
invoke GetMessage,esi,edi,edi,edi
test eax, eax
jnz StartLoop
mov eax, msg.wParam
ret
MsgLoop endp
;функция основного окна
WndProc proc hWin:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
Switch uMsg
Case WM_CREATE
call Properties ;создаем PropertySheet
invoke SendMessage,[hWin],WM_CLOSE,0,0 ;выйдя из propertysheet, сразу завершаемся
return 0
Case WM_DESTROY
.if [hMemDC1] != 0
invoke DeleteDC, [hMemDC1] ;освободим ресурсы, если надо
.endif
.if [hBitmap1] != 0
invoke DeleteObject,hBitmap1
.endif
.if [hMemDC2] != 0
invoke DeleteDC, [hMemDC2] ;освободим ресурсы, если надо
.endif
.if [hBitmap2] != 0
invoke DeleteObject,hBitmap2
.endif
invoke PostQuitMessage,NULL
return 0
Endsw
invoke DefWindowProc,hWin,uMsg,wParam,lParam
ret
WndProc endp
PSDialog1 proc hWin:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
LOCAL hdc:HDC
LOCAL ps:PAINTSTRUCT
LOCAL rect:RECT
Switch uMsg
Case WM_INITDIALOG
invoke LoadBitmap,hInstance,IDB_MAIN1
mov hBitmap1,eax
invoke GetDC,hWin
mov hdc,eax
invoke CreateCompatibleDC,hdc
mov hMemDC1,eax
invoke SelectObject,hMemDC1,hBitmap1
invoke ReleaseDC,hWin,hdc
Case WM_PAINT
invoke BeginPaint,hWin,addr ps
mov hdc,eax
invoke GetClientRect,hWin,addr rect
mov eax,rect.right
shr eax,1
invoke BitBlt,hdc,eax,0,rect.right,rect.bottom,hMemDC1,0,0,SRCCOPY
invoke EndPaint,hWin,addr ps
Endsw
xor eax,eax
ret
PSDialog1 endp
PSDialog2 proc hWin:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
LOCAL hdc:HDC
LOCAL ps:PAINTSTRUCT
LOCAL rect:RECT
Switch uMsg
Case WM_INITDIALOG
invoke LoadBitmap,hInstance,IDB_MAIN2
mov hBitmap2,eax
invoke GetDC,hWin
mov hdc,eax
invoke CreateCompatibleDC,hdc
mov hMemDC2,eax
invoke SelectObject,hMemDC2,hBitmap2
invoke ReleaseDC,hWin,hdc
Case WM_PAINT
invoke BeginPaint,hWin,addr ps
mov hdc,eax
invoke GetClientRect,hWin,addr rect
invoke BitBlt,hdc,0,0,rect.right,rect.bottom,hMemDC2,0,0,SRCCOPY
invoke EndPaint,hWin,addr ps
Endsw
xor eax,eax
ret
PSDialog2 endp
;<< << << << << << << << << << << << << << << << << << << << << << << << <<
;создание PropertySheet
Properties proc uses ebx
;заполняем структуры
xor eax, eax
mov edx, [hWnd]
mov ebx, [hInstance]
lea ecx, PSPages
;<< << << << << << Заголовок << << << << << << << << << << << << << << << <<
mov [PSHeader.dwSize], size PROPSHEETHEADERA
mov [PSHeader.dwFlags], PSH_NOAPPLYNOW+PSH_PROPSHEETPAGE+PSH_WIZARD
mov [PSHeader.hwndParent], edx
mov [PSHeader.hInstance], ebx
m2m [PSHeader.hIcon], NULL
mov [PSHeader.pszCaption], NULL
mov [PSHeader.nPages], 2 ;2 страницы
mov [PSHeader.nStartPage], eax ;стартовая - первая
mov [PSHeader.ppsp], ecx
mov [PSHeader.pfnCallback], eax
mov [PSHeader.hbmWatermark], eax
mov [PSHeader.hplWatermark], eax
mov [PSHeader.hbmHeader], eax
;<< << << << << << 1-ая страница << << << << << << << << << << << << << << << <<
mov [(PROPSHEETPAGE ptr [ecx]).dwSize], size PROPSHEETPAGE
mov [(PROPSHEETPAGE ptr [ecx]).dwFlags], PSP_DEFAULT + PSP_HIDEHEADER
mov [(PROPSHEETPAGE ptr [ecx]).hInstance], ebx
mov [(PROPSHEETPAGE ptr [ecx]).pResource], IDD_DLG1 ;имя диалога в ресурсах
mov [(PROPSHEETPAGE ptr [ecx]).hIcon], eax
mov [(PROPSHEETPAGE ptr [ecx]).pszTitle], eax
mov [(PROPSHEETPAGE ptr [ecx]).pfnDlgProc], PSDialog1 ;функция окна
mov [(PROPSHEETPAGE ptr [ecx]).lParam], eax
mov [(PROPSHEETPAGE ptr [ecx]).pfnCallback], eax
mov [(PROPSHEETPAGE ptr [ecx]).pcRefParent], eax
;<< << << << << << 2-ая страница << << << << << << << << << << << << << << << <<
add ecx, size PROPSHEETPAGE
mov [(PROPSHEETPAGE ptr [ecx]).dwSize], size PROPSHEETPAGE
mov [(PROPSHEETPAGE ptr [ecx]).dwFlags], PSP_DEFAULT + PSP_HIDEHEADER
mov [(PROPSHEETPAGE ptr [ecx]).hInstance], ebx
mov [(PROPSHEETPAGE ptr [ecx]).pResource], IDD_DLG2 ;имя диалога в ресурсах
mov [(PROPSHEETPAGE ptr [ecx]).hIcon], eax
mov [(PROPSHEETPAGE ptr [ecx]).pszTitle], eax
mov [(PROPSHEETPAGE ptr [ecx]).pfnDlgProc], PSDialog2 ;функция окна
mov [(PROPSHEETPAGE ptr [ecx]).lParam], eax
mov [(PROPSHEETPAGE ptr [ecx]).pfnCallback], eax
mov [(PROPSHEETPAGE ptr [ecx]).pcRefParent], eax
invoke PropertySheet, addr PSHeader ;создаем и "сидим" в нем, пока не выйдем
ret
Properties endp
end start
#include "\masm32\include\resource.h"
#define IDD_DLG1 101
#define IDD_DLG2 102
#define IDC_EDIT_1 301
#define IDD_BUTTON_1 205
#define IDD_BUTTON_2 207
#define IDD_CB1 501
#define IDD_CB2 502
#define IDD_CB3 503
#define IDB_MAIN1 601
#define IDB_MAIN2 602
IDB_MAIN1 BITMAP MOVEABLE PURE "1.BMP"
IDB_MAIN2 BITMAP MOVEABLE PURE "2.BMP"
IDD_DLG1 DIALOG 10, 10, 450, 250
CAPTION "First Page"
STYLE WS_POPUP | WS_CAPTION | WS_VISIBLE
BEGIN
EDITTEXT ,IDC_EDIT_1,20,70,90,12, ES_AUTOHSCROLL | ES_LEFT | WS_TABSTOP
DEFPUSHBUTTON "OK", IDD_BUTTON_1, 45, 95, 40, 14,
WS_CHILD | WS_VISIBLE | WS_TABSTOP
END
IDD_DLG2 DIALOG 10, 10, 450, 250
CAPTION "Second Page"
STYLE WS_POPUP | WS_CAPTION | WS_VISIBLE
BEGIN
DEFPUSHBUTTON "Invert", IDD_BUTTON_2, 220, 120, 32, 14,
WS_CHILD | WS_VISIBLE | WS_TABSTOP
AUTOCHECKBOX "Check Box 1", IDD_CB1, 220, 30, 70, 10
AUTOCHECKBOX "Check Box 2", IDD_CB2, 220, 60, 70, 10
AUTOCHECKBOX "Check Box 3", IDD_CB3, 220, 90, 70, 10
END
Case WM_PAINT
invoke BeginPaint,hWin,addr ps
mov hdc,eax
invoke GetClientRect,hWin,addr rect
mov eax,rect.right
shr eax,1
mov rect.left, eax
invoke BitBlt,hdc,eax,20,rect.right,rect.bottom,hMemDC1,0,0,SRCCOPY
invoke SetBkMode, hdc, TRANSPARENT
invoke DrawText, hdc,ADDR OurText,-1, ADDR rect,NULL
invoke EndPaint,hWin,addr ps
Case WM_PAINT
invoke BeginPaint,hWin,addr ps
mov hdc,eax
invoke GetClientRect,hWin,addr rect
mov eax,rect.right
shr eax,1
mov rect.right, eax
invoke BitBlt,hdc,0,20,rect.right,rect.bottom,hMemDC2,0,0,SRCCOPY
invoke SetBkMode, hdc, TRANSPARENT
invoke DrawText, hdc,ADDR OurText,-1, ADDR rect,NULL
invoke EndPaint,hWin,addr ps
Если Вы уже зарегистрированы на Портале - войдите в систему, если Вы еще не регистрировались - пройдите простую процедуру регистрации.