Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей





Окно диалога определяется в файле описания ресурсов. Можно написать шаблон диалогового окна вместе с элементами управления в нем, затем откомпилировать его при помощи редактора ресурсов. Вот как может выглядеть содержимое файла ресурсов (назовем его rsrc.rc) для нашего следующего примера:
#define IDC_EDIT1 3000
#define IDC_EDIT2 3001
#define IDC_EDIT3 3002
#define IDC_PLUS 3003
#define IDC_CLEAR 3004
#define DS_CENTER 0x0800L
#define WS_CAPTION 0 X 0 0 C 0 0 0 0 0 L
#define WS_VISIBLE OxlOOOOOOOL
#define WS_SYSMENU 0x00080000L
#define WS_MINIMIZEBOX 0x00020000L
#define WS_VISIBLE OxlOOOOOOOL
#define WS_OVERLAPPED 0 X 0 0 0 0 0 0 0 0 L
#define DS_MODALFRAME 0x80L
#define DS_3DLOOK 0x0004L
#define WS_TABSTOP 0X00010000L
#define ES_AUTOHSCROLL 0x0080L
#define ES_LEFT OxOOOOL
MyDialog DIALOG 10, 10, 300, 100
STYLE 0x0004 I DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX |
WS_SYSMENU I WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK
CAPTION "ИСПОЛЬЗОВАНИЕ ОКНА ДИАЛОГА ДЛЯ СУММЫ ДВУХ ЧИСЕЛ (ВАР.1)"
CLASS "DIALOGEX"
BEGIN
EDITTEXT IDC_EDIT1, 75,17,40,13, ES_AUTOHSCROLL | ES_LEFT |WS_TABSTOP
EDITTEXT IDC_EDIT2, 75,37,40,13, ES_AUTOHSCROLL | ES_LEFT |WS_TABSTOP
EDITTEXT IDC_EDIT3, 75,57,40,13, ES_AUTOHSCROLL | ES_LEFT |WS_TABSTOP
DEFPUSHBUTTON " + ", IDC_PLUS, 141,17,52,13
PUSHBUTTON "SClear", IDC_CLEAR,141,37,52,13
END

В этом скрипте определяется диалоговое окно с размещенными на нем элементами
управления — тремя полями редактирования для ввода-вывода
текста и двумя кнопками. Наша программа будет складывать два целых числа
и результат выводить в поле редактирования. Исходный текст приложения
(назовем его DIALOGI) приведен в листинге 5.24.
Листинг 5.24.
DIALOGI. ASM
.386
.model flat,stdcaii
option casemap :none
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
WinMain proto :DWORD,:DWORD,:DWORD,:DWORD
.data
ClassName
DlgName
AppName
DB "DIALOGEX", 0
DB "MyDialog", 0
DB " Add two integers", 0
hlnstance DD 0
CommandLine DD 0
buffer DB 5
il DD 0
i2 DD 0
ires DD 0
lpTranslated DD 0
dup(?)
LabelClassName DB "STATIC", 0
LabelTextl DB "1-Е СЛАГАЕМОЕ", 0
LabelText2 DB "2-Е СЛАГАЕМОЕ", 0
LabelText3 DB "СУММА", 0
hwndLabell DD 0
392 Глава 5
.const
IDC_EDIT1
IDC_EDIT2
IDC_EDIT3
IDC_PLUS
IDC_CLEAR
LabelIDI
LabelID2
LabelID3
EQU 3000
EQU 3001
EQU 3002
EQU 3003
EQU 3004
EQU 3005
EQU 3006
EQU 3007
. code
start:
invoke GetModuleHandle, NULL
mov hlnstance, EAX
invoke GetCommandLine
invoke WinMain, hlnstance, NULL, CommandLine, SW_SHOWDEFAULT
invoke ExitProcess, EAX
WinMain proc hlnst :HINSTANCE,
HPrevInst :HINSTANCE,
CmdLine :LPSTR,
CmdShow :DWORD
LOCAL wc :WNDCLASSEX
LOCAL msg :MSG
LOCAL hDlg :HWND
mov wc.cbSize,SIZEOF WNDCLASSEX
mov wc.style, CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc, offset WndProc
mov wc.cbClsExtra, NULL
mov wc.cbWndExtra, DLGWINDOWEXTRA
hwndLabel2 DD О
hwndLabel3 DD О
push hlnst
pop wc.hlnstance
mov wc.hbrBackground, C0L0R_WIND0W-3
mov wc.IpszMenuName, NULL
mov wc.IpszClassName, offset ClassName
invoke Loadlcon, NULL, IDI_APPLICATION
mov wc.hlcon, EAX
mov wc.hlconSm, EAX
invoke LoadCursor, NULL, IDC_ARROW
mov wc.hCursor, EAX
invoke RegisterClassEx, addr wc
invoke CreateDialogParam, hlnstance, ADDR DlgName, NULL, NULL, NULL
mov hDlg, EAX
invoke GetDlgltem, hDlg, IDC_EDIT1
invoke SetFocus, EAX
invoke ShowWindow, hDlg,SW_SHOWNORMAL
invoke UpdateWindow, hDlg
StartLoop:
invoke GetMessage, ADDR msg, NULL, 0, 0
cmp EAX, 0
je ExitLoop
invoke IsDialogMessage, hDlg, ADDR msg
cmp EAX, 0
jne StartLoop
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
jmp StartLoop
ExitLoop:
mov EAX, msg.wParam
ret
WinMain endp

Оконная процедура
WndProc proc hWin :HWND,
UMsg :UINT,
wParam :WPARAM,
lParam :LPARAM
cmp uMsg, WM_CREATE
jne next_l
invoke CreateWindowEx, WS_EX_CLIENTEDGE, ADDR LabelClassName, NULL,\
WS_CHILD or WS_VISIBLE or WS_BORDER or\
ES_LEFT or ES_AUTOHSCROLL,\
15, 35, 130, 25, hWin,\
LabellDl, hlnstance, NULL
mov hwndLabell, EAX
invoke CreateWindowEx, WS_EX_CLIENTEDGE, ADDR LabelClassName, NULL,\
WS_CHILD or WS_VISIBLE or WS_BORDER or\
ES_LEFT or ES_AUTOHSCROLL,\
15, 75, 130, 25, hWin,\
LabelID2, hlnstance, NULL
mov hwndLabel2, EAX
invoke CreateWindowEx, WS_EX_CLIENTEDGE, ADDR LabelClassName, NULL,\
WS_CHILD or WS_VISIBLE or WS_BORDER or\
ES_LEFT or ES_AUTOHSCROLL,\
15, 115, 130, 25, hWin,\
LabelID3, hlnstance, NULL
mov hwndLabel3, EAX
invoke SetWindowText, hwndLabell, ADDR LabelTextl
invoke SetWindowText, hwndLabel2, ADDR LabelText2
invoke SetWindowText, hwndLabel3, ADDR LabelText3
ret
next_l:
cmp uMsg,' WM_COMMAND
jne next_2
mov EAX, wParam
mov EDX, EAX
cmp lParam, О
j е ex_wmcom
shr EDX, 16
cmp DX, BN_CLICKED
je checkjplus
jmp ex_wmcom
checkjplus:
cmp AX, IDC_PLUS
jne check clear
invoke GetDlgltemlnt, hWin, IDC_EDIT1, ADDR lpTranslated,
mov il, EAX
invoke GetDlgltemlnt, hWin, IDC_EDIT2, ADDR lpTranslated,
add il, EAX
xchg il, EAX
mov ires, EAX
invoke SetDlgltemlnt, hWin, IDC_EDIT3, ires, 1
ret
jmp ex_wmcom
check_clear:
cmp AX, IDC_CLEAR
jne ex_wmcom
invoke SetDlgltemText, hWin, IDC_EDIT1, NULL
invoke SetDlgltemText, hWin, IDC_EDIT2, NULL
invoke SetDlgltemText, hWin, IDC_EDIT3, NULL
ex_wmcom:
ret
next_2:
cmp uMsg, WM_DESTROY
jne next_3
push NULL
call PostQuitMessage
xor EAX, EAX
ret
next_3:
push lParam
push wParam
push uMsg
push hWin
call DefWindowProc
ret
WndProc endp
end start

Анализ примера начнем с определения диалогового окна в файле ресурсов.
Строка:
MyDialog DIALOG 10, 10, 300, 100
указавает на координаты диалогового окна. Строка:
STYLE 0x0004 | DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX |
WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK
определяет стили диалогового окна. Строка:
CAPTION "ИСПОЛЬЗОВАНИЕ ОКНА ДИАЛОГА ДЛЯ СУММЫ ДВУХ ЧИСЕЛ (ВАР. 1) "
представляет собой заголовок окна. Наконец, блок:
CLASS "DIALOGEX"
BEGIN
EDITTEXT IDC_EDIT1, 75,17,40,13, ES_AUTOHSCROLL | ES_LEFT |WS_TABSTOP
EDITTEXT IDC_EDIT2, 75,37,40,13, ES_AUTOHSCROLL | ES_LEFT |WS_TABSTOP
EDITTEXT IDC_EDIT3, 75,57,40,13, ES_AUTOHSCROLL | ES_LEFT |WS_TABSTOP
DEFPUSHBUTTON " + ", IDC_PLUS, 141,17,52,13
PUSHBUTTON "&Clear", IDC_CLEAR,141,37,52,13
END определяет элементы управления диалогового окна.


 
 
 

Библиотека программиста. 2009.
Администратор: admin@programmer-lib.ru