Жоспар №14752

Windows операциялық жүйесінде Win32 API арқылы ассемблер тілінде бағдарламалау

Сұрақ-жауап

Сұрағыңызға жасанды интеллект жауап береді

 ҚАЗАҚСТАН РЕСПУБЛИКАСЫНЫҢ ҒЫЛЫМ ЖӘНЕ Б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-ші кезең 

Мәтінді көшіру үшін белсенді жазылым қажет.

Пайдаланушы ID: 306823

Жарияланған күні: