Обучающие курсы:

Обучение профессии "Разработчик C#" + стажировка в Mail.ru
Обучение профессии "Разработчик Python" + трудоустройство
Обучение профессии "Веб-разработчик" + стажировка в Mail.ru


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





Третий параметр функции dwstyle указывает на стиль создаваемого окна. В нашей программе создается обычное перекрывающееся окно с заголовком, без меню, с пиктограммами для сворачивания, разворачивания и закрытия окна. Это стандартный стиль окон, который называется WS_OVERLAPPEDWINDOW.
Параметры х и у задают начальные координаты верхнего левого угла окна относительно левого верхнего угла экрана. Если они равны CWUSEDEFAULT, ТО будет использоваться задаваемое по умолчанию начальное положение. Примерно так же задают ширину и высоту окна с помощью параметров nwidth и nHeight. CWUSEDEFAULT снова означает, что мы хотим, чтобы Windows использовала задаваемый по умолчанию размер окна.
Чтобы отобразить окно на экране, необходимо вызвать функцию showwindow. В эту функцию передаются два параметра — hwnd и nCmdShow. Параметр hwnd — это дескриптор окна, возвращенный функцией Createwindow. Параметр nCmdShow указывает, как должно отображаться окно при первом появлении на экране. Если присвоить этому параметру значение SWSHOWNORMAL, то окно будет развернуто на экране. Если параметру присвоить значение SWSHOWMINIMIZED, ТО ОКНО появится в свернутом виде. И, наконец, функция Updatewindow генерирует сообщение WMPAINT, указывающее на необходимость прорисовки рабочей области окна. После регистрации класса окна и отображения экземпляра окна на экране функция winMain переходит к бесконечному циклу обработки сообщений. Исходный текст этого цикла приведен в листинге 4.5.
Листинг 4.5. Цикл обработки сообщений
while (GetMessage(&msg, NULL, 0, 0))
{
if (ITranslateAccelerator(msg.hwnd, hAccelTable, &msg))
/
{
TranslateMessage(&msg);
DispatchMessage(&msg) ;
}
}

В цикле обработки сообщений используется обычный оператор цикла while. Как мы знаем, Windows посылает каждому приложению сообщение о каком-либо событии, на которое приложение должно соответствующим образом реагировать. Любое сообщение из очереди сообщений приложения можно получить при помощи функции GetMessage. Функция просматривает очередь сообщений приложения и копирует выбранное сообщение в структуру, адрес которой &msg является ее первым параметром. В этой структуре имеются два поля — LPARAM И WPARAM, В которые записывается код полученного сообщения.

Второй параметр функции указывает на окно приложения, которому направлено сообщение. Если он равен NULL, ТО выбираются сообщения, направленные всем окнам приложения. Два последних параметра помогают сформировать фильтр для сообщений. Если оба они равны 0, то приложение пропускает все сообщения.

В цикле while ИСПОЛЬЗУЮТСЯ еще несколько функций. Функция TranslateMessage преобразует сообщения о нажатии виртуальных клавиш в символьные сообщения и удобна, если приложение активно работает с клавиатурой. Наконец, функция DispatchMessage посылает сообщение, сохраненное в &msg, соответствующей оконной процедуре приложения.

Приложение будет находиться в цикле обработки сообщений до тех пор, пока не получит сообщение WM_QUIT. В этом случае функция GetMessage возвращает FALSE, и происходит выход из программы. Далее рассмотрим оконную процедуру WndProc, исходный текст которой приведен в листинге 4.6.
Листинг 4.6. Оконная процедура WndProc
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;
char *textMes = "HELLO FROM VISUAL С++ .NET!";
int lenText = strlen(textMes);
switch (message)
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
TextOut(hdc, 200, 100, textMes, lenText);
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0) ;
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);

В качестве параметров оконная процедура принимает:
• дескриптор hwnd окна, которому операционная система Windows посылает сообщение;
• идентификатор сообщения message, которое должно быть обработано;

Теперь посмотрим, как будет выглядеть подобная программа на языке ассемблера, выводящая строку "ПРИВЕТ ИЗ АССЕМБЛЕРА! " в окно приложения.
Было бы очень удобно воспользоваться каркасом приложения на С++ и сделать нечто подобное на ассемблере. Посмотрим, что для этого необходимо. Наше приложение использует в основном функции WIN API. Язык ассемблера довольно легко позволяет манипулировать с функциями WIN API с помощью команды call. Если функциям API требуется передавать параметры, то это делается через стек.
Покажем, как изменить программный код С + + .NET в ассемблерный на примере функции TextOut.
Вот интересующий нас фрагмент кода на С + + :
char *textMes = "HELLO FROM VISUAL С++ .NET !";
int lenText = strlen(textMes);
TextOut(hdc, 200, 100, textMes, lenText);

В программе на ассемблере подобный фрагмент с соответствующими изменениями текста сообщения может быть представлен следующим образом:
.data
textMes DB 'ПРИВЕТ ИЗ АССЕМБЛЕРА!"
lenText EQU $-textMes
. code
push
push
push
lenText
offset textMes
100
push
push
call
100
hdc
TextOut

Цикл while обработки сообщений, написанный на С + + , также реализуется при помощи ассемблерных команд сравнения и условных переходов. Программный код цикла на С + + представлен в листинге 4.7.
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}


 
 
 

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