Windows операциялық жүйесінде Win32API функцияларын пайдаланып Assembler тілінде бағдарламалау
ҚАЗАҚСТАН РЕСПУБЛИКАСЫНЫҢ ҒЫЛЫМ ЖӘНЕ БIЛIМ МИНИСТРЛIГI
Қ.И. Сәтбаев атындағы
Қазақ Ұлттық Техникалық Университетi
Есептеу техника кафедрасы
Баяндама
Тақырыбы: Windows операциялық жүйесінде
Win32API функцияларын пайдаланып
Assembler тілінде бағдарламалау
Жетекшілер: Қонаева
Тирижанова
Орындағандар: Майлыбаев Е.Қ.
Сарыбаев Р.М.
Тобы: ОТЗ-01-1қ
АЛМАТЫ 2004
МАЗМҰНЫ
I.
Кіріспе ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ..
... ... ... ... ... ... ... ... ... ..3
II. Негізгі
бөлім ... ... ... ... ... ... ... .. ... ... ... ... ... ... ... ... .
... ... ... ... ... ... ..4
1. Windows операциялық жүйесінде Assembler тілін қолданып
бағдарламалау ... ... ... ... ... .. ... ... ... ... ... ... ... ... .
... ... ... ... ... ... ... ... 4
2. Терезе
түрлері ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... .
... ... ... ... ... ... ..7
2 Терезелер
классы ... ... ... ... ... ... ... . ... ... ... ... ... ... ... ... .
... ... ... ... ... 8
1.3.1 Терезе классының қолданатын ресурстарын
сипаттау ... ... ... ... ... .8
2. Терезе
функциясы ... ... ... ... ... ... .. ... ... ... ... ... ... ... ... .
... ... ... ... ... 9
3. Терезе
құру ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... .
... ... ... ... ... ... 10
1.4 Қосымшаның басты
функциясы ... ... ... ... ... ... .. ... ... ... ... ... ... ... .11
1.5 Қосымша мәтінінің
құрылымы ... ... ... ... ... ... ... ... ... ... ... ... ... ... ..13
1.6 Терезе құрудың қосымша
функциялары ... ... ... ... ... ... ... ... ... ... ..13
1.7 Іздеу және терезе күйін
анықтау ... ... ... ... ... ... ... ... ... ... ... ... ... ...13
1.8 Терезелердің жылжу
функциясы ... ... ... ... ... ... .. ... ... ... ... ... ... ... .14
9. Қолданушыға арналған қосымша
мәлімет ... ... ... ... ... ... ... ... ... ...15
2 Win 32 API функцияларын пайдаланып Assembler тілінде
бағдарламалау ... ... ... ... ... .. ... ... ... ... ... ... ... ... ... ... .
... ... ... ... ... ...16
1. Мәліметтерді өңдеу
терезесі ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ..
.16
2. Диалогты
терезе ... ... ... ... ... ... ... . ... ... ... ... ... ... ... ... ..
... ... ... ... ...23
3 API функцияларын
сипаттау ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ..33
Қорытынды ... ... ... ... ... ... .. ... ... ... ... ... ... ... ... ... ... ..
... ... ... ... ... ...37
Қолданылған
әдебиет ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ..
... 38
Кіріспе
Компьютерлік технологиялардың қарқынды дамуы барысында компьютерлерге
арналған түрлі бағдарламалық қамтамалардың да көбеюі жаңалық емес. Әрбір
адамға ЭЕМ- де және оның құрылғыларында тиімді жұмыс істеу үшін
бағдарламалау тілдерінің алатын орны ерекше болып есептеледі.
Бағдарламалау тілдерінің түрі көп. Олардың әрқайсы өзінің
мүмкіндіктерімен ерекшеленеді. Қазіргі уақытта ЭЕМ қолданушыларының көбісі
жоғарғы деңгейлік бағдарламалау тілдерін таңдауда. Бұндай таңдаудың себебі
түсінікті, өйткені бұл бағдарламалау тілдері жеңілдеу, жұмыс істеуге
ыңғайлы және нәтижені еш қиындықсыз көруге болады.
Дегенмен біз өз баяндамамыздың негізгі мақсаты ретінде Windows
операциялық жүйесіне арналған Assembler тілін таныстыруды көздедік.
Assembler төменгі дәрежелі бағдарламалау тіліне жатады. Оның көптеген
ерекшеліктерімен сіз жұмысты оқу барысында таныса аласыз.
Негізгі бөлім
1.1 Windows операциялық жүйесінде Assembler тілін қолданып
бағдарламалау.
Windows операциялық жүйесіне Си және басқа да бағдарламалау тілдері
тұрғанда ассемблер не үшін қажет деген сұрақ туады. Бұл сұрақтың жауабы өте
қарапайым. Ассемблер санашық тілі болып есептеледі, сол себепті санашықтар
өмірде кең көлемде пайдаланылып жатқандықтан, ассемблерде өз “өмір сүруін”
тоқтатпайды. Сонымен қатар ассемблер бағдарламалау тілінде бағдарламалар
кодтарын іске қосуға, драйверлер мен трансляторлар жазуға, кейбір ішкі
құрылғыларға бағдарламалар жазуға болады.
Ассемблер тілінде MS-DOS операциялық жүйесінде бағдарламалағанға
қарақанда Windows операциялық жүйесінде бағдарламалаған жеңіл. Жоғарғы
деңгейлі бағдарламалау тілдерімен жұмыс істеу кезінде біз кейбір
алгоритмдік үрдістерден айрыламыз. Шынына келгенде ассемблер тілінде
бағдарламалау профессионалдық деңгейді жоғарылатып, санашықтың жұмыс істеуі
мен ішкі құрылысын түсінуді жеңілдетеді.
Қазіргі уақытта бір- бірімен бақталас екі ассемблер дестелері бар.
Олар: MASM (Macro Assembler) және TASM (Turbo Assembler). Ассемблер
тіліндегі бағдарламаларды іске қосу үшін MASM 6.14 және TASM (TASM32.exe
5.0, TLINK32.EXE 1.6.71) версияларын қолданған дұрыс. Бағдарламаны Windows
операциялық жүйесінде трансляциялау төмендегі сұлба бойынша жүреді.
1- сурет. Ассемблерлік модульдің трансляциялану сұлбасы.
Трансляцияның 2- ші кезеңіне екі негізгі бағдарламалар сәйкес келеді.
Олар: ML.EXE ассемблерімен LINK.EXE редакторы немесе TASM32.EXE және
TLINK32.EXE.
Ассемблер бағдарламасының мәтіні бар файлдың аты PROG.ASM болсын, онда
трансляциялаудың 2- і кезеңі келесі түрде болады.
C:\masm32\bin\mlccoffPROG.ASM
Осыдан кейін PROG.OBJ модулі пайда болады. Содан кейін
c:\masm32\bin\Link SUBSUSTEM: Windows PROG.OBJ әрекеті орындалады.
Сол кезде PROG.EXE орындалу модулі құрылады. Бұл жерде c және coff
ML.EXE бағдарламасының параметрлері, ал SUBSYSTEM: Windows LINK.EXE
бағдарламасының параметрлері болып табылады.
Ассемблерда бағдарламаны бірнеше бөліктерге бөліп, трансляцияның 1- ші
кезеңінде қайтадан біріктірген ыңғайлы. Бұл INCLUDE дерективасы арқылы
жүзеге асады. Мысалы бір файлда бағдарлама коды, ал тұрақтылар, мәліметтер,
процедуралар басқа файлда болады.
Ендігі жерде басқа обьектілік модульдер мен кітапханаларды
трансляцияның 2- ші кезеңіне қосуды қарастырайық. Қанша обьектілік модуль
қосылса да, олардың ішінде біреуі негізгі болады, яғни бағдарлама осы
модульден басталады. Модульдердің арасындағы айырмашылық осымен бітеді.
Негізі қосалқы модульдерге негізгі модульден және басқа модульдерден
шақырылатын процедуралар орналастырылады. Бірнеше модульдерді біріктіргенде
бірінші болып негізгі модуль содан кейін қосалқы модульдер біріктірілуі
керек.
Келесі қарастыратынымыз INVOKE дерективасы. Бұл қолайлы команда, бірақ
өзіндік ерекшеліктері бар.
Қолайлы жағы @N қоспасынан құтыламыз, 2- ші жағынан бұл команда стекке
берілетін мәндерді өзі бақылайды.
PUSH Par1
PUSH Par2
PUSH Par3
PUSH Par4
Call Name_PROC@N; N- стекке жіберілетін байттар көлемі. Бұл өрнек
INVOKE командасын қолданғанда келесідей түрге өзгереді.
INVOKE NAME_PROC, par4, par3, par2, par1
Бұл кезде параметрлер ретінде құрcым, анықталған мән немесе адрес
қарастырылады. Адрес үшін OFFSET және ADDR операторларыда қолданылады.
INVOKE командасының тиімсіз жағы макродеректерді қолдану.
Макродеректерді қолданғанда тілдің сұлулығы жоғалады және ассемблер тілін
жаңадан үйреніп жүргендерге стекке мәндерді команда арқылы емес, өздері
жіберіп үйренгені дұрыс.
Біздің 1- суретте обьектілік модульдерден басқа кітапханалар жайлы да
айтылады. Егерде обьектілік модульдер бірнеше болса, онда олар белгілі бір
жағдайларда қолайсыздық тудырады. Сол себепті обьектілік модульдер
кітапханаларға бірігеді. MASM- ға кітапхана қосу үшін INCLUDELIB
дерективасын қолданған ыңғайлы. INCLUDELIB дерективасы обьектілік кодта
сақталады және LINK.EXE бағдарламасымен пайдаланылады.
Бірақ обьектілік модульдерден қалай кітапхана құрса болады? Ол үшін
кітапханашы деп аталатын арнайы бағдарлама бар. Егер біз PROG2.OBJ
модулінен тұратын LIB1.LIB кітапханасын құрғымыз келсе, төмендегі команданы
орындаймыз.
LIBOUT:LIB1.LIB PROG2.OBJ
Егер кітапханаға тағы бір модуль қосқымыз келсе (мысалы MODUL.OBJ)
LIB1.LIB MODUL.OBJ командасын орындаймыз.
Кітапханашының тағы да екі пайдалы командалары LIBLIST LIB1.LIB-
кітапхана модульдерінің тізімін береді, LIBREMOVE:MODUL.OBJ LIB1.LIB-
кітапханадан MODUL.OBJ модулін жояды.
Жоғарыда біз тек MASM дестесін қарастырды, енді TASM дестесін
қарастырып өтейік. TASM дестесінде трансляциялау форматы төмендегідей.
TASM32ml PROG.ASM
TLINK32_aа PROG.OBJ
TASM дестесінде модульдарды біріктіру өте қарапайым түрде жүреді.
Мысалы: TLINK32- аа PROG1.OBJ PROG2.OBJ кітапханасымен жұмыс істеу үшін
TASM дестесінде TIB.EXE атты кітапханашы бағдарлама бар. PROG2.OBJ
модулінен тұратын кітапхана құру үшін
TLIB LIB1.LIB+PROG2.OBJ командасы орындалады. Нәтижесінде LIB1.LIB
кітапханасы құрылады.
TLINK32 - нің командалық қатарының кеңейтілген түрі мынандай: TLINK32-
аа OBJFILES, EXEFILE, MAPFILE, LIBFILES.
Мұндағы OBJFILE- орындалатын модуль
MAPFILE- модуль құрылымы жайлы ақпарат беретін MAP- файл
LIBFILE- бір немесе бірнеше кітапхана (пробел арқылы)
TASM- да INVOKE дерективасы жоқ.
Ассемблерде басқа да бағдарламалар қолданылады. Мысала: редакторлар,
дизассемблерлер, Hex- редакторлар, отладчиктар, ресурстар компиляторы,
ресурстар редакторы. Енді жеке- жеке тоқталып өтейік.
Редакторлар: QEDITOR.EXE редакторы MASM32 дестесінің ішіне кіреді. Бұл
редактор және оның утилиттары ассемблер тілінде жазылған. QEDITOR.EXE
редакторының көлемі бар болғаны 27 Кб, ал оның утилитасының көлемі 6 Кб
қана. Бұл редактор бір модульді, кішкене қосымшалар үшін қолайлы, ал
бірнеше модульдермен жұмыс істеуге бұл редактор ыңғайлы емес. Редактор
әртүрлі утилиттар мен дестелік файлдар арқылы байланысып жұмыс істейді.
Мысалға, бағдарламаның трансляциясын ML.EXE ассемблері қолданатын ASBL.BAT
дестелік файлы орындап, нәтижесін ASMBL.TXT мәтіндік файлына жібереді. Осы
файлды қарау үшін THEGUN.EXE қарапайым утилитасы қолданылады. Орындалатын
модульді дизассемблерлеу үшін DUMMPER.EXE утилитасы қолданылып, нәтижесі
DIASM.TXT мәтіндік файлына жіберіледі.
Сонымен қатар EAS.EXE бағдарламасын қарастырайық. Бұл редактор,
дәлірек айтсақ қабықша ASM-, OBJ-, RC-, RES-, DEF- файлдарынан тұратын
күрделі жобаларды құруға, трансляциялауға мүмкіндік тудырады. Бұл
бағдарлама MASM немесе TASM ортасында жұмыс істейді.
Отладчиктер: Отладчиктер бағдарламаны қадам бойынша жұмыс істейді.
Қолдануға ыңғайлы және белгілі отладчиктерге Code View, Turbo Debugger, Ice
жатады.
Дизассемблерлер: Дизассемблерлер орындалатын модульді ассемблерлік
кодқа айналдырады. Мысалға, W32 Dasm, Ida Pro, Dumppe.exe дизассемблерлерін
атап өтсек болады.
Hex- редакторлар: Hex- редакторлар жүктелетін модульдарды 16- қ түрде
көрсетеді. Мұндай редакторлардың түрлері көп. Кейбір дизассемблерлер мен
отладчиктердің құрамында да Hex- редакторлар болады. Мысалға, хакерлер
ортасында танымал болып келген HIEW.EXE бағдарламасын атауға болады. Бұл
бағдарлама жүктелетін модульдерді
16-қ түрде және ассемблерлік код түрінде қарауға жағдай тудырады. Сонымен
қатар бұл мәліметтерді түзетуге де мүмкін болады.
1.2 Терезе түрлері.
Windows - қа арналған бағдарламалар қосымша деп аталады. Қолданушы
қосымша көмегімен келесі терезелер түрімен қарым- қатынас құрады:
1. Терезе қосымша: жұмыстың орындалуын ұйымдастырады, іске қосылған
кезде бірінші болып шығады да жұмыстың тоқтауымен жабылады.
2. MDI- терезелер: Бұл терезе бірнеше құжаттарды бір уақытта өңдеуге
арналған.
3. Көмекші терезе. Бұл терезе көп жағдайда операциялық жүйенің
басқаруымен орындалады.
4. Диалог терезесі. Бұл терезе қосымша мен қолданушының арасында
құжаттардың жылдам ауысуын қамтамасыз етеді.
Құрастырушыға терезе қосымша мен операциялық жүйенің
функционалдауымен жұмыс істейтін элементтер жиындығы болып табылады.
Бағдарламалық тілдерінің негізі бойынша терезе дегеніміз онымен
әртүрлі әрекеттер жасауға болатын обьект, яғни айнымалы.
Обьект көптеген мәліметтерді баяндайтын және өзгертетін белгілі бір
классқа жатады.
2-сурет Көптеген элементері бар:
1-Жүйелік меню батырмасы; 2-Терезені пиктограммаға айналдыру
батырмасы; 3-Терезені қалпына келтіру және максималдау батырмасы; 4-
Терезені жабу батырмасы; 5-Терезе өлшемдерін өзгерту жақтауы;
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_APPLICAT ION);
wc.hCurcor=LoadCursor(NULL,IDC_ARRO W);
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 Осы класстағы терезенің басты менюінің ресурсының атын
көрсетеді. wc.IpszMenuName= (LPCTSTR)NULL
10. IpszClassName Тіркелетін терезе классының аты бар жолды көрсетеді.
Мысалы: wc.IpszClassName=szName
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 тең. Егер туынды
терезе құрылатын болса онда hMenu аргументі ретінде осы терезенің
идентификаторы саналады.
Терезенің стильін оның сыртқы бейнелеріне қарап айырамыз.
Терезе стилін баяндау үшін символдық тұрақты WS_ қолднылады.
Қасиеттердің жиындығына байланысты терезелерді бірін- бірі басатын, уақытша
және туынды терезелерге бөлеміз.
Көбінесе қосымшалар терезелі болып келеді. Мұндай терезелердің негізгі
стилі WS_OVERLAPPER тұрақтысымен беріледі.
Бірін- бірі жабатын терезе басқа бір терезеге бағынуы мүмкін. Егер
басты- терезе пиктограммаға түрленсе онда оған бағынатын терезелер де
көрінбейтін болып қалады. Басты- терезені жабқан кезде оған бағынатын
терезелер де жабылады. Бағынатын терезелер әрқашан басты терезенің үстінде
орналасады.
Уақытша терезелер көбінесе қолданушыға хабар шығару үшін қолданылады
да экранда қысқа уақытта ғана көрініп тұрады. Уақытша терезенің негізгі
стилі WS_POPUP тұрақтысымен беріледі. Келісім бойынша мұндай терезенің басы
болмайды.
Туынды терезелер басқару органдарын құру үшін қолданылады. Кірісімен
анықталатын басқару органдарының классы туынды терезелер болып саналады.
Туынды терезелердің негізгі стилі WS_CHILD тұрақтысымен беріледі. Туынды
терезеде кішірейтетін және үлкейтетін батырма болмайды. Бірақ әрқашан басты-
терезесі болады. Олар басты- терезеге “жабысып” сонымен бірге жылжиды және
басты- терезенің сыртына шыға алмайды.
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
API талаптарымен анықталған.
hInstance параметрі операциялық жүйеден ағымдағы қосымшаның
дескрипторын алады.
hPrevinstance параметры 16-разрядты қосымшаларда алдындағы белсенді
болған қосымшаны көрсетеді. Ал Win32 қосымшаларында ол әрқашан NULL тең.
nCmdshow параметрі қосымшаға терезенің бастапқы шығару әдісін береді.
WinMain функциясының құрылымында msg және hwnd айнымалылары
баяндалған. Msg айнымалысы уақытша хабарларды қабылдауға және таратуға
арналған. hwnd айнымалысы құрылған терезенің дискрипторын сақтайды.
Терезе классын тіркеуден өткізу үшін RegClass функциясы шақырылады.
If(!RegClass(WndProc,s2ClassName)) return False;
Терезе құру үшін CreateWindow функциясы шақырылады. Егер терезе
құрылмаса қосымша өз жұмысын аяқтайды. Құрылған терезені шақыру үшін
ShowWindow функциясы шақырылады.
ShowWindow(hwind, SW_SHOWMAXIMIZED);
Бұл функция терезені максимальді үлкен түрде экранға шығарады.
While(GetMessage(&msg, 0, 0, 0))
{TranslateMessage(&msg); DispatchMessage(&msg);}
Бұл цикл хабарларды өңдеу циклы деп аталады.
GetMessage функциясы қосымшаның тізімінде тұрған хабарлардың
кезектегі хабарын таңдайды.
TransLateMessage пернетақтадағы хабарды трансляциялайды,
DispatchMessage функциясы хабарларды терезе функцияларына таратады.
Дәл осы циклда терезе функциясын “шақыру” болады.
Жоғарыда көрсетілген функциялардың түпнұсқасын қарастырайық:
ShowWindow функциясы келесі түрде баяндалады: Bool ShowWindow(HWND
hwnd, int nCmdShow).
Қосымшаны жүктегеннен соң шақыртылуы кезінде екінші аргументіне
WinMain функциясына nCmdShow параметрін меншіктейміз.
GetMessage функциясы келесі түрде баяндалады. BoolGetMessage(LPMSG
Ipmsg, HWNO hwnd, WORD UmsgfillterMin, Word UMsgFillterMax);
Lpmsg параметрі таңдалатын хабарды MSG типті құрылымға жазады. Hwnd-
терезе дискрипторы. UmsgfilterMin және UmsgFilterMax параметрлері
таңдалатын хабарлардың аймағын және хабарлардың минимальді максимальді
кодтарын береді. Егер осы параметрлердің мәні нольге тең болса онда
кезектегі хабарлардың барлығы таңдалады.
GetMessage функциясы адресі бірінші параметірімен берілген кезектегі
таңдаулы мәліметті өшіреді. WM_QUIT кодты мәліметті таңдаған кезде ол ноль
мәнін қайтарады да циклды мәліметті өңдемей аяқтайды. Басқа мәліметті
таңдаған кезде GetMessage функциясы нольге тең емес мәнді қайтарады.
1.5 Қосымша мәтіннің құрылымы
Қосымша мәтіннің құрылымы екі талап бойынша анықталады.
1. Мәтін WinMain функциясының сипаттамасынан тұрады.
2. Егер жаңа класс тіркелсе, онда мәтін WINDCLASS типті құрылымның
сипаттамасынан және осы классты терезелер функцияларынан тұрады.
1.6 Терезе құрудың қосымша функциялары
Windows API терезелерді құруға қатысты бірнеше функциялардан тұрады.
Олар: іздеу, күйді анықтау, терезенің жылжу және қолданушымен мәлімет ауысу
функциялары.
1.7 Іздеу және терезенің күйін анықтау функциялары
Кей жағдайларда берілген дескрипторларға терезе бар жағын анықтау
керек болады. Бұл қызметті IsWindow функциясы атқарады:
BOOL IsWindow (HWND hwnd);
Егер hwnd дискрипторы бар терзе бар болса функция ноль емес мәнді
қайтарады, ал кері жағдайда ноль.
Егер берілген терезенің кіру фокусын анықтау керек болса, Is Window
Enabled функциясы шақырылады: BOOL Is Window Enabled (HWND hwnd);
Егер hwnd терезесі белсенді болса, функция ноль емес мәнді, ал кері
жағдайда нольді қайтарады.
Терезенің кіру фокусынын өзгерту үшін немесе алу үшін Enabel Window
функциясы шақырылады: BOOL EnabelWindow (HWND hwnd, BOOL bEnable);
bEnable= TRUE болғанда кіру фокусы hwnd терезесіне беріледі, ал олай
болмаған жағдайда терезе кілттенеді.
Егер терезе бұрын белсенді болмаған болса, ноль емес мән, ал белсенді
болған жағдайда ноль қайтарылады.
Кіріс фокусын hwnd терезесіне SetFocus функциясы арқылы беріледі:
SetFocus (hwnd);
Келесі функция hwnd терезесі пиктограмма түрінде тұрғанда нольдік емес
мән қайтарады: BOOL Is Iconic (HWND hwnd);
Fine Window функциясы Ip Window Name деп басталатын IpClassName
классты терезенің дискрипторын операциялық жүйеден сұрайды. Бұл функция
келесі түрде сипатталады. HWND FindWindow (LPCTSTR Ip Class Name, LPCTSTR
IpWindowName)
Егер IpWindowName=NULL болса, онда ізделіп жатқан терезе кез- келген
классқа жатуы мүмкін. Егер мұндай терезе табылса функция дескрипторды
қайтарады немесе ноль.
1.8 Терезелердің жылжу функциясы
hwnd терезесінің өлшемдерін өзгерту үшін және терезенің жылжу үшін
MoveWindow функциясы шақырылады. Оған терезенің жаңа координаталарын
береді.
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 функциясы көмегімен алады. Барлық
өлшемдер пиксель түрінде қайтарылады.
Get System Metrics функциясы келесі түрде сипатталған: Int Get System
Metrics (Int nIndex);
nIndex параметрі жүйе қайтаратын өлшемді немесе орнатылған
конфигурацияны көрсетеді. Төменде бұл функцияға қатысты кесте
қарастырылған.
1.9 Қолданушыға арналған қосымша мәліметі
Мәтіндік мәліметті шығару үшін және оған қалданушы жауап беру үшін
мәлімет терезесі қолданылады. MessageBox функциясы мәлімет терезесін
көрсетеді, оның жұмыс істеуін қамтамасыз етеді және жабады.
Int WINAPI MessageBox (
HWND hwnd, Аталық терезе дескрипторы
LPCTSTR IpText, Мәлімет мәтінінің адресі
LPCTSTR IpCaption Мәлімет терезесі басының адресі
UNIT uType Мәлімет терезесінің стилі
);
Егер hwnd= NULL болса, мәлімет терезесінің аталық терезесі жоқ болады.
Егер IpCaption= NULL болса, терезе басында “Қате” деген қатар шығады. nType
параметрі мәлімет терезесінің іс- қимылын және мазмұнын анықтайтын
жалаушалар комбинациясы түрінде беріледі.
Келесі жалаушалар мәліметтер ... жалғасы
Қ.И. Сәтбаев атындағы
Қазақ Ұлттық Техникалық Университетi
Есептеу техника кафедрасы
Баяндама
Тақырыбы: Windows операциялық жүйесінде
Win32API функцияларын пайдаланып
Assembler тілінде бағдарламалау
Жетекшілер: Қонаева
Тирижанова
Орындағандар: Майлыбаев Е.Қ.
Сарыбаев Р.М.
Тобы: ОТЗ-01-1қ
АЛМАТЫ 2004
МАЗМҰНЫ
I.
Кіріспе ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ..
... ... ... ... ... ... ... ... ... ..3
II. Негізгі
бөлім ... ... ... ... ... ... ... .. ... ... ... ... ... ... ... ... .
... ... ... ... ... ... ..4
1. Windows операциялық жүйесінде Assembler тілін қолданып
бағдарламалау ... ... ... ... ... .. ... ... ... ... ... ... ... ... .
... ... ... ... ... ... ... ... 4
2. Терезе
түрлері ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... .
... ... ... ... ... ... ..7
2 Терезелер
классы ... ... ... ... ... ... ... . ... ... ... ... ... ... ... ... .
... ... ... ... ... 8
1.3.1 Терезе классының қолданатын ресурстарын
сипаттау ... ... ... ... ... .8
2. Терезе
функциясы ... ... ... ... ... ... .. ... ... ... ... ... ... ... ... .
... ... ... ... ... 9
3. Терезе
құру ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... .
... ... ... ... ... ... 10
1.4 Қосымшаның басты
функциясы ... ... ... ... ... ... .. ... ... ... ... ... ... ... .11
1.5 Қосымша мәтінінің
құрылымы ... ... ... ... ... ... ... ... ... ... ... ... ... ... ..13
1.6 Терезе құрудың қосымша
функциялары ... ... ... ... ... ... ... ... ... ... ..13
1.7 Іздеу және терезе күйін
анықтау ... ... ... ... ... ... ... ... ... ... ... ... ... ...13
1.8 Терезелердің жылжу
функциясы ... ... ... ... ... ... .. ... ... ... ... ... ... ... .14
9. Қолданушыға арналған қосымша
мәлімет ... ... ... ... ... ... ... ... ... ...15
2 Win 32 API функцияларын пайдаланып Assembler тілінде
бағдарламалау ... ... ... ... ... .. ... ... ... ... ... ... ... ... ... ... .
... ... ... ... ... ...16
1. Мәліметтерді өңдеу
терезесі ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ..
.16
2. Диалогты
терезе ... ... ... ... ... ... ... . ... ... ... ... ... ... ... ... ..
... ... ... ... ...23
3 API функцияларын
сипаттау ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ..33
Қорытынды ... ... ... ... ... ... .. ... ... ... ... ... ... ... ... ... ... ..
... ... ... ... ... ...37
Қолданылған
әдебиет ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ..
... 38
Кіріспе
Компьютерлік технологиялардың қарқынды дамуы барысында компьютерлерге
арналған түрлі бағдарламалық қамтамалардың да көбеюі жаңалық емес. Әрбір
адамға ЭЕМ- де және оның құрылғыларында тиімді жұмыс істеу үшін
бағдарламалау тілдерінің алатын орны ерекше болып есептеледі.
Бағдарламалау тілдерінің түрі көп. Олардың әрқайсы өзінің
мүмкіндіктерімен ерекшеленеді. Қазіргі уақытта ЭЕМ қолданушыларының көбісі
жоғарғы деңгейлік бағдарламалау тілдерін таңдауда. Бұндай таңдаудың себебі
түсінікті, өйткені бұл бағдарламалау тілдері жеңілдеу, жұмыс істеуге
ыңғайлы және нәтижені еш қиындықсыз көруге болады.
Дегенмен біз өз баяндамамыздың негізгі мақсаты ретінде Windows
операциялық жүйесіне арналған Assembler тілін таныстыруды көздедік.
Assembler төменгі дәрежелі бағдарламалау тіліне жатады. Оның көптеген
ерекшеліктерімен сіз жұмысты оқу барысында таныса аласыз.
Негізгі бөлім
1.1 Windows операциялық жүйесінде Assembler тілін қолданып
бағдарламалау.
Windows операциялық жүйесіне Си және басқа да бағдарламалау тілдері
тұрғанда ассемблер не үшін қажет деген сұрақ туады. Бұл сұрақтың жауабы өте
қарапайым. Ассемблер санашық тілі болып есептеледі, сол себепті санашықтар
өмірде кең көлемде пайдаланылып жатқандықтан, ассемблерде өз “өмір сүруін”
тоқтатпайды. Сонымен қатар ассемблер бағдарламалау тілінде бағдарламалар
кодтарын іске қосуға, драйверлер мен трансляторлар жазуға, кейбір ішкі
құрылғыларға бағдарламалар жазуға болады.
Ассемблер тілінде MS-DOS операциялық жүйесінде бағдарламалағанға
қарақанда Windows операциялық жүйесінде бағдарламалаған жеңіл. Жоғарғы
деңгейлі бағдарламалау тілдерімен жұмыс істеу кезінде біз кейбір
алгоритмдік үрдістерден айрыламыз. Шынына келгенде ассемблер тілінде
бағдарламалау профессионалдық деңгейді жоғарылатып, санашықтың жұмыс істеуі
мен ішкі құрылысын түсінуді жеңілдетеді.
Қазіргі уақытта бір- бірімен бақталас екі ассемблер дестелері бар.
Олар: MASM (Macro Assembler) және TASM (Turbo Assembler). Ассемблер
тіліндегі бағдарламаларды іске қосу үшін MASM 6.14 және TASM (TASM32.exe
5.0, TLINK32.EXE 1.6.71) версияларын қолданған дұрыс. Бағдарламаны Windows
операциялық жүйесінде трансляциялау төмендегі сұлба бойынша жүреді.
1- сурет. Ассемблерлік модульдің трансляциялану сұлбасы.
Трансляцияның 2- ші кезеңіне екі негізгі бағдарламалар сәйкес келеді.
Олар: ML.EXE ассемблерімен LINK.EXE редакторы немесе TASM32.EXE және
TLINK32.EXE.
Ассемблер бағдарламасының мәтіні бар файлдың аты PROG.ASM болсын, онда
трансляциялаудың 2- і кезеңі келесі түрде болады.
C:\masm32\bin\mlccoffPROG.ASM
Осыдан кейін PROG.OBJ модулі пайда болады. Содан кейін
c:\masm32\bin\Link SUBSUSTEM: Windows PROG.OBJ әрекеті орындалады.
Сол кезде PROG.EXE орындалу модулі құрылады. Бұл жерде c және coff
ML.EXE бағдарламасының параметрлері, ал SUBSYSTEM: Windows LINK.EXE
бағдарламасының параметрлері болып табылады.
Ассемблерда бағдарламаны бірнеше бөліктерге бөліп, трансляцияның 1- ші
кезеңінде қайтадан біріктірген ыңғайлы. Бұл INCLUDE дерективасы арқылы
жүзеге асады. Мысалы бір файлда бағдарлама коды, ал тұрақтылар, мәліметтер,
процедуралар басқа файлда болады.
Ендігі жерде басқа обьектілік модульдер мен кітапханаларды
трансляцияның 2- ші кезеңіне қосуды қарастырайық. Қанша обьектілік модуль
қосылса да, олардың ішінде біреуі негізгі болады, яғни бағдарлама осы
модульден басталады. Модульдердің арасындағы айырмашылық осымен бітеді.
Негізі қосалқы модульдерге негізгі модульден және басқа модульдерден
шақырылатын процедуралар орналастырылады. Бірнеше модульдерді біріктіргенде
бірінші болып негізгі модуль содан кейін қосалқы модульдер біріктірілуі
керек.
Келесі қарастыратынымыз INVOKE дерективасы. Бұл қолайлы команда, бірақ
өзіндік ерекшеліктері бар.
Қолайлы жағы @N қоспасынан құтыламыз, 2- ші жағынан бұл команда стекке
берілетін мәндерді өзі бақылайды.
PUSH Par1
PUSH Par2
PUSH Par3
PUSH Par4
Call Name_PROC@N; N- стекке жіберілетін байттар көлемі. Бұл өрнек
INVOKE командасын қолданғанда келесідей түрге өзгереді.
INVOKE NAME_PROC, par4, par3, par2, par1
Бұл кезде параметрлер ретінде құрcым, анықталған мән немесе адрес
қарастырылады. Адрес үшін OFFSET және ADDR операторларыда қолданылады.
INVOKE командасының тиімсіз жағы макродеректерді қолдану.
Макродеректерді қолданғанда тілдің сұлулығы жоғалады және ассемблер тілін
жаңадан үйреніп жүргендерге стекке мәндерді команда арқылы емес, өздері
жіберіп үйренгені дұрыс.
Біздің 1- суретте обьектілік модульдерден басқа кітапханалар жайлы да
айтылады. Егерде обьектілік модульдер бірнеше болса, онда олар белгілі бір
жағдайларда қолайсыздық тудырады. Сол себепті обьектілік модульдер
кітапханаларға бірігеді. MASM- ға кітапхана қосу үшін INCLUDELIB
дерективасын қолданған ыңғайлы. INCLUDELIB дерективасы обьектілік кодта
сақталады және LINK.EXE бағдарламасымен пайдаланылады.
Бірақ обьектілік модульдерден қалай кітапхана құрса болады? Ол үшін
кітапханашы деп аталатын арнайы бағдарлама бар. Егер біз PROG2.OBJ
модулінен тұратын LIB1.LIB кітапханасын құрғымыз келсе, төмендегі команданы
орындаймыз.
LIBOUT:LIB1.LIB PROG2.OBJ
Егер кітапханаға тағы бір модуль қосқымыз келсе (мысалы MODUL.OBJ)
LIB1.LIB MODUL.OBJ командасын орындаймыз.
Кітапханашының тағы да екі пайдалы командалары LIBLIST LIB1.LIB-
кітапхана модульдерінің тізімін береді, LIBREMOVE:MODUL.OBJ LIB1.LIB-
кітапханадан MODUL.OBJ модулін жояды.
Жоғарыда біз тек MASM дестесін қарастырды, енді TASM дестесін
қарастырып өтейік. TASM дестесінде трансляциялау форматы төмендегідей.
TASM32ml PROG.ASM
TLINK32_aа PROG.OBJ
TASM дестесінде модульдарды біріктіру өте қарапайым түрде жүреді.
Мысалы: TLINK32- аа PROG1.OBJ PROG2.OBJ кітапханасымен жұмыс істеу үшін
TASM дестесінде TIB.EXE атты кітапханашы бағдарлама бар. PROG2.OBJ
модулінен тұратын кітапхана құру үшін
TLIB LIB1.LIB+PROG2.OBJ командасы орындалады. Нәтижесінде LIB1.LIB
кітапханасы құрылады.
TLINK32 - нің командалық қатарының кеңейтілген түрі мынандай: TLINK32-
аа OBJFILES, EXEFILE, MAPFILE, LIBFILES.
Мұндағы OBJFILE- орындалатын модуль
MAPFILE- модуль құрылымы жайлы ақпарат беретін MAP- файл
LIBFILE- бір немесе бірнеше кітапхана (пробел арқылы)
TASM- да INVOKE дерективасы жоқ.
Ассемблерде басқа да бағдарламалар қолданылады. Мысала: редакторлар,
дизассемблерлер, Hex- редакторлар, отладчиктар, ресурстар компиляторы,
ресурстар редакторы. Енді жеке- жеке тоқталып өтейік.
Редакторлар: QEDITOR.EXE редакторы MASM32 дестесінің ішіне кіреді. Бұл
редактор және оның утилиттары ассемблер тілінде жазылған. QEDITOR.EXE
редакторының көлемі бар болғаны 27 Кб, ал оның утилитасының көлемі 6 Кб
қана. Бұл редактор бір модульді, кішкене қосымшалар үшін қолайлы, ал
бірнеше модульдермен жұмыс істеуге бұл редактор ыңғайлы емес. Редактор
әртүрлі утилиттар мен дестелік файлдар арқылы байланысып жұмыс істейді.
Мысалға, бағдарламаның трансляциясын ML.EXE ассемблері қолданатын ASBL.BAT
дестелік файлы орындап, нәтижесін ASMBL.TXT мәтіндік файлына жібереді. Осы
файлды қарау үшін THEGUN.EXE қарапайым утилитасы қолданылады. Орындалатын
модульді дизассемблерлеу үшін DUMMPER.EXE утилитасы қолданылып, нәтижесі
DIASM.TXT мәтіндік файлына жіберіледі.
Сонымен қатар EAS.EXE бағдарламасын қарастырайық. Бұл редактор,
дәлірек айтсақ қабықша ASM-, OBJ-, RC-, RES-, DEF- файлдарынан тұратын
күрделі жобаларды құруға, трансляциялауға мүмкіндік тудырады. Бұл
бағдарлама MASM немесе TASM ортасында жұмыс істейді.
Отладчиктер: Отладчиктер бағдарламаны қадам бойынша жұмыс істейді.
Қолдануға ыңғайлы және белгілі отладчиктерге Code View, Turbo Debugger, Ice
жатады.
Дизассемблерлер: Дизассемблерлер орындалатын модульді ассемблерлік
кодқа айналдырады. Мысалға, W32 Dasm, Ida Pro, Dumppe.exe дизассемблерлерін
атап өтсек болады.
Hex- редакторлар: Hex- редакторлар жүктелетін модульдарды 16- қ түрде
көрсетеді. Мұндай редакторлардың түрлері көп. Кейбір дизассемблерлер мен
отладчиктердің құрамында да Hex- редакторлар болады. Мысалға, хакерлер
ортасында танымал болып келген HIEW.EXE бағдарламасын атауға болады. Бұл
бағдарлама жүктелетін модульдерді
16-қ түрде және ассемблерлік код түрінде қарауға жағдай тудырады. Сонымен
қатар бұл мәліметтерді түзетуге де мүмкін болады.
1.2 Терезе түрлері.
Windows - қа арналған бағдарламалар қосымша деп аталады. Қолданушы
қосымша көмегімен келесі терезелер түрімен қарым- қатынас құрады:
1. Терезе қосымша: жұмыстың орындалуын ұйымдастырады, іске қосылған
кезде бірінші болып шығады да жұмыстың тоқтауымен жабылады.
2. MDI- терезелер: Бұл терезе бірнеше құжаттарды бір уақытта өңдеуге
арналған.
3. Көмекші терезе. Бұл терезе көп жағдайда операциялық жүйенің
басқаруымен орындалады.
4. Диалог терезесі. Бұл терезе қосымша мен қолданушының арасында
құжаттардың жылдам ауысуын қамтамасыз етеді.
Құрастырушыға терезе қосымша мен операциялық жүйенің
функционалдауымен жұмыс істейтін элементтер жиындығы болып табылады.
Бағдарламалық тілдерінің негізі бойынша терезе дегеніміз онымен
әртүрлі әрекеттер жасауға болатын обьект, яғни айнымалы.
Обьект көптеген мәліметтерді баяндайтын және өзгертетін белгілі бір
классқа жатады.
2-сурет Көптеген элементері бар:
1-Жүйелік меню батырмасы; 2-Терезені пиктограммаға айналдыру
батырмасы; 3-Терезені қалпына келтіру және максималдау батырмасы; 4-
Терезені жабу батырмасы; 5-Терезе өлшемдерін өзгерту жақтауы;
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_APPLICAT ION);
wc.hCurcor=LoadCursor(NULL,IDC_ARRO W);
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 Осы класстағы терезенің басты менюінің ресурсының атын
көрсетеді. wc.IpszMenuName= (LPCTSTR)NULL
10. IpszClassName Тіркелетін терезе классының аты бар жолды көрсетеді.
Мысалы: wc.IpszClassName=szName
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 тең. Егер туынды
терезе құрылатын болса онда hMenu аргументі ретінде осы терезенің
идентификаторы саналады.
Терезенің стильін оның сыртқы бейнелеріне қарап айырамыз.
Терезе стилін баяндау үшін символдық тұрақты WS_ қолднылады.
Қасиеттердің жиындығына байланысты терезелерді бірін- бірі басатын, уақытша
және туынды терезелерге бөлеміз.
Көбінесе қосымшалар терезелі болып келеді. Мұндай терезелердің негізгі
стилі WS_OVERLAPPER тұрақтысымен беріледі.
Бірін- бірі жабатын терезе басқа бір терезеге бағынуы мүмкін. Егер
басты- терезе пиктограммаға түрленсе онда оған бағынатын терезелер де
көрінбейтін болып қалады. Басты- терезені жабқан кезде оған бағынатын
терезелер де жабылады. Бағынатын терезелер әрқашан басты терезенің үстінде
орналасады.
Уақытша терезелер көбінесе қолданушыға хабар шығару үшін қолданылады
да экранда қысқа уақытта ғана көрініп тұрады. Уақытша терезенің негізгі
стилі WS_POPUP тұрақтысымен беріледі. Келісім бойынша мұндай терезенің басы
болмайды.
Туынды терезелер басқару органдарын құру үшін қолданылады. Кірісімен
анықталатын басқару органдарының классы туынды терезелер болып саналады.
Туынды терезелердің негізгі стилі WS_CHILD тұрақтысымен беріледі. Туынды
терезеде кішірейтетін және үлкейтетін батырма болмайды. Бірақ әрқашан басты-
терезесі болады. Олар басты- терезеге “жабысып” сонымен бірге жылжиды және
басты- терезенің сыртына шыға алмайды.
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
API талаптарымен анықталған.
hInstance параметрі операциялық жүйеден ағымдағы қосымшаның
дескрипторын алады.
hPrevinstance параметры 16-разрядты қосымшаларда алдындағы белсенді
болған қосымшаны көрсетеді. Ал Win32 қосымшаларында ол әрқашан NULL тең.
nCmdshow параметрі қосымшаға терезенің бастапқы шығару әдісін береді.
WinMain функциясының құрылымында msg және hwnd айнымалылары
баяндалған. Msg айнымалысы уақытша хабарларды қабылдауға және таратуға
арналған. hwnd айнымалысы құрылған терезенің дискрипторын сақтайды.
Терезе классын тіркеуден өткізу үшін RegClass функциясы шақырылады.
If(!RegClass(WndProc,s2ClassName)) return False;
Терезе құру үшін CreateWindow функциясы шақырылады. Егер терезе
құрылмаса қосымша өз жұмысын аяқтайды. Құрылған терезені шақыру үшін
ShowWindow функциясы шақырылады.
ShowWindow(hwind, SW_SHOWMAXIMIZED);
Бұл функция терезені максимальді үлкен түрде экранға шығарады.
While(GetMessage(&msg, 0, 0, 0))
{TranslateMessage(&msg); DispatchMessage(&msg);}
Бұл цикл хабарларды өңдеу циклы деп аталады.
GetMessage функциясы қосымшаның тізімінде тұрған хабарлардың
кезектегі хабарын таңдайды.
TransLateMessage пернетақтадағы хабарды трансляциялайды,
DispatchMessage функциясы хабарларды терезе функцияларына таратады.
Дәл осы циклда терезе функциясын “шақыру” болады.
Жоғарыда көрсетілген функциялардың түпнұсқасын қарастырайық:
ShowWindow функциясы келесі түрде баяндалады: Bool ShowWindow(HWND
hwnd, int nCmdShow).
Қосымшаны жүктегеннен соң шақыртылуы кезінде екінші аргументіне
WinMain функциясына nCmdShow параметрін меншіктейміз.
GetMessage функциясы келесі түрде баяндалады. BoolGetMessage(LPMSG
Ipmsg, HWNO hwnd, WORD UmsgfillterMin, Word UMsgFillterMax);
Lpmsg параметрі таңдалатын хабарды MSG типті құрылымға жазады. Hwnd-
терезе дискрипторы. UmsgfilterMin және UmsgFilterMax параметрлері
таңдалатын хабарлардың аймағын және хабарлардың минимальді максимальді
кодтарын береді. Егер осы параметрлердің мәні нольге тең болса онда
кезектегі хабарлардың барлығы таңдалады.
GetMessage функциясы адресі бірінші параметірімен берілген кезектегі
таңдаулы мәліметті өшіреді. WM_QUIT кодты мәліметті таңдаған кезде ол ноль
мәнін қайтарады да циклды мәліметті өңдемей аяқтайды. Басқа мәліметті
таңдаған кезде GetMessage функциясы нольге тең емес мәнді қайтарады.
1.5 Қосымша мәтіннің құрылымы
Қосымша мәтіннің құрылымы екі талап бойынша анықталады.
1. Мәтін WinMain функциясының сипаттамасынан тұрады.
2. Егер жаңа класс тіркелсе, онда мәтін WINDCLASS типті құрылымның
сипаттамасынан және осы классты терезелер функцияларынан тұрады.
1.6 Терезе құрудың қосымша функциялары
Windows API терезелерді құруға қатысты бірнеше функциялардан тұрады.
Олар: іздеу, күйді анықтау, терезенің жылжу және қолданушымен мәлімет ауысу
функциялары.
1.7 Іздеу және терезенің күйін анықтау функциялары
Кей жағдайларда берілген дескрипторларға терезе бар жағын анықтау
керек болады. Бұл қызметті IsWindow функциясы атқарады:
BOOL IsWindow (HWND hwnd);
Егер hwnd дискрипторы бар терзе бар болса функция ноль емес мәнді
қайтарады, ал кері жағдайда ноль.
Егер берілген терезенің кіру фокусын анықтау керек болса, Is Window
Enabled функциясы шақырылады: BOOL Is Window Enabled (HWND hwnd);
Егер hwnd терезесі белсенді болса, функция ноль емес мәнді, ал кері
жағдайда нольді қайтарады.
Терезенің кіру фокусынын өзгерту үшін немесе алу үшін Enabel Window
функциясы шақырылады: BOOL EnabelWindow (HWND hwnd, BOOL bEnable);
bEnable= TRUE болғанда кіру фокусы hwnd терезесіне беріледі, ал олай
болмаған жағдайда терезе кілттенеді.
Егер терезе бұрын белсенді болмаған болса, ноль емес мән, ал белсенді
болған жағдайда ноль қайтарылады.
Кіріс фокусын hwnd терезесіне SetFocus функциясы арқылы беріледі:
SetFocus (hwnd);
Келесі функция hwnd терезесі пиктограмма түрінде тұрғанда нольдік емес
мән қайтарады: BOOL Is Iconic (HWND hwnd);
Fine Window функциясы Ip Window Name деп басталатын IpClassName
классты терезенің дискрипторын операциялық жүйеден сұрайды. Бұл функция
келесі түрде сипатталады. HWND FindWindow (LPCTSTR Ip Class Name, LPCTSTR
IpWindowName)
Егер IpWindowName=NULL болса, онда ізделіп жатқан терезе кез- келген
классқа жатуы мүмкін. Егер мұндай терезе табылса функция дескрипторды
қайтарады немесе ноль.
1.8 Терезелердің жылжу функциясы
hwnd терезесінің өлшемдерін өзгерту үшін және терезенің жылжу үшін
MoveWindow функциясы шақырылады. Оған терезенің жаңа координаталарын
береді.
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 функциясы көмегімен алады. Барлық
өлшемдер пиксель түрінде қайтарылады.
Get System Metrics функциясы келесі түрде сипатталған: Int Get System
Metrics (Int nIndex);
nIndex параметрі жүйе қайтаратын өлшемді немесе орнатылған
конфигурацияны көрсетеді. Төменде бұл функцияға қатысты кесте
қарастырылған.
1.9 Қолданушыға арналған қосымша мәліметі
Мәтіндік мәліметті шығару үшін және оған қалданушы жауап беру үшін
мәлімет терезесі қолданылады. MessageBox функциясы мәлімет терезесін
көрсетеді, оның жұмыс істеуін қамтамасыз етеді және жабады.
Int WINAPI MessageBox (
HWND hwnd, Аталық терезе дескрипторы
LPCTSTR IpText, Мәлімет мәтінінің адресі
LPCTSTR IpCaption Мәлімет терезесі басының адресі
UNIT uType Мәлімет терезесінің стилі
);
Егер hwnd= NULL болса, мәлімет терезесінің аталық терезесі жоқ болады.
Егер IpCaption= NULL болса, терезе басында “Қате” деген қатар шығады. nType
параметрі мәлімет терезесінің іс- қимылын және мазмұнын анықтайтын
жалаушалар комбинациясы түрінде беріледі.
Келесі жалаушалар мәліметтер ... жалғасы
Ұқсас жұмыстар
Пәндер
- Іс жүргізу
- Автоматтандыру, Техника
- Алғашқы әскери дайындық
- Астрономия
- Ауыл шаруашылығы
- Банк ісі
- Бизнесті бағалау
- Биология
- Бухгалтерлік іс
- Валеология
- Ветеринария
- География
- Геология, Геофизика, Геодезия
- Дін
- Ет, сүт, шарап өнімдері
- Жалпы тарих
- Жер кадастрі, Жылжымайтын мүлік
- Журналистика
- Информатика
- Кеден ісі
- Маркетинг
- Математика, Геометрия
- Медицина
- Мемлекеттік басқару
- Менеджмент
- Мұнай, Газ
- Мұрағат ісі
- Мәдениеттану
- ОБЖ (Основы безопасности жизнедеятельности)
- Педагогика
- Полиграфия
- Психология
- Салық
- Саясаттану
- Сақтандыру
- Сертификаттау, стандарттау
- Социология, Демография
- Спорт
- Статистика
- Тілтану, Филология
- Тарихи тұлғалар
- Тау-кен ісі
- Транспорт
- Туризм
- Физика
- Философия
- Халықаралық қатынастар
- Химия
- Экология, Қоршаған ортаны қорғау
- Экономика
- Экономикалық география
- Электротехника
- Қазақстан тарихы
- Қаржы
- Құрылыс
- Құқық, Криминалистика
- Әдебиет
- Өнер, музыка
- Өнеркәсіп, Өндіріс
Қазақ тілінде жазылған рефераттар, курстық жұмыстар, дипломдық жұмыстар бойынша біздің қор #1 болып табылады.
Ақпарат
Қосымша
Email: info@stud.kz