|
Здорова программер! Я думаю, что ты много слышал о WinAPI, кто-то его очень-любит, кто-то НЕНАВИДИТ, потому что не умеет им пользоваться. Сегодня я хочу рассказать тебе о том самом WinAPI(Windows Application Programm Interface). Я считаю, что для изучения WinAPI лучшая IDE - Borland C++ (не builder), хотя VisualC++ тоже подойдёт…. Итак запусти свою IDE и мы начнём….
Создай простой текстовый файл и запиши в него следующее :
HWND MainRegister( char* Name, int x, int y, int w, int h )
{ extern HINSTANCE Instance; // указатель приложения
extern long WINAPI MainEventManager( HWND,UINT,WPARAM,LPARAM );
static WNDCLASS rc; // параметры главного окна
rc.lpfnWndProc = MainEventManager; // управление событиями
rc.hInstance = Instance; // код приложения
rc.hIcon = LoadIcon(NULL, IDI_EXCLAMATION ); // иконка
rc.hCursor = LoadCursor( NULL, IDC_ARROW ); // курсор
rc.hbrBackground = CreateSolidBrush( RGB( 255,255,255 ) );//фон
rc.lpszClassName = Name; // идентификатор класса окна
RegisterClass( &rc ); // регистрация класса окна
return CreateWindow( Name, Name,
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
x, y, w, h, NULL, NULL, Instance, NULL );
}
Теперь я поясню этот код…. Здесь мы объявляем функцию MainRegister, которая регистрирует ваше приложение в Windows, для того, чтобы оно могло “общаться” с системой. В этой функции создаётся объект класса WNDCLASS, который определяет параметры нашего приложения, затем с помощью функции RegisterClass мы производим регистрацию приложения.Также функция объявляет функцию, которая будет управлять событиями(отвечать и посылать сообщения Windows) - MainEventManager. Наша функция возвращает указатель на созданное окно, который имеет тип HWND. Но этой функцией на нужно воспоьзоваться….. В любой программе с WinAPI должна присутствовать функция WinMain(это как main в досовских или консольных приложениях или как)…… Сохрани этот файл с функцией MainRegister, как MainReg.cpp. Теперь создай ещё один текстовый файл. и в него запиши следующий код :
#include
#include
#include
#pragma stophdr
#include”MainReg.cpp”
/*———глобальные переменные————*/
HINSTANCE Instance;
HWND hw;
/*——————————————*/
#pragma argsused
int WINAPI WinMain (HINSTANCE osInstance, HINSTANCE osPreviousInstance,
LPSTR osParameters, int CommandShow)
{
Instance=osInstance;
MainRegister(”C++(source code)”,50,80,640,500);
MSG MESSAGE;
while(GetMessage(&MESSAGE,0,0,0))
DispatchMessage(&MESSAGE);
}
//——————–PROTOTIP————————//
void wPaint(HWND hw);
/*———-Главное управления событиями——————-*/
long WINAPI MainEventManager(HWND hw, UINT Code,WPARAM wParam,LPARAM lParam)
{ switch(Code)
{
case WM_PAINT: wPaint(hw);
break;
case WM_DESTROY: PostQuitMessage ( 0 );
}
return DefWindowProc(hw,Code,wParam,lParam);
}
Теперь я поясню этот фрагмент кода…. Первые несколько строк мы подключаем библиотеки, необходимые для работы WinAPI-программ. Далее мы объявляем две переменные Instance и hw, они необходимы нам для контроля нашего приложения. Затем идёт та самая основная функция WinMain, она имеет несколько параметров(об этих пареметрах читай в SDK). В этой функции мы и будем испоьзовать нашу MainRegister, которая создаст нам окно и зарегистрирует нприложение в Windows………… Итак наше приложение зарегистрированно, но это только половина дела……….. Нам ещё нужно отвечать на сообщения посылаемые Windows нашей программе….., для этого мы создаём цикл, в котором испоьзуем функцию получения сообщений GetMessage, а затем испоьзуем функцию DispatchMessage. Ну хорошо, допустим мы получили сообщение, но ведь нам надо на него ответить, а если мы не ответим системе, то она просто может “забить” на наше приложение и оно зависнет…… , чтобы система на нас не “забила” мы воспользуемся функцией, которую объявили ещё в MainRegister - MainEventManager. Мы получаем сообщение, но мы не знаем, что это за сообщение, а как же мы будем на него отвечать, ведь ты не можешь ответить на вопрос, не зная его сути? Поэтому мы будем выбирать, на какие сообщения отвечать…. Сообщение мы получаем в переменную Code , затем с помощью оператора switch мы обрабатываем это сообщение, и если мы хотим ответить на сообщение, то мы отвечаем :) Нам совсем не обязательно отвечать на все сообщения посылаемые Windows…., только на основные… В нашей программе мы будем отвечать на сообщение WM_PAINT (запрос на перерисовку окна). В том куске кода мы объявили функцию wPaint, но не записали её содержимого , вот оно :) :
void wPaint(HWND hw)
{
//——————home—————–//
PAINTSTRUCT ps;
HDC Canvas=BeginPaint(hw,&ps);
SetTextColor(Canvas,RGB(0,0,255));
//—————funktion text————-//
TextOut(Canvas,100,5,”HELLO WORLD!!!”,14);
EndPaint(hw,&ps);
}
В этой функции мы выводим в окно надпись HELLO WORLD!!!.
Когда ты нажимаешь на “крестик” , чтобы закрыть программы, то посылается сообщение WM_DESTROY, на которое мы с радостью отвечаем WinAPI функцией PostQuitMessage, которая закрывает наше приложение….
Источник:
|
|