4X_Pro
Руководитель Проекта
Настоящий Компьютерщик
Откуда: Москва Всего сообщений: 2994 Рейтинг пользователя: 79 Дата регистрации на форуме: 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.
--- Каждый человек всегда может найти, чем он может быть полезен окружающим. Проблема только в одном: слишком многие не хотят это искать.
|