Образец программы на Windows API
Текущий рейтинг темы: Нет
4X_Pro
Руководитель Проекта
Настоящий Компьютерщик
 Откуда: Москва Всего сообщений: 3031 Рейтинг пользователя: 75 Дата регистрации на форуме: 29 сен. 2001
|
Профиль | ИгнорироватьNEW! Сообщение отправлено: 9 июля 2006 18:54
Так как при написании программ на чистой Windows API есть довольно много участков кода, которые приходится копировать один в один без изменений, я решил выложить "скелет" такой програмы сюда. В этой программе регистрируется класс, создается одно окно данного класса, описывается основная оконная процедура и ряд процедур-обработчиков наиболее часто используемых оконных сообщений. { Образец написания простейшей программы на WinAPI с вынесением обработчиков наиболее распространненых событий в отдельные процедуры © XXXX Pro, Объединенный Открытый Проект, 2006 Наш сайт в Интернете: http://www.openproj.ru } program WinAPI;
uses Windows,Messages;
const wndClassName = '4XP_WinAPI_simple'; // имя класса окна wndCaption = 'Заголовок окна'; // текст заголовка
var // глобальные переменные: handle окна и полученное сообщение wndH : HWND; wndMsg : TMsg;
// функция OnCreate — вызывается при создании окна Function OnCreate(hwnd: HWND; var lParam: TCreateStruct):LRESULT; Begin // здесь могут создаваться вложенные окна Result:=0; // 0 означает, что сообщение было успешно обработано. // если вернуть -1, то будет считаться, что окно создать не удалось и оно будет уничтожено End;
Function OnCommand(hwnd:HWND; wNotifyCode:word; wID:word; hwndCtl:LPARAM):LRESULT; Begin Result:=0; // обработчики сообщения OnCommand — полезно для диалоговых окон End;
// процедура OnPaint — отрисовка содержимого окна Procedure OnPaint(hwnd:HWND); var PaintStr : TPaintStruct; hdc : THandle; Begin hdc:=BeginPaint(hwnd,PaintStr); // начало отрисовки, получение контекста // здесь производится отрисовка EndPaint(hwnd,PaintStr); // окончание отрисовки ReleaseDC(hwnd, hdc); // освобождение контекста End;
// процедура OnDestroy — вызывается при уничтожении окна Procedure OnDestroy; Begin // здесь должны освобождаться все занятые прежде ресурсы PostQuitMessage(0); End;
// основная оконная процедура Function WindowProc(hwnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM):LRESULT; stdcall; Begin Result:=0; // по умолчанию результат обработки сообщения — 0 case (Msg) of WM_CREATE: Result:=OnCreate(hwnd,TCreateStruct(pointer(lParam)^)); WM_COMMAND: Result:=OnCommand(hwnd,HiWord(wParam),LoWord(wParam),lParam); WM_PAINT: OnPaint(hwnd); WM_DESTROY: OnDestroy; else Result:=DefWindowProc(hwnd,Msg,wParam,lParam); // вызов процедуры по умолчанию end; End;
// регистрация оконного класса Function RegisterWinClass:boolean; var WinClass : TWndClass; Begin WinClass.style:=CS_DBLCLKS or CS_HREDRAW or CS_OWNDC or CS_VREDRAW; WinClass.lpfnWndProc:=@WindowProc; WinClass.cbClsExtra:=0; WinClass.cbWndExtra:=0; WinClass.hInstance:=HInstance; WinClass.hIcon:=LoadIcon(0,IDI_APPLICATION); WinClass.hCursor:=LoadCursor(0,IDC_ARROW); WinClass.hbrBackground:=COLOR_BACKGROUND; WinClass.lpszMenuName:=nil; WinClass.lpszClassName:=wndClassName; Result:=RegisterClass(WinClass)<>0; End;
// основная программа BEGIN if (not RegisterWinClass) then MessageBox(0,'Ошибка при создании класса окна','Ошибка!',MB_OK or MB_ICONSTOP) else begin wndH:=CreateWindow(wndClassName,wndCaption,WS_OVERLAPPEDWINDOW or WS_CLIPCHILDREN or WS_CLIPSIBLINGS or WS_VISIBLE,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,0,0,hInstance,nil); if (wndH=0) then MessageBox(0,'Ошибка при создании экземпляра окна','Ошибка!',MB_OK or MB_ICONSTOP) else begin while (GetMessage(wndMsg,0,0,0)) do begin // цикл обработки сообщений TranslateMessage(wndMsg); DispatchMessage(wndMsg); end; end; end; END.
--- Каждый человек всегда может найти, чем он может быть полезен окружающим. Проблема только в одном: слишком многие не хотят это искать.
| | | |
semiono
Долгожитель форума
 Откуда: Арзамас Всего сообщений: 383 Рейтинг пользователя: 2 Дата регистрации на форуме: 2 сен. 2006
|
Профиль | ИгнорироватьNEW! Сообщение отправлено: 24 мая 2008 1:34 Сообщение отредактировано: 24 мая 2008 1:36
--- a peoples must know what is cost an opium for the race?
| | | |
Время выполнения скрипта: 0.4394. Количество выполненных запросов: 18, время выполнения запросов 0.1149
|