Заметим, что системы, совместимые на уровне исходных кодов, могут быть несовместимы на уровне исполняемых файлов. Пример такой ситуации: Linux и FreeBSD.
Взаимодействие Windows с приложением основано на передаче сообщений. Каждое сообщение представляется 32-разрядным кодом.
Основным интерфейсным элементом Windows являются окна, поэтому именно окна выступают в качестве конечных адресатов сообщений. И действительно, большая часть сообщений логически привязано к определенному окну: перемещение, изменение размеров окна, щелчок мыши в области окна. Ввод с клавиатуры также привязывается к окну, являющемуся в данный момент активным.
Для реакции на сообщения каждому окну приложение должно сопоставить функцию обработки. Эта функция вызывается операционной системой автоматически для каждого пришедшего сообщения.
Однако первоначально сообщения попадают не в функцию окна-адресата, а в головной модуль приложения. Причем головной модуль windows–приложения обязан сам регулярно запрашивать сообщения, чтобы затем... отправлять их обратно операционной системе (обычно головной модуль содержит цикл, который вплоть до завершения программы выполняет две указанных операции). Такая идеология выглядит переусложненной, однако в ней есть определенная логика: функции окон играют роль обработчиков событий, а головной модуль имеет возможность контроля всех сообщений.
Ниже приводится пример минимальной программы для Windows.
Для понимания данного примера практически не требуется знание языка C, как такового, однако необходимо представление об основных элементах программ и общих принципах программирования.
#include <windows.h>
LRESULT CALLBACK WindowFunc(HWND, UINT, WPARAM, LPARAM);
char szWinName[]="MyWin";
// Головной модуль
int PASCAL WinMain(HINSTANCE hThisInst, HINSTANCE
hPrevInst, LPSTR lpszArgs, int nWinMode)
{
HWND hwnd,hwnd1;
MSG msg;
WNDCLASS wcl;
wcl.hInstance=hThisInst;
wcl.lpszClassName=szWinName;
wcl.lpfnWndProc=WindowFunc;
wcl.style=0;
wcl.hIcon=LoadIcon(NULL, IDI_APPLICATION);
wcl.hCursor=LoadCursor(NULL,IDC_ARROW);
wcl.lpszMenuName=NULL;
wcl.cbClsExtra=NULL; wcl.cbWndExtra=NULL;
wcl.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
// Регистрация класса окна
if(!RegisterClass(&wcl)) return 0;
// Создание главного окна приложения
hwnd=CreateWindow(szWinName, "Window Skeleton",
WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
HWND_DESKTOP, NULL, hThisInst, NULL);
// Отрисовка окна
ShowWindow(hwnd, nWinMode);
UpdateWindow(hwnd);
// Выдача диалогового окна
MessageBox(hwnd,"Message","test",MB_OK);
// Цикл обработки сообщений
while(GetMessage(&msg,NULL,0,0)){
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
// Функция окна
LRESULT CALLBACK WindowFunc(HWND hwnd, UINT message,
WPARAM wParam, LPARAM lParam)
{
switch (message){
case WM_DESTROY:
PostQuitMessage(0); break;
default:
return DefWindowProc(hwnd,message,wParam,lParam);
}
return 0;
}
Данная программа содержится в одном файле. Она может быть оттранслирована практически любым компилятором.
Головной модуль программы сначала определяет и регистрирует в системе класс окна. Класс представляет собой совокупность свойств окна, в том числе, с ним связывается функция окна. Таким образом, два окна одного класса будут «близнецами».
Затем создается окно данного класса и вызывается функция его отображения.
Следующим шагом выдается окно сообщения (это, разумеется, необязательный момент, который добавлен лишь для «оживления» картинки).
Наконец, последний блок – это цикл обработки сообщений.
Функция окна сама обрабатывает лишь одно сообщение: WM_DESTROY, которое генерируется при закрытии окна (вызывается функция PostQuitMessage(), которая генерирует сообщение, завершающее приложение). Для остальных сообщений вызывается функция обработки по умолчанию: DefWindowProc().
1.2.3. Пользовательский интерфейс (оконный, командный).
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.