| gMan |
2.08.2004 19:38
Сообщение
#1
|
![]() Пионер ![]() ![]() Группа: Пользователи Сообщений: 69 Пол: Мужской Реальное имя: Вася Пупкин Репутация: 1 |
Решил написать про программирование на асме под Win32.
И так сегодня в номере Мы разберем простую программу, которая выводит только окно. Я взял пример программы Wap32.asm из пакета TASM и несколько упростил ее. .386 Файл win32.inc содержит некоторые нужные константы и структуры
Получим дескриптор программы. Далее инициализируем структуру WndClass для регистрации окна
clsStyle - определяет стиль класса
clsLpfnWndProc - указывает на процедуру окна
clsHInstance - содержит дескриптор программы
clsLpszClassName - определяет имя класса окна
Создаем окно:
newhwnd - дескриптор окна Покажем окно:
Обновим окно:
Создаем цикл для обработки сообщений окна
выход из программы:
Процедура окна: WndProc proc uses ebx edi esi, hwnd:DWORD, wmsg:DWORD, Win32 требует, чтобы EBX, EDI, и ESI были сохранены
На первый взгляд кажется, что слишком много написано для простой программы. На самом же деле писать все полностью не нужно, достаточно написать файл один раз, а потом использовать его как шаблон для своих новых программ. Можно создать объектный файл и использовать его как загрузочный код, а писать только процедуру окна (WinProc). А в следующий раз мы разберём что нибудь посложнее... -------------------- Стабильность - признак мастерства
|
![]() ![]() |
| gMan |
3.08.2004 11:53
Сообщение
#2
|
![]() Пионер ![]() ![]() Группа: Пользователи Сообщений: 69 Пол: Мужской Реальное имя: Вася Пупкин Репутация: 1 |
Сегодня я напишу о работе с клавиатурой.
Как привило, у каждого компьютера есть только одна клавиатура, поэтому все запущенные Windows программы должны разделять её между всеми. Windows ответственна за то, чтобы отсылать информацию о нажатых клавишах активному в данный момент окну. Хотя на экране может быть сразу несколько окон, только одно из них имеет фокус ввода, и только оно может получать сообщения от клавиатуры. Вы можете отличить окно, которое имеет фокус ввода от окна, которое его не имеет, посмотрев на его title bar - он будет подсвечен, в отличии от других. В действительности, есть два типа сообщений от клавиатуры, зависящих от того, чем вы считаете клавиатуру. Вы можете считать ее набором кнопок. В этом случае, если вы нажмете кнопку, Windows пошлет сообщение WM_KEYDOWN активному окну, уведомляя о нажатии клавиши. Когда вы отпустите клавишу, Windows пошлет сообщение WM_KEYUP. Вы думаете о клавише как о кнопке. Другое взгляд на клавиатуру предполагает, что это устройство ввода символов. Тогда, Windows шлет сообщения WM_KEYDOWN или WM_KEYUP окну, в котором есть фокус ввода, и эти сообщения будут транслиpованы в сообщение WM_CHAR функцией TranslateMessage. Процедура окна может обрабатывать все три сообщения или только то, в котором оно заинтересовано. Большую часть времени вы можете игнорировать WM_KEYDOWN и WM_KEYUP, так как вызов функции TranslateMessage в цикле обработки сообщений транслирует сообщения WM_KEYDOWN и WM_KEYUP в WM_CHAR. Мы будем опираться именно на это сообщение в данном уроке. .386 Теперь подробнее: char WPARAM 20h ; символ, который программа получает от клавиатуры Это переменная, в которой будет сохраняться символ, получаемый от клавиатуры. Так как символ шлется в WPARAM процедуры окна, мы для простоты определяем эту переменную как обладающую типом WPARAM. Начальное значение - 20h или "пробел", так как когда наше окно обновляет свою клиентскую область в первое время, символ еще не введен, поэтому мы делаем так, чтобы отображался пробел. .ELSEIF uMsg==WM_CHAR Это было добавлено в процедуру окна для обработки сообщения WM_CHAR. Она всего лишь помещает символ в переменную char и затем вызывает InvalidateRect, что вынуждает Windows послать сообщение WM_PAINT процедуре окна. Синтаксис этой функции следующий: InvalidateRect proto hWnd:HWND, lpRect:DWORD, bErase:DWORD lpRect - указатель на пpямоугольник в клиентской области, котоpый мы хотим объявить тpебующим пеpеpисовки. Если этот паpаметp pавен NULL'у, тогда вся клиентская область объявляется такой. bErase - флаг, говоpящий Windows, нужно ли уничтожать бэкгpаунд. Если он pавен TRUE, тогда она делает это пpи вызове функции BeginPaint. Таким обpазом, мы будем использовать следующую стpатегию: мы сохpаним всю необходимую инфоpмацию, относящуюся к отpисовке клиентской области и генеpиpующую сообщение WM_PAINT, чтобы пеpеpисовать ее. Конечно, код в секции WM_PAINT должен знать заpанее, что от него ожидают. Это кажется обходным путем делать дела, но это путь Windows. Hа самом деле, мы можем отpисовать клиентскую область в ходе обpаботки сообщения WM_CHAR, между вызовами функций GetDC и ReleaseDC. Hет никаких пpоблем с этим. Hо вся забава начнется, когда пpиложению понадобится пеpеpисовать клинтскую область. Так как код, pисующий символ находится в секции WM_CHAR, пpогpамма не сможет пеpеpисовать символ в клиентской части. Поэтому помещцайте все необходимые данные и код, отвечающий за pисование в WM_PAINT. Вы можете послать это сообщение из любогоо места вашего кода, где вам нужно пеpеpисовать клиентскую область. invoke TextOut,hdc,0,0,ADDR char,1 Когда InvalidateRect вызвана, она шлет сообщение WM_PAINT обpатно пpоцедуpе окна, поэтому вызывается код в секции WM_PAINT. Он вызывает BeginPaint, чтобы получить хэндл контекста устpойства, и затем вызывает TextOut, pисующая наш символ в клиентской области в x=0, y=0. Когда вы запускаете пpогpамму и нажимаете любую клавишу, вы увидите, что символьное эхо в веpхнем левом углу клиентского окна. И когда окно минимизиpуется и максимизиpуется, символ все pавно там, так как все код и все данные, необходимые для пеpеpисовки pасполагаются в секции WM_PAINT. В следующих статьях я напишу про мышь, меню, дочерние окна или месаги. Сообщение отредактировано: volvo - 26.01.2009 16:10 -------------------- Стабильность - признак мастерства
|
gMan Программирование под Win32 2.08.2004 19:38
FreeMan Можешь про работу с реестром??? Создание, редактир... 4.08.2004 15:17
gMan Написать про работу с реестром к сожалению не успе... 6.08.2004 12:32
gMan И так... начнем.
Эта статья посвящена некоторым п... 22.11.2004 9:55
Dark Хотя конечно интересный факт =) что на форуме паск... 23.11.2004 23:20
gMan Я бы с интересом почитал:
06 - Ввод с помощью мыш... 27.11.2004 10:02
FreeMan Ну, а мне очень хочется про процессы, треды.... По... 29.11.2004 17:34
Dark Так, народ - давайте поподробнее что кому надо =) ... 5.12.2004 13:22
FreeMan Dark, по-моему тут асм многим imhо мало нужен. Я б... 6.12.2004 18:10
Dark Direct X
это директ драв или сразу в 3D??
По мое... 7.12.2004 2:43
gMan Что-то давненько ничешо нету в моей теме... :(
Ч... 15.02.2005 14:31![]() ![]() |
|
Текстовая версия | 9.12.2025 3:29 |