Терезе функциясы
ҚАЗАҚСТАН РЕСПУБЛИКАСЫНЫҢ ҒЫЛЫМ ЖӘНЕ БIЛIМ МИНИСТРЛIГI
Қ.И. Сәтбаев атындағы
Қазақ Ұлттық Техникалық Университетi
Есептеу техника кафедрасы
Баяндама
Тақырыбы: Windows операциялық жүйесінде
Win32API функцияларын пайдаланып
Assembler тілінде бағдарламалау
Жетекшілер: Қонаева
Тирижанова
Орындағандар: Майлыбаев Е.Қ.
Сарыбаев Р.М.
Тобы: ОТЗ-01-1қ
АЛМАТЫ 2004
МАЗМҰНЫ
Кіріспе...................................................................................................3
Негізгі бөлім.........................................................................................4
Windows операциялық жүйесінде Assembler тілін қолданып
бағдарламалау.......................................................................................4
Терезе түрлері.......................................................................................7
Терезелер классы..................................................................................8
1.3.1 Терезе классының қолданатын ресурстарын сипаттау.....................8
Терезе функциясы...............................................................................9
Терезе құру........................................................................................10
1.4 Қосымшаның басты функциясы.......................................................11
1.5 Қосымша мәтінінің құрылымы.........................................................13
1.6 Терезе құрудың қосымша
1.7 Іздеу және терезе
1.8 Терезелердің жылжу функциясы.......................................................14
Қолданушыға арналған қосымша мәлімет.......................................15
2 Win
бағдарламалау......................................................................................16
Мәліметтерді өңдеу терезесі..............................................................16
Диалогты терезе..................................................................................23
3 API
Қорытынды..........................................................................................37
Қолданылған әдебиет.........................................................................38
Кіріспе
Компьютерлік технологиялардың қарқынды дамуы барысында компьютерлерге арналған түрлі
Бағдарламалау тілдерінің түрі көп. Олардың әрқайсы өзінің мүмкіндіктерімен
Дегенмен біз өз баяндамамыздың негізгі мақсаты ретінде Windows
Негізгі бөлім
1.1 Windows операциялық жүйесінде Assembler тілін қолданып бағдарламалау.
Windows операциялық жүйесіне Си және басқа да бағдарламалау
Ассемблер тілінде MS-DOS операциялық жүйесінде бағдарламалағанға қарақанда Windows
Қазіргі уақытта бір- бірімен бақталас екі ассемблер дестелері
1- сурет. Ассемблерлік модульдің трансляциялану сұлбасы.
Трансляцияның 2- ші кезеңіне екі негізгі бағдарламалар сәйкес
Ассемблер бағдарламасының мәтіні бар файлдың аты PROG.ASM болсын,
C:\masm32\bin\ml/c/coffPROG.ASM
Осыдан кейін PROG.OBJ модулі пайда болады. Содан кейін
c:\masm32\bin\Link/ SUBSUSTEM: Windows PROG.OBJ әрекеті орындалады. Сол кезде
Ассемблерда бағдарламаны бірнеше бөліктерге бөліп, трансляцияның 1- ші
Ендігі жерде басқа обьектілік модульдер мен кітапханаларды трансляцияның
Келесі қарастыратынымыз INVOKE дерективасы. Бұл қолайлы команда, бірақ
Қолайлы жағы @N қоспасынан құтыламыз, 2- ші жағынан
PUSH Par1
PUSH Par2
PUSH Par3
PUSH Par4
Call Name_PROC@N; N- стекке жіберілетін байттар көлемі. Бұл
INVOKE NAME_PROC, par4, par3, par2, par1
Бұл кезде параметрлер ретінде құрcым, анықталған мән немесе
INVOKE командасының тиімсіз жағы макродеректерді қолдану. Макродеректерді қолданғанда
Біздің 1- суретте обьектілік модульдерден басқа кітапханалар жайлы
Бірақ обьектілік модульдерден қалай кітапхана құрса болады? Ол
LIB/OUT:LIB1.LIB PROG2.OBJ
Егер кітапханаға тағы бір модуль қосқымыз келсе (мысалы
Кітапханашының тағы да екі пайдалы командалары LIB/LIST LIB1.LIB-
Жоғарыда біз тек MASM дестесін қарастырды, енді TASM
TASM32/ml PROG.ASM
TLINK32_aа PROG.OBJ
TASM дестесінде модульдарды біріктіру өте қарапайым түрде жүреді.
TLIB LIB1.LIB+PROG2.OBJ командасы орындалады. Нәтижесінде LIB1.LIB кітапханасы құрылады.
TLINK32 - нің командалық қатарының кеңейтілген түрі мынандай:
Мұндағы OBJFILE- орындалатын модуль
MAPFILE- модуль құрылымы жайлы ақпарат беретін MAP- файл
LIBFILE- бір немесе бірнеше кітапхана (пробел арқылы)
TASM- да INVOKE дерективасы жоқ.
Ассемблерде басқа да бағдарламалар қолданылады. Мысала: редакторлар, дизассемблерлер,
Редакторлар: QEDITOR.EXE редакторы MASM32 дестесінің ішіне кіреді. Бұл
Сонымен қатар EAS.EXE бағдарламасын қарастырайық. Бұл редактор, дәлірек
Отладчиктер: Отладчиктер бағдарламаны қадам бойынша жұмыс істейді. Қолдануға
Дизассемблерлер: Дизассемблерлер орындалатын модульді ассемблерлік кодқа айналдырады. Мысалға,
Hex- редакторлар: Hex- редакторлар жүктелетін модульдарды 16- қ
16-қ түрде және ассемблерлік код түрінде қарауға жағдай
1.2 Терезе түрлері.
Windows - қа арналған бағдарламалар қосымша деп аталады.
1. Терезе қосымша: жұмыстың орындалуын ұйымдастырады, іске қосылған
2. MDI- терезелер: Бұл терезе бірнеше құжаттарды бір
3. Көмекші терезе. Бұл терезе көп жағдайда операциялық
4. Диалог терезесі. Бұл терезе қосымша мен
Құрастырушыға терезе қосымша мен операциялық жүйенің функционалдауымен
Бағдарламалық тілдерінің негізі бойынша терезе дегеніміз онымен әртүрлі
Обьект көптеген мәліметтерді баяндайтын және өзгертетін белгілі бір
2-сурет Көптеген элементері бар:
1-Жүйелік меню батырмасы; 2-Терезені пиктограммаға айналдыру батырмасы; 3-Терезені
2 - суреттегі басты терезенің түрлі кнопкалары, менюі,
1.3 Терезелер классы
Терезелер құру үшін операциялық жүйеге оның қандай классқа
1.3.1 Терезе классының қолданатын ресурстарын сипаттау.
Класста қолданылатын ресурстар жиындығын WNDCLASS құрылымында баяндаймыз.
Бұл құрылым келесі түрде баяндалады:
int RegClass(WNDPROC Proc, LPCTSTR szNAME)
{ WNDCLASS wc;
wc.style=CS_HREDRAW | CS_VREDRAW;
wc.cbClsExtra=wc.cbWndExtra=0;
wc.IpfnWndProc=Proc; wc.hlnstance=hlnstance;
wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wc.hCurcor=LoadCursor(NULL,IDC_ARROW);
wc.Background=(HBRUSH)(COLOR_WINDOW+1);
wc.lpszMenuName=(LPCTSTR)NULL;
wc.lpszClassName=szName;
return RegisterClass(&wc);
}
1. style келесі мәнді қабылдайды
wc.style= cs_HREDRAWICS_VREDRAWICS_DBLCLKS
2. IpfnWndProc терезенің функциясын көрсетеді.
3. CbClsExtra клсстың қосымша байттарының санына тең.
4. CbWndExtra класстағы терезенің қосымша байт
5. hlnstance ағымдағы қосымшаның дескрипторын көрсетеді.
6. hIcon терезе минимизацияланған кезде қайсы пиктограмма түрленетінін
7. harsor LoadCursor сілтеменің терезенің үстінен өткен кезде
Сілтеменің ресурсы Loadcursor функциясымен баяндалады:
Hcursor Loadcursor (HINSTANCE hInst, LPCTSTR IpCursorName);
8. hbrBackground Терезе түсін бояу дискрипторын береді.
9. IpszMenuName Осы класстағы терезенің басты менюінің ресурсының
10. IpszClassName Тіркелетін терезе классының аты бар жолды
1.3.2 Терезе функциясы
Терезе функциясы оған түскен хабарларға қандай реакция болатынын
Ал әдеттегі функциялардан айырмашылығы:
Стандартты қайтару типі және формальді параметрлері бар
Терезеге хабар түскен кезде тек қана операциялық жүйемен
Терезе функциясымен өңделмейтін хабар операциялық жүйеге беріледі.
Терезе функциясының атын қалауынша қояды. Классты тіркеуден
1.3.3 Терезе құру
Терезені құру үшін Create Window функциясын шақырамыз. Ол
HWND CreateWindow (
LPCTSTR IpClassName
LPCTSTR IpWindowName
DWORD dwStyle,
Int x,
Int y,
Int nWidth,
Int nHeigth,
HWND hWndParent,
HMENU hMenu,
HANDLE nInstance,
LPVOID lpParam );
1. IpClassName RegisterClass функциясымен тіркелген атқа немесе операциялық
2. dw.style терезенің стилін анықтайды.
3. nwidth пиксельде берілген терезенің ені. Уақытша және
4. nwndParent Тек қана инициалданған терезелерді көрсетеді. Туынды
5. hMenu- меню дискрипторы немесе құрылатын туынды терезенің
Уақытша терезенің менюін үш түрлі жолмен беруге болады:
1) Терезелер классында меню аты көрсетіледі және осы
2) Меню атын CreateWindow функциясының аргументі ретінде көрсетеміз.
3) Менюді терезе құру кезінде немесе құрылып болған
Бірінші және үшінші жағдайда hMenu аргументі NULL тең.
Терезенің стильін оның сыртқы бейнелеріне қарап айырамыз.
Терезе стилін баяндау үшін символдық тұрақты WS_ қолднылады.
Көбінесе қосымшалар терезелі болып келеді. Мұндай терезелердің негізгі
Бірін- бірі жабатын терезе басқа бір терезеге бағынуы
Уақытша терезелер көбінесе қолданушыға хабар шығару үшін қолданылады
Туынды терезелер басқару органдарын құру үшін қолданылады. Кірісімен
1.4 Қосымшаның басты функциясы
Қосымша әрқашан WinMain функциясымен баяндалады. Функция қосымша іске
WinMain фунциясының баяндалуы:
Int WINAPI WinMain (HINSTANCE hInstance,
HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)
{ MSG msg; HWND hwnd;
if (!RegClass(WndProc, szClassName)) return FALSE;
hwnd=CreateWindow(szClassName,’Пример 1’,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULD,CW_USEDEFAULT,
CW_USEDEFAULD,CW_USEDEFAULT,
0,0,hlnstance,NULL);
if(!hwnd) return FALSE;
ShowWindow(hwnd,SW_SHOWMAXIMIZED);
UpdateWindow(hwnd);
while (GetMessage(&msg,0,0))
{TranslateMessage(&msg); DispatchMessage(&msg);}
return msg.wParam;
}
Функцияның формальді параметрлерінің тізімі, аты, қайтару типі Windows
hInstance параметрі операциялық жүйеден ағымдағы қосымшаның дескрипторын алады.
hPrevinstance параметры 16-разрядты қосымшаларда алдындағы белсенді болған қосымшаны
nCmdshow параметрі қосымшаға терезенің бастапқы шығару әдісін береді.
WinMain функциясының құрылымында msg және hwnd айнымалылары баяндалған.
Терезе классын тіркеуден өткізу үшін RegClass функциясы шақырылады.
If(!RegClass(WndProc,s2ClassName)) return False;
Терезе құру үшін CreateWindow функциясы шақырылады. Егер терезе
ShowWindow(hwind, SW_SHOWMAXIMIZED);
Бұл функция терезені максимальді үлкен түрде экранға шығарады.
While(GetMessage(&msg, 0, 0, 0))
{TranslateMessage(&msg); DispatchMessage(&msg);}
Бұл цикл хабарларды өңдеу циклы деп аталады.
GetMessage функциясы қосымшаның тізімінде тұрған хабарлардың кезектегі
TransLateMessage пернетақтадағы хабарды трансляциялайды,
DispatchMessage функциясы хабарларды терезе функцияларына таратады. Дәл осы
Жоғарыда көрсетілген функциялардың түпнұсқасын қарастырайық:
ShowWindow функциясы келесі түрде баяндалады: Bool ShowWindow(HWND hwnd,
Қосымшаны жүктегеннен соң шақыртылуы кезінде екінші аргументіне WinMain
GetMessage функциясы келесі түрде баяндалады. BoolGetMessage(LPMSG Ipmsg, HWNO
Lpmsg параметрі таңдалатын хабарды MSG типті құрылымға жазады.
GetMessage функциясы адресі бірінші параметірімен берілген кезектегі таңдаулы
1.5 Қосымша мәтіннің құрылымы
Қосымша мәтіннің құрылымы екі талап бойынша анықталады.
1. Мәтін WinMain функциясының сипаттамасынан тұрады.
2. Егер жаңа класс тіркелсе, онда мәтін WINDCLASS
1.6 Терезе құрудың қосымша функциялары
Windows API терезелерді құруға қатысты бірнеше функциялардан тұрады.
1.7 Іздеу және терезенің күйін анықтау функциялары
Кей жағдайларда берілген дескрипторларға терезе бар жағын анықтау
BOOL IsWindow (HWND hwnd);
Егер hwnd дискрипторы бар терзе бар болса функция
Егер берілген терезенің кіру фокусын анықтау керек болса,
Егер hwnd терезесі белсенді болса, функция ноль емес
Терезенің кіру фокусынын өзгерту үшін немесе алу үшін
bEnable= TRUE болғанда кіру фокусы hwnd терезесіне беріледі,
Егер терезе бұрын белсенді болмаған болса, ноль емес
Кіріс фокусын hwnd терезесіне SetFocus функциясы арқылы беріледі:
Келесі функция hwnd терезесі пиктограмма түрінде тұрғанда нольдік
Fine Window функциясы Ip Window Name деп басталатын
Егер IpWindowName=NULL болса, онда ізделіп жатқан терезе кез-
1.8 Терезелердің жылжу функциясы
hwnd терезесінің өлшемдерін өзгерту үшін және терезенің
MoveWindow функциясы келесі түрде сипатталады:
BOOL MoveWindow (HWND.hwnd,
Int x, // терезенің сол жағының жаңа координатасы
Int y, // терезенің сол жағының жаңа координатасы
Int nWidth, // терезенің жаңа ені
Int nHeight, // терезенің жаңа биіктігі
BOOL bRepqing // терезені бояу жалаушасы
);
Егер bRepqing= TRUE болса, онда жылжу болғаннан кейін
SetWindowPos функциясы hwnd терезесінің координатасын сонымен қатар терезенің
BOOL SetWindow (HWND hwnd,
HWND hWndInsertAfter, // орналастыру тәртібінің дескрипторы
Int x, // сол жақтың жаңа координатасы
Int y, // жоғарғы жақтың жаңа координатасы
Int cx, // жаңа ен
Int cy, // жаңа биіктік
LINIT uFlags // позициялау жалаушасы
);
Сәтті орындалғанда ноль емес мәні қайтарылады.
hWndInsertAfter параметрі алдағы терезесі дескрипторы болуы мүмкін немесе
Бірнеше қосымшалармен жұмыс істегенде олардың біреуін алдыңғы планға
Осы мақсат үшін SetForegroundWindow функциясы қолданылады. Бұл функция
BOOL SetForegroundWindow (HWND, hwnd);
Орындалуы сәтті болған жағдайда функция ноль емес мәнді
Терезені жылжыту үшін экранның, терезенің жүйелік өлшемдерін білу
Get System Metrics функциясы келесі түрде сипатталған: Int
nIndex параметрі жүйе қайтаратын өлшемді немесе орнатылған конфигурацияны
1.9 Қолданушыға арналған қосымша мәліметі
Мәтіндік мәліметті шығару үшін және оған қалданушы жауап
Int WINAPI MessageBox (
HWND hwnd, // Аталық терезе дескрипторы
LPCTSTR IpText, // Мәлімет мәтінінің адресі
LPCTSTR IpCaption // Мәлімет терезесі басының адресі
UNIT uType // Мәлімет терезесінің стилі
);
Егер hwnd= NULL болса, мәлімет терезесінің аталық терезесі
Келесі жалаушалар мәліметтер терезесінің батырмаларының тізімін анықтайды.
Қосымша қолданушының мәліметке берген жауабын MessageBox функциясының қайтарылған
2. Win 32 API функцияларын пайдаланып Assembler тілінде
Win 32 API функцияларын пайдаланып Windows операциялық жүйесінде
2.1 Мәліметтерді өңдеу терезесі
Бірінші мысалда редакциялау терезесін қарастырамыз. батырмасын басқанда
WM_SEYFOCUS equ 7h
;хабар терезені жабқан кезде келеді
WM_DESTROY equ 2
;хабар терезені ашқан кезде келеді
WM_CREATE equ 1
;хабар, егер терезедегі элементтермен бір нәрсе болса
WM_COMMAND equ 111h
; элементке жол жіберу мүмкіндік беретін хабар
WM_SETTEXT equ 0Ch
; жол алуға мүмкіндік беретін хабар
WM_GETTEXT equ 0Dh
;терезе қасиеттері
CS_VREDRAW equ 1h
CS_HREDRAW equ 2h
CS_GLOBALCLASS equ 4000h
WS_TABSTOP equ 10000h
WS_SYSMENU equ 80000h
WS_OVERLAPPEDWINDOW equ 0+WS_TABSTOP+WS_SYSMENU
STYLE equ CS_HREDRAW + CS_VREDRAW + CS_GLOBALCLASS
BS_DEFPUSHBUTTON equ 1
WS_VISIBLE equ 10000000h
WS_CHILD equ 40000000h
WS_BORDER equ 800000h
STYLBTN equ WS_CHILD+BS_DEFPUSHBUTTON+WS_VISIBLE+WS_TABSTOP STYLEDT equ WS_CHILD+WS_VISIBLE+WS_BORDER+WS_TABSTOP
IDI_APPLICATION equ 32512
;курсор идентификаторы
IDC_ARROW equ 32512
;нормальді-терезе көрсету режимі
SW_SHOWNORMAL equ 1
;ішкі процедуралар прототипі
EXTERN SetFocus: NEAR
EXTERN SendMessageA: NEAR
EXTERN MessageBoxA: NEAR
EXTERN CreateWindowExA: NEAR
EXTERN DefWindowProcA: NEAR
EXTERN DispatchMessageA: NEAR
EXTERN ExitProcess: NEAR
EXTERN GetMessageA: NEAR
EXTERN GetModuleHandleA: NEAR
EXTERN LoadCursorA: NEAR
EXTERN LoadIconA: NEAR
EXTERN PostQuitMessage: NEAR
EXTERN RegisterClassA: NEAR
EXTERN ShowWindow: NEAR
EXTERN TranslateMessage: NEAR
EXTERN UpdateWindow: NEAR
;құрылымдар
;хабар құрылымдары
MSGSTRUCT STRUC
MSHWND DD ?
MSMESSAGE DD ?
MSWPARAM DD ?
MSLPARAM DD ?
MSTIME DD ?
MSPT DD ?
MSGSTRUCT ENDS
;--------терезе класстарының құрылымдары
WNDCLASS STRUC
CLSSTYLE DD ?
CLWNDPROC DD ?
CLSCBCLSEX DD ?
CLSCBWNDEX DD ?
CLSHINST DD ?
CLSHICON DD ?
CLSHCURSOR DD ?
CLBKGROUND DD ?
CLMENNAME DD ?
CLNAME DD ?
WNDCLASS ENDS
.386P
; жалпақ модель
.MODEL FLAT, stdcall
include edit.inc
;
includelib c:\win32\tasm32\lib\import32.lib
;
_DATA SEGMENT DWORD PUBLIC USE32 'DATA'
NEWHWND DD 0
MSG MSGSTRUCT
WC WNDCLASS
HINST DD 0
TITLENAME DB 'PRIMER - window edit',0
CLASSNAME DB 'CLASS32',0
CPBUT DB 'EXIT',0
CPEDT DB ' ', 0
CLSBUTN DB 'BUTTON', 0
CLSEDIT DB 'EDIT', 0
HWNDBTN DWORD 0
HWNDEDT DWORD 0
CAP DB 'MESSAGE',0
MES DB 'END',0
TEXT DB 'string for edit', 0
db 50 dup (0)
_DATA ENDS
; кодалар сегменті
_TEXT SEGMENT DWORD PUBLIC USE32 'CODE'
START:
; қосымшалар дескрипторын қабылдау
PUSH 0
CALL GetModuleHandleA
MOV [HINST],EAX
REG_CLASS:
; терезе құрылымын толтыру
;стиль
MOV [WC.CLSSTYLE], STYLE
; хабарды өңдеу процедурасы
MOV [WC.CLWNDPROC], OFFSET WNDPROC
MOV [WC.CLSCBCLSEX], 0
MOV [WC.CLSCBWNDEX], 0
MOV EAX, [HINST]
MOV [WC.CLSHINST],EAX
; -----------терезе иконкасы
PUSH IDI_APPLICATION
PUSH 0
CALL LoadIconA
MOV [WC.CLSHICON], EAX
;-----------терезе курсоры
PUSH IDC_ARROW
PUSH 0
CALL LoadCursorA
MOV [WC.CLSHCURSOR], EAX
MOV [WC.CLBKGROUND],17
MOV DWORD PTR [WC.CLMENNAME], 0
MOV DWORD PTR [WC.CLNAME], OFFSET CLASSNAME
PUSH OFFSET WC
CALL RegisterClassA
; тіркелген классты терезе құру
PUSH 0
PUSH [HINST]
PUSH 0
PUSH 0
PUSH 150 ;DX-терезе
PUSH 400 ;DY-терезе
PUSH 100 ;Y-жол
PUSH 100 ;
PUSH WS_OVERLAPPEDWINDOW
PUSH OFFSET TITLENAME
PUSH OFFSET CLASSNAME
PUSH 0
CALL CreateWindowExA
; қатеге тексеру
CMP EAX, 0
JZ _ERR
MOV [NEWHWND], EAX
;------------------------------------------------------------------------------
PUSH SW_SHOWNORMAL
PUSH [NEWHWND]
CALL ShowWindow
;------------------------------------------------------------------------------
PUSH [NEWHWND]
CALL UpdateWindow
;
MSG_LOOP:
PUSH 0
PUSH 0
PUSH 0
PUSH OFFSET MSG
CALL GetMessageA
CMP EAX, 0
JE END_LOOP
PUSH OFFSET MSG
CALL TranslateMessage
PUSH OFFSET MSG
CALL DispatchMessageA
JMP MSG_LOOP
END_LOOP:
; бағдарламадан шығу
PUSH [MSG.MSWPARAM]
CALL ExitProcess
_ERR:
JMP END_LOOP
;терезе процедурасы
;параметрлердің стекте орналасуы
WNDPROC PROC
PUSH EBP
MOV EBP, ESP
PUSH EBX
PUSH ESI
PUSH EDI
CMP DWORD PTR [EBP+0CH], WM_DESTROY
JE WMDESTROY
CMP DWORD PTR [EBP+0CH], WM_CREATE
JE WMCREATE
CMP DWORD PTR [EBP+0CH], WM_COMMAND
JE WMCOMMAND
JMP DEFWNDPROC
WMCOMMAND:
MOV EAX, HWNDBTN
CMP DWORD PTR [EBP+14H], EAX
JNE NODESTROY
; редакторланған жолды алу
PUSH OFFSET TEXT
PUSH 150
PUSH WM_GETTEXT
PUSH HWNDEDT
CALL SendMessageA
; осы жолды көрсету
PUSH 0
PUSH OFFSET CAP
PUSH OFFSET TEXT
PUSH DWORD PTR [EBP+08H]
CALL MessageBoxA
; шығу
JMP WMDESTROY
NODESTROY:
MOV EAX, 0
JMP FINISH
WMCREATE:
;бастырма-терезе құру
PUSH 0
PUSH [HINST]
PUSH 0
PUSH DWORD PTR [EBP+08H]
PUSH 20 ; DX
PUSH 60 ; DX
PUSH 10 ; Y
PUSH 10 ; X
PUSH STYLBTN
PUSH OFFSET CPBUT
PUSH OFFSET CLSBUTN
PUSH 0
CALL CreateWindowExA
MOV HWNDBTN, EAX бастырма дескрипторын жодыда сақтау
; редакторлау терезесін құру
PUSH 0
PUSH [HINST]
PUSH 0
PUSH DWORD PTR [EBP+08H]
PUSH 20
PUSH 350 ;DX
PUSH 50
PUSH 10
PUSH STYLEDT
PUSH OFFSET CPEDT
PUSH OFFSET CLSEDIT
PUSH 0
CALL CreateWindowExA
MOV HWNDEDT, EAX
; --------------жолды редакторлау терезесіне орналастыру
PUSH OFFSET TEXT
PUSH 0
PUSH WM_SETTEXT
PUSH HWNDEDT
CALL SendMessageA
;----------------фокусты редакторлау терезесіне орналастыру
PUSH HWNDEDT
CALL SetFocus
;-----------------------------------------------------------------------------------
MOV EAX, 0
JMP FINISH
DEFWNDPROC:
PUSH DWORD PTR [EBP+14H]
PUSH DWORD PTR [EBP+10H]
PUSH DWORD PTR [EBP+0CH]
PUSH DWORD PTR [EBP+08H]
CALL DefWindowProcA
JMP FINISH
WMDESTROY:
PUSH 0
PUSH OFFSET CAP
PUSH OFFSET MES
PUSH DWORD PTR [EBP+08H]
CALL MessageBoxA
PUSH 0
CALL PostQuitMessage
MOV EAX, 0
FINISH:
POP EDI
POP ESI
POP EBX
POP EBP
RET 16
WNDPROC ENDP
_TEXT END
END START
Бұл бағдарлама нәтижесі келесі суреттерде көрсетілген.
3-сурет Бағдарламаның редакторлау қатарымен жұмыс істеуі
4-сурет Бағдарламаның нәтижесі. Редакторланған қатар.
2.2 Диалогты терезе
Ендігі мысалымызда диалогты терезені қарастырамыз. Бұл терезеде түстер
WM_SETFOCUS equ 7h
; хабар терезені жабқан кезде келеді
WM_DESTROY equ 2
;хабар терезені ашқан кезде келеді
WM_CREATE equ 1
;хабар, егер терезедегі элементтермен бір нәрсе болса
WM_COMMAND equ 111h
; элементке жол жіберу мүмкіндік беретін хабар
WM_SETTEXT equ 0Ch
; жол алуға мүмкіндік беретін хабар
WM_GETTEXT equ 0Dh
LB_ADDSTRING equ 180h
LB_GETTEXT equ 189h
LB_GETCURCEL equ 188h
LBN_DBLCLK equ 2
; терезе қасиеттері
CS_VREDRAW equ 1h
CS_HREDRAW equ 2h
CS_GLOBALCLASS equ 4000h
WS_TABSTOP equ 10000h
WS_SYSMENU equ 80000h
WS_THICKFRAME equ 40000h
WS_OVERLAPPEDWINDOW equ WS_TABSTOP+WS_SYSMENU
STYLE equ CS_HREDRAW+CS_VREDRAW+CS_GLOBALCLASS
CS_HREDRAW equ 2h
BS_DEFPUSHBUTTON equ 1h
WS_VISIBLE equ 10000000h
WS_CHILD equ 40000000h
WS_BORDER equ 800000h
WS_VSCROLL equ 200000h
LBS_NOTIFY equ 1h
STYLEBTN equ WS_CHILD+BS_DEFPUSHBUTTON+WS_VISIBLE+WS_TABSTOP
STYLLST equ WS_THICKFRAME+WS_CHILD+WS_VISIBLE+WS_BORDER+WS_TABSTOP+WS_VSCROLL+LBS_NOTIFY
;стандартты иконка идендификаторы
IDI_APPLICATION equ 32512
;курсор идентификаторы
IDC_ARROW equ 32512
;нормальді-терезе көрсету режимі
SW_SHOWNORMAL equ 1
;ішкі процедуралар прототипі
EXTERN SetFocus:NEAR
EXTERN SendMessageA:NEAR
EXTERN MessageBoxA:NEAR
EXTERN CreateWindowExA:NEAR
EXTERN DefWindowProcA:NEAR
EXTERN DispatchMessageA:NEAR
EXTERN ExitProcess:NEAR
EXTERN GetMessageA:NEAR
EXTERN GetModuleHandleA:NEAR
EXTERN LoadCursorA:NEAR
EXTERN LoadIconA:NEAR
EXTERN PostQuitMessage:NEAR
EXTERN RegisterClassA:NEAR
EXTERN ShowWindow:NEAR
EXTERN TranslateMessage:NEAR
EXTERN UpdateWindow:NEAR
;құрылымдар
;хабар құрылымдары
MSGSTRUCT STRUC
MSHWND DD ?
MSMESSAGE DD ?
MSWPARAM DD ?
MSLPARAM DD ?
MSTIME DD ?
MSPT DD ?
MSGSTRUCT ENDS
;--------терезе класстарының құрылымдары
WNDCLASS STRUC
CLSSTYLE DD ?
CLWNDPROC DD ?
CLSCBCLSEX DD ?
CLSCBWNDEX DD ?
CLSHINST DD ?
CLSHICON DD ?
CLSHCURSOR DD ?
CLBKGROUND DD ?
CLMENNAME DD ?
CLNAME DD ?
WNDCLASS ENDS
.386P
; жалпақ модель
.MODEL FLAT,stdcall
include list.inc
includelib D:\WIN32API\SVETOK\IMPORT32.LIB
_DATA SEGMENT DWORD PUBLIC USE32 'DATA'
NEWHWND DD 0
MSG MSGSTRUCT
WC WNDCLASS
HINST DD 0
TITLENAME DB 'Primer okna LISTBOX',0
CLASSNAME DB 'CLASS32',0
CPBUT DB 'VIXOD',0 ;шығу
CPLST DB ' ',0
CLSBUTN DB 'BUTTON',0
CLSLIST DB 'LISTBOX',0
HWNDBTN DWORD 0
HWNDLST DWORD 0
CAP DB 'SOOPSHENIE',0
CAP1 DB 'VIBRAN',0
MES DB 'KONES PROGR',0
;жол массиві
STR1 DB 'KRASNI',0
STR2 DB 'ZELEN',0
STR3 DB 'SINI',0
STR4 DB 'JELTI',0
STR5 DB 'JERNI',0
STR6 DB 'BELI',0
; жолдар көрсеткіші
PS DWORD OFFSET STR1
DWORD OFFSET STR2
DWORD OFFSET STR3
DWORD OFFSET STR4
DWORD OFFSET STR5
DWORD OFFSET STR6
BUF DB 30 dup(0)
_DATA ENDS
;кодалар сегменті
_TEXT SEGMENT DWORD PUBLIC USE32 'CODE'
START:
;қосымша дескрипторын қабылдау
PUSH 0
CALL GetModuleHandleA
MOV [HINST],EAX
REG_CLASS:
;стиль терезесінің құрылымын толтыру
MOV [WC.CLSSTYLE],STYLE
;хабарды өңдеу процедурасы
MOV [WC.CLWNDPROC],OFFSET WNDPROC
MOV [WC.CLSCBCLSEX],0
MOV [WC.CLSCBWNDEX],0
MOV EAX,[HINST]
MOV [WC.CLSHINST],EAX
;---------------- терезе иконкасы
PUSH IDI_APPLICATION
PUSH 0
CALL LoadIconA
MOV [WC.CLSHICON],EAX
;---------------- терезе курсоры
PUSH IDC_ARROW
PUSH 0
CALL LoadCursorA
MOV [WC.CLSHCURSOR],EAX
;-----------------
MOV [WC.CLBKGROUND],17 ; цвет
MOV DWORD PTR [WC.CLMENNAME],0
MOV DWORD PTR [WC.CLNAME],OFFSET CLASSNAME
PUSH OFFSET WC
CALL RegisterClassA
;тіркелген классты терезе құру
PUSH 0
PUSH [HINST]
PUSH 0
PUSH 0
PUSH 200
PUSH 250
PUSH 100
PUSH 100
PUSH WS_OVERLAPPEDWINDOW
PUSH OFFSET TITLENAME
PUSH OFFSET CLASSNAME
PUSH 0
CALL CreateWindowExA
; қатеге тексеру
CMP EAX,0
JZ _ERR
MOV [NEWHWND],EAX
;------------------------------------------------------------------------------
PUSH SW_SHOWNORMAL
PUSH [NEWHWND]
CALL ShowWindow
;------------------------------------------------------------------------------
PUSH [NEWHWND]
CALL UpdateWindow
MSG_LOOP:
PUSH 0
PUSH 0
PUSH 0
PUSH OFFSET MSG
CALL GetMessageA
CMP EAX,0
JE END_LOOP
PUSH OFFSET MSG
CALL TranslateMessage
PUSH OFFSET MSG
CALL DispatchMessageA
JMP MSG_LOOP
END_LOOP:
; бағдарламадан шығу
PUSH [MSG.MSWPARAM]
CALL ExitProcess
_ERR:
JMP END_LOOP
;------------------------------------------------------------------------
WNDPROC PROC
PUSH EBP
MOV EBP,ESP
PUSH EBX
PUSH ESI
PUSH EDI
CMP DWORD PTR [EBP+0CH],WM_DESTROY
JE WMDESTROY
CMP DWORD PTR [EBP+0CH],WM_CREATE
JE WMCREATE
CMP DWORD PTR [EBP+0CH],WM_COMMAND
JE WMCOMMAND
JMP DEFWNDPROC
WMCOMMAND:
MOV EAX,HWNDBTN
CMP DWORD PTR [EBP+14H],EAX
;шығу?
JE WMDESTROY
MOV EAX,HWNDLST
CMP DWORD PTR [EBP+14H],EAX ;
JNE NOLIST
;тізіммен жұмыс істейміз
CMP WORD PTR [EBP+12H],LBN_DBLCLK
JNE NOLIST
; қос басу бар, енді анықтау
; таңдаған жолды
; басында индекс
PUSH 0
PUSH 0
PUSH LB_GETCURCEL
PUSH HWNDLST
CALL SendMessageA
; енді тексттің өзі
PUSH OFFSET BUF
PUSH EAX
PUSH LB_GETTEXT
PUSH HWNDLST
CALL SendMessageA
; не таңдалғанын таңдау
PUSH OFFSET CAP1
PUSH OFFSET BUF
PUSH DWORD PTR [EBP+08H]
CALL MessageBoxA
NOLIST:
MOV EAX,0
JMP FINISH
WMCREATE:
;бастырма-терезе құру
PUSH 0
PUSH [HINST]
PUSH 0
PUSH DWORD PTR [EBP+08H]
PUSH 20 ; DY
PUSH 60 ; DX
PUSH 10 ; Y
PUSH 10 ; X
PUSH STYLEBTN ; терезе аты
PUSH OFFSET CPBUT ; класс аты
PUSH OFFSET CLSBUTN
PUSH 0
CALL CreateWindowExA
MOV HWNDBTN,EAX ; бастырма
;LISTBOX терезесін құру
PUSH 0
PUSH [HINST]
PUSH 0
PUSH DWORD PTR [EBP+08H]
PUSH 90
PUSH 150 ; DX
PUSH 50
PUSH 10
PUSH STYLLST ; терезе аты
PUSH OFFSET CPLST ; класс аты
PUSH OFFSET CLSLIST
PUSH 0
CALL CreateWindowExA
MOV HWNDLST,EAX
; тізімді толтыру
PUSH PS
PUSH 0
PUSH LB_ADDSTRING
PUSH HWNDLST
CALL SendMessageA
PUSH PS+4
PUSH 0
PUSH LB_ADDSTRING
PUSH HWNDLST
CALL SendMessageA
PUSH PS+8
PUSH 0
PUSH LB_ADDSTRING
PUSH HWNDLST
CALL SendMessageA
PUSH PS+12
PUSH 0
PUSH LB_ADDSTRING
PUSH HWNDLST
CALL SendMessageA
PUSH PS+16
PUSH 0
PUSH LB_ADDSTRING
PUSH HWNDLST
CALL SendMessageA
PUSH PS+20
PUSH 0
PUSH LB_ADDSTRING
PUSH HWNDLST
CALL SendMessageA
MOV EAX,0
JMP FINISH
DEFWNDPROC:
PUSH DWORD PTR [EBP+14H]
PUSH DWORD PTR [EBP+10H]
PUSH DWORD PTR [EBP+0CH]
PUSH DWORD PTR [EBP+08H]
CALL DefWindowProcA
JMP FINISH
WMDESTROY:
PUSH 0
PUSH OFFSET CAP
PUSH OFFSET MES
PUSH DWORD PTR [EBP+08H]
CALL MessageBoxA ;
PUSH 0
CALL PostQuitMessage
MOV EAX,0
FINISH:
POP EDI
POP ESI
POP EBX
POP EBP
RET 16
WNDPROC ENDP
_TEXT ENDS
END START
Бұл бағдарлама нәтижесі төмендегідей.
5-сурет Бағдарлама терезесі
6-сурет Түстерді таңдау
7-сурет Бағдарламадан шығу
3. API функцияларын сипаттау
Windows операциялық жүйесінде Ассемблер тілі жүйелік функцияларды, яғни
1-кесте Терезе класының стилінің мағынасы жайлы тізім
Терезе стилінің мағнасы Түсініктеме
CS_BYTEALIGNCLIENT Терезенің жұмыс істеу аймағын видеожады байтының шекарасы
CS_BYTEALIGNWINDOW Барлық терезені видеожады байтының шекарасы бойынша түзеу.
CS_CLASSDC Барлық терезелерге бірдей бейнелену контекстін құру.
CS_DBLCLKS Терезе функциясы жұмыс істеу аймағын тышқан батырмасымен
CS_GLOBALCLASS Барлық қосымшалардың қолы жететін класс. Терезе құрғанда
CS_HREDRAW Терзе енін өзгерткен кезде жұмыс істеу аймағын
CS_NOCLOSE Жүйелік менюда CLOSE командасын өшіру.
CS_OWNDC Әр терезе үшін құрылғының өзіндік контекстін құру.
CS_PARENTDC Терезе өзін құрған терезенің (аталық) құрылғы контекстін
CS_SAVEBITS Бір бөлікті терезе жауып тұрса, сол бөлікті
CS_VREDRAW Терезе биіктігі өзгергенде жұмыс істеу аймағын бояу.
Мәні Қолданылуы
IDI_APLICATION Қосымша терезесіне үнсіз тағайындалатын иконка.
IDI_ASTERISK і символы (ақпараттық хабарларда қолданылады)
IDI_EXCLAMATION Леп белгісі (ескертулерде қолданылады)
IDI_HAND STOP белгісі (қателерде қолданылады)
IDI_QUESTION Леп белгісі (көмек көрсетуде қолданылады)
NULL немесе IDI_WINLOGO Windows эмблемасы.
2 - кесте Жүйеде анықталған иконкалар мәнінің тізімі
3 – кесте Тышқан бағдаршасының жүйеде анықталған мәндерінің
Мәні Қолданылуы
IDC_APPSTARTING Стандарты бағдарша және кішкене құм сағаты.
IDC_ARROW Стандарты бағдарша.
IDC_CROSS Айқасу.
IDC_IBEAM I түріндегі мәтінді бағдарша.
IDC_NO Сызылған шеңбер.
IDC_SIZEALL Төртжақты бағдарша.
IDC_SIZENESW Екі жақты бағдарша (солтүстік-шығыс және оңтүстік- батыс)
IDC_SIZENS Екі жақты бағдарша (солтүстік және оңтүстік)
IDC_SIZENWSE Екі жақты бағдарша (солтүстік- батыс және оңтүстік-
IDC_SIZEWE Екі жақты бағдарша ( батыс және шығыс)
IDC_UPARROW Тік бағдарша.
IDC_WAIT Құм сағаты.
4 – кесте Жүйелік түстер мәндерінің тізімі
Түс идентификаторы Жүйеде қолданылуы
COLOR_ACTIVEBORDER Белсенді терезе жақтушасы.
COLOR_ACTIVECAPTION Белсенді терезе басы.
COLOR_APPWORKSPACE MDI-терезе фоны.
COLOR_BACKGROUND,
COLOR_DESCTOP Жұмыс столы.
COLOR_BTNFACE Үш өлшемді элементер түсі.
COLOR_BTNHIGHLIGHT Таңдалған батырма.
COLOR_BTNSHADOW Үш өлшемді элементер көлеңкесі.
COLOR_BTNTEXT Батырма мәтінінің жазбасы.
COLOR_CAPTIONTEXT Терезе басының мәтіні, өлшемді өзгерту батырмасы жәнеқарау
COLOR_GRAYTEXT Кілттенген элемент мәтіні.
COLOR_HIGHLIGHT Таңдалған басқару элементі.
COLOR_HIGHLIGHTTEXT Таңдалған элемент мәтіні.
COLOR_INACTIVEBORDER Белсенді емес терезе жақтаушасы.
COLOR_INACTIVECAPTION Белсенді емес терезе басы.
COLOR_
INACTIVECAPTION-TEXT Белсенді емес терезе басының мәтіні.
COLOR_MENU Меню фоны.
COLOR_MENUTEXT Меню мәтіні.
COLOR_SCROLLBAR Қарау жолағының ішкі аймағы.
COLOR_WINDOW Терезе фоны.
COLOR_WINDOWFRAME Терезе жақтаушасы.
COLOR_WINDOWTEXT Терзедегі мәтін.
COLOR_3DDKSHADOW Үш өлшемді элементтердің қара көлеңкесі.
COLOR_BTNLIGHT Таңдалған үш өлшемді элементтер қырының түсі.
COLOR_3DLIGHT Үш өлшемді элементтер қырының түсі.
COLOR_INFOBK Құрал-саймандар панелінің фоны.
COLOR_INFOTEXT Құрал-саймандар панелінің мәтіні.
5- кесте Терезе стилі мәнінің тізімі.
Тұрақты аты Стильді сипаттау
WS_BORDER Жақтаушасы бар терезе.
WS_CAPTION Басқы бөлігі бар терезе.
WS_CHILD немесе WS_ CHILDWINDOW Қосалқы терезе.
WS_CLIPCHILDREN Аталық терезе өзінің қосалқы терезелері жауып тұрған
WS_CLIPSIBLINGS Бір аталық терезенің қосалқы терезесі жауып тұрған
WS_DISABLED Кілттенген терезе құру.
WS_DLGFRAME Басқы бөлігі жоқ қосалқы жақтаулы терезе.
WS_GROUP Осы элемментен және осыдан кейінгі WS_GROUP
WS_HSCROLL Көлденең қару жолағы бар терезе.
WS_ICONIC немесе
WS_MINIMIZE Пиктограмма түріндегі терезе.
WS_MAXIMIZE Терезенің максимал мүмкін болатын өлшемі.
WS_MAXIMIZEBOX Минимизацияланған өлшемді қайта қалпына келтіретін батырмасы бар
WS_MINIMIZEBOX Пиктограмма түріне келтіру батырмасы бар терезе. WS_OVERLAPPED
WS_OVERLAPPED Басы және жақтаушасы бар жабылатын терезе.
WS_OVERLAPPEDWINDOW WS_OVERLAPPED,
WS_THICKFRAME,
WS_SYSMENU,
WS_MINIMIZEBOX,
WS_MAXIMIZEBOX стильдерінің комбинациясынан тұратын терезе.
WS_POPUP Уақытша терезе.
WS_POPUPWINDOW WS_POPUP, WS_BORDER және WS_SYSMENU стильдерінің комбинациясы. Жүйелік
WS_SIZEBOX Терезе өлшемін өзгертуге арналған жуан жақтаушасы бар
WS_SYSMENU Жүйелік менюі бар терезе. WS_CAPTION көмегімен қосады.
WS_TABSTOP Таb пернесін басқанда пернетақтадан кіріс фокусын алатын
WS_VISIBLE Терезе құрылғаннан кейін бірден көрінеді.
WS_VSCROLL Тік қарау жолағы бар терезе.
MDIS_ ALLCHILDSTYLES Қосалқы MDI-терезесін құрады,терезені анықтайды,кез-келген стильдер
ҚОРЫТЫНДЫ
Қорыта келгенде, біз бұл жұмыста
Бұл бағдарламалау тіліне енетін бірнеше компиляторлар мен көптеген
Assembler тілінің көптеген қиындықтарына қарамастан қазіргі программистердің көбісі
Бұл тілді көбінесе кәсіпқойлар пайдаланғандықтан, қарапайым қолданушылар Assembler
Менің ұсынысым — DOS операциялық жүйесінде қолданылатын Assembler
Қолданылған әдебиет тізімі
В.Ю. Пирогов Ассемблер для Windows Москва Изд. Молгачева
Р.М. Ганеев Проектирование интерфейса пользователя средствами Win 32
С.В. Зубков Assembler для DOS,Windows и UNIX Москва
В.Ю. Пирогов Assembler Москва Изд. 2001
3
Ассемблер тілінің шығыс модулі
Обьект модулі
Орындаушы модуль
кітапханалар және басқада обьектілік модульдар
Трансляцияляциалау 1-ші кезең
Трансляциалау 2-ші кезең
Windows операциялық жүйесінде Win32API функцияларын пайдаланып Assembler тілінде бағдарламалау
Электрондық оқулық құру туралы
OPENGL - ДІҢ НЕГІЗГІ ҚАСИЕТТЕРІ
Microsoft Еxcel бағдарламасымен жұмыс істеу жолдары. Практикум ПЭВМ
Графикалық терезе (PictureBox) бетіне шығаруды қамтамасыз етуші әдістерді сипаттау
Turbo pascal программалау тілі туралы
ПАСКАЛЬ БАҒДАРЛАМАЛАУ ТІЛІНІҢ ГРАФИКАЛЫҚ МҮМКІНДІКТЕРІ
Электрондық оқыту құралы
Web беттерін құрудағы JavaScript-ің мүмкіндіктері және электрондық басылымдарды жасау технологиясы
Графиктік режимге көшу адаптері