Content:
General
Security/hack
Programming
FAQ/Humor
 
 
наша рассылка
Твой E-mail:
Submit
 
 
  Основы WinAPI - основа основ
 
 
  Здорова программер! Я думаю, что ты много слышал о 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, которая закрывает наше приложение….

Источник: http://ogonek.blog.tut.by

 
Интро | О проекте | Услуги | Статьи | Обратная связь
Freelance web designer