Իրադարձությունների մշակում Windows-ում
Windows- ում իրադարձությունները մշակվում են ձեր ստեղծաց իրադարձությունների մշակիչ սարքով.Հավելվածի աշխատանքի ժամանակ գեներացվում են տարբեր հաղորդագրություններ որոնք հաղորդվում են հերթ.Որից հետո իրադարձությունների մշակիչը վերցնում է նրանց և հաղորդում է MainWinProc ( ) ֆունկցիային մշակման համար.
Նաենք MainWinProc – ի պրոտոտիպը.
LRESULT CALLBACK MainWinProc ( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam )
MainWinProc –ի պարամետրերը հետևյալն են.
Hwnd – պատուհանի դեսկրիպտոր.
Msg – իրադարձությունների ինդենտիֆիկատոր, որը պետկ է հաղորդվի MainWinProc ( ) ֆունկցիային մշակման համար.
wparam և lparam - դա իրադարձությունների մշակման լրացուցիչ պարամետրերն են.Իրադարձությունների մշակիչ գրելու համար հաճախ օգտագործվում է switch ( msg ) կոնստրուկցիան.Նաենք մի քանի հաղորդագրություն ,որոնք կարող են պետկ գալ խաղի ստեղծման համար.
WM_PAINT – այդ հաղորդագրությունը ուղարկվում է երբ մեզ պետկ է վերանկարել ամբողջ պատուհանը, որը կարող էր տեղփոված լինել կամ չափ է փոխվել.
WM_DESTROY - այդ հաղորդագրությունը ուղարկվում է Windows, երբ պատուհանը պետկ է փագվի.
WM_QUIT - դրանից հետո կանչվում է այդ հաղորդագրությունը, որը և փագում է պատուհանը.
Միավորելով իրար մենք կստանանք MainWinProc ( ) ֆունկցիա.
LRESULT CALLBACK MainWinProc(HWND hwnd,
UINT msg, WPARAM wparam,
LPARAM lparam)
{
switch(msg)
{
case WM_PAINT:
break;
case WM_DESTROY:
{
PostQuitMessage(0);
return(0);
} break;
}
return (DefWindowProc(hwnd, msg, wparam, lparam));
}
PostQuitMessage ( 0 ) ֆունկցիան QUIT ֆունկցիաին դնում է հերթին. Որը և կփագի ձեր պատուհանը.DefWindowProc ( ) ֆունկցիան մշակում է այն հաղորդագրությունները որոնք դուք չեք օգտագործում.
Գլխավոր իրադարձությունների մշակիչ
Կնաենք գլխավոր իրադարձությունների մշակիչ, որը օգտագործվում է հետևյալ օրինակում:
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
While ցիկլը կատարվում է եդքան մինչև GetMessage ( ) ֆունկցիան վերադարձնում ոչ զրո նշանակություն.Ցիկլի աշխատանքը կատարվում է հետևյալ ձև երբ ստանում ենք հերթից հաղորդագրություն ինքը մշակվում է TranslateMessage ( ) ֆունկցիայով և հաղորդվում է DispatchMessage ( ) ֆունկցիային, որը կանշում է MainWinProc ( ) ֆունկցիա մշակմա համար, հաղորդելով նրան ամբողջ պետկական ինֆորմացիա.
Հիմա նաեք թե ինչ է մեր մոտ ստացվել.
Մեր նայաց ծրագիրը կարող եք բեռնավորել(քաշել) ստեղից http://ifolder.ru/14252971
//---------------------------------------------------------------------------------------
#include <windows.h> // Միացնում ենք Windows-ի վերնագրի ֆաիլ
#include "resource.h"
//----------------------------------------------------------------------------------------
// Ֆունկցիա
// MainWinProc()
//Ստեղ կատարվում է իրադարձությունների մշակում
//----------------------------------------------------------------------------------------
LRESULT CALLBACK MainWinProc(HWND hwnd, //Պատուհանի դեսկրիպտոր
UINT msg, //հաղորդագրության ինդենտիֆ.
WPARAM wparam, //լրացուցիչ ինֆորմացիա
LPARAM lparam) // լրացուցիչ ինֆորմացիա
{
switch(msg)
{
case WM_PAINT:
break;
case WM_DESTROY:
{
PostQuitMessage(0);
return(0);
} break;
}
return (DefWindowProc(hwnd, msg, wparam, lparam));
}
//---------------------------------------------------------------------------------------
// Ֆունկցիա
// WinMain()
//---------------------------------------------------------------------------------------
int WINAPI WinMain( HINSTANCE hinstance,
HINSTANCE hprevinstance,
LPSTR lpcmdline,
int ncmdshow)
{
WNDCLASSEX windowsclass; // Ստեղծում ենք դաս(class)
HWND hwnd; // Ստեղծում ենք պատուհանի դեսկրիպտոր
MSG msg; // Հաղորդագրություն
// Определим класс окна WNDCLASSEX
windowsclass.cbSize = sizeof(WNDCLASSEX);
windowsclass.style = CS_DBLCLKS | CS_OWNDC |
CS_HREDRAW | CS_VREDRAW;
windowsclass.lpfnWndProc = MainWinProc;
windowsclass.cbClsExtra = 0;
windowsclass.cbWndExtra = 0;
windowsclass.hInstance = hinstance;
windowsclass.hIcon = LoadIcon(hinstance, IDI_APPLICATION);
windowsclass.hCursor = LoadCursor(NULL, IDC_ARROW);
windowsclass.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);
windowsclass.lpszMenuName = NULL;
windowsclass.lpszClassName = "WINDOWSCLASS";
windowsclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
// Կգրանցենք դասը(class)
if (!RegisterClassEx(&windowsclass))
return(0);
// Երբ դասը(class) գրանցված է կարելի է ստեղծել պատուհան
if (!(hwnd = CreateWindowEx(NULL, // պատուհանի ձևը
"WINDOWSCLASS", // դաս(class).
" Bazain patuhan Directx-i hamar ", // անվանում о
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
300,150, // վերևի ձախ անկյու
500,400, // լայնություն և բարձրություն
NULL, // մայրական պատուհանի դեսկրիպտոր
NULL, // մենուի դեսկրիպտոր
hinstance, // հավելվածի նմուշի դեսկրիպտոր
NULL))) //
return(0);
ShowWindow( hwnd, SW_SHOWDEFAULT ); //Կնկարենք պատուհան
UpdateWindow( hwnd ); //Կթարմացնենք պատուհանը
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return(msg.wParam);
}
Կոմպիլացիաից հետո կտեսնեք դա

Մյուս դասում մենք կավելացնենք մեր պատուհանի կոդին Directx- ի կոդը.Եվ մյուս դասում մենք կվերջացնենք պատուհանի ստեղծելը և կանցնենք գրաֆիկաի ծրագրավորմանը , 3D օբեկտների դուրս բերում մեր ստեղծաց պատուհանում.
Էջանիշներ