рд╡рд┐рдВрдбреЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ WinAPI рдЖрд╡рд░рдг рдмрдирд╛рдирд╛

рдХреБрдЫ рд╕рдордп рдкрд╣рд▓реЗ рдореБрдЭреЗ C ++ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдВрдбреЛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдмрдирд╛рдиреЗ рдХрд╛ рд╢реМрдХ рдерд╛ред рдФрд░ рдЖрдЬ рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ рд╡рд┐рдиреНрдбреИрдк рдХрд┐рдП рдЧрдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП WinAPI рдкрд░ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЖрд╡рд░рдг рдХреИрд╕реЗ рд▓рд┐рдЦреЗрдВред

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рдирдВрдЧреЗ рдПрдкреАрдЖрдИ рдкрд░ рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ WinMain рдлрд╝рдВрдХреНрд╢рди (рд╡рд┐рдВрдбреЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рдХреЗ рдЕрдиреБрд░реВрдк) рдореЗрдВ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рд▓рд┐рдП WinProc рдлрд╝рдВрдХреНрд╢рди рд╣реЛрддреЗ рд╣реИрдВред

рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рдПрдкреАрдЖрдИ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдореЗрдВ рдореБрдЦреНрдп рдХрдард┐рдирд╛рдИ WinProc рдХреЛ рдЫрд┐рдкрд╛рдиреЗ рдФрд░ рдПрдХ рд╕реБрдЧрдо рд╕рдВрджреЗрд╢ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдкреНрд░рдгрд╛рд▓реА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред

рд╣рдорд╛рд░реЗ рд░реИрдкрд░ рдореЗрдВ рджреЛ рд╡рд░реНрдЧ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреЗ: CApp рдФрд░ CWndред рдкрд╣рд▓рд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╡рд░реНрдЧ рд╣реИ, рдЗрд╕рдХреЗ рдЕрдВрджрд░ рдореБрдЦреНрдп рд╕рдВрджреЗрд╢ рд▓реВрдк рд╣реИред рджреВрд╕рд░рд╛ рд╡рд┐рдВрдбреЛ рдХреНрд▓рд╛рд╕ рд╣реИред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рдЖрд╡реЗрджрди рд╡рд░реНрдЧ рд▓рд┐рдЦреЗрдВред рдпрд╣ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ:
//
class CApp
{
public :
//
//
void Run()
{
MSG msg;
while (GetMessage(&msg,0,0,0)!=0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
};


* This source code was highlighted with Source Code Highlighter .

рдЗрд╕рдореЗрдВ рдПрдХ рдПрдХрд▓ рд░рди рдлрд╝рдВрдХреНрд╢рди рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдЕрдВрджрд░ рдПрдХ рд╡рд╛рджрд╛ рд▓реВрдк рд╣реЛрддрд╛ рд╣реИред
рд▓реВрдк рдореЗрдВ, рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╡рд┐рдВрдбреЛ рдлрд╝рдВрдХреНрд╢рди (WinProc) рдкрд░ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред

рдЖрдЧреЗ рд╣рдо CWnd рдХреНрд▓рд╛рд╕ рдмрдирд╛рдПрдВрдЧреЗ:
//
class CWnd
{
//
typedef LRESULT (CWnd::*FuncPointer)(LPARAM,WPARAM);

// -
struct POINTER
{
CWnd* wnd; // ,
FuncPointer func;
};

protected :
HWND _hwnd; //
map<UINT,POINTER> _msgmap;//


* This source code was highlighted with Source Code Highlighter .

рдЗрд╕рдореЗрдВ рд╡рд┐рдВрдбреЛ рдХрд╛ рд╣реИрдВрдбрд▓ (HWND) рдФрд░ рд╕рдВрджреЗрд╢реЛрдВ рдХрд╛ рдореИрдк рд╣реЛрддрд╛ рд╣реИред
рд╣рдо рдкреЙрдЗрдВрдЯрд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╣реИрдВрдбрд▓рд░ рдлрд╝рдВрдХреНрд╢рди (рдлрдВрдХрдкреЙрдЗрдВрдЯрд░) рдФрд░ рдкреЙрдЗрдВрдЯрд░ рд╕рдВрд░рдЪрдирд╛ рдХреА рднреА рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдФрд░ рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдЙрд╕ рд╡рд░реНрдЧ рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рд╕реЗ рд╡рд╣ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред

рдлрд┐рд░ рд╣рдо рд╡рд┐рдВрдбреЛ рдирд┐рд░реНрдорд╛рдг рдХрд╛рд░реНрдп рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:
//
bool Create(
HWND parent, // , 0 -
LPCWSTR text, //
DWORD exstyle,DWORD style, //
int x, int y, int w, int h, //
UINT id //
)
{
//
WNDCLASSEX wndc;
wndc.lpszClassName=L "MyWnd" ;
wndc.cbSize= sizeof (WNDCLASSEX);
wndc.lpfnWndProc=WNDPROC(_WndProc); //
wndc.cbClsExtra=0;
wndc.cbWndExtra=0;
wndc.hbrBackground=HBRUSH(COLOR_WINDOW); //
wndc.hInstance=GetModuleHandle(0); //
wndc.hCursor=LoadCursor(0,IDC_ARROW); //
wndc.style=CS_HREDRAW|CS_VREDRAW;
wndc.hIcon=0;
wndc.hIconSm=0;
wndc.lpszMenuName=0;
RegisterClassEx(&wndc);

//
_hwnd=CreateWindowEx(exstyle,L "MyWnd" ,text,
style|WS_CLIPCHILDREN, // WS_CLIPCHILDREN ,
x,y,w,h,parent,HMENU(id),
GetModuleHandle(0),
this //
);

if (!_hwnd) return false ;
return true ;
}


* This source code was highlighted with Source Code Highlighter .

рдЗрд╕рдореЗрдВ, рд╣рдо рд╡рд┐рдВрдбреЛ рдХреНрд▓рд╛рд╕ рдХреЛ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ CreateWindowEx рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрд╡рдпрдВ рд╡рд┐рдВрдбреЛ рдмрдирд╛рддреЗ рд╣реИрдВред
рд╣рдо Cwnd рдХреЗ рдПрдХ рд╕реВрдЪрдХ рд╕реЗ CreateWindowEx рддрдХ рдПрдХ рд╕рдВрдХреЗрддрдХ рднреА рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╣рдо рдмрд╛рдж рдореЗрдВ API рд╣реИрдВрдбрд▓ (HWND) рдФрд░ CWnd рдХреЗ рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдЬреЛрдбрд╝ рд╕рдХреЗрдВред

рдЕрдм рдореБрдЦреНрдп рдмрд┐рдВрджреБ рдкрд░ рдЖрддреЗ рд╣реИрдВред
рд╣рдорд╛рд░реА рдХрдХреНрд╖рд╛ рдореЗрдВ рдПрдХ рд╡рд┐рдВрдбреЛ рдлрд╝рдВрдХреНрд╢рди рдЬреЛрдбрд╝реЗрдВред рдпрд╣ рд╕реНрдерд┐рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
//
//
static LRESULT CALLBACK _WndProc(HWND hwnd,UINT message,WPARAM wparam,LPARAM lparam)
{
CWnd *wnd=0;
// WM_NCCREATE WM_CREATE
//.
if (message==WM_NCCREATE)
{
// , CreateWindowEx
wnd=(CWnd*)LPCREATESTRUCT(lparam)->lpCreateParams;
// GWL_USERDATA
SetWindowLong(hwnd,GWL_USERDATA,LONG(LPCREATESTRUCT(lparam)->lpCreateParams));
wnd->_hwnd=hwnd;
}
// , GWL_USERDATA
wnd=(CWnd*)GetWindowLong(hwnd,GWL_USERDATA);
if (wnd)
{
//
map<UINT,POINTER>::iterator it;
it=wnd->_msgmap.find(message);

// ,
if (it==wnd->_msgmap.end()) return DefWindowProc(hwnd,message,wparam,lparam);
else
{
POINTER msg=it->second;
//
LRESULT result=(msg.wnd->*msg.func)(lparam,wparam);
if (result) return result;
}
}
return DefWindowProc(hwnd,message,wparam,lparam);
}
};


* This source code was highlighted with Source Code Highlighter .

рдЗрд╕рдореЗрдВ рдирд┐рдореНрди рд╣реЛрддрд╛ рд╣реИред рдкрд╣рд▓реЗ рд╣рдо WM_NCCREATE рд╕рдВрджреЗрд╢ рдХреЛ рдкрдХрдбрд╝рддреЗ рд╣реИрдВред рдЗрд╕рдореЗрдВ, рд╣рдо рдкреЙрдЗрдВрдЯрд░рд╡реЙрдиреНрдбреЗ рдХреЛ рдкреЙрдЗрдВрдЯрд░ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд╡рд┐рдВрдбреЛ рдХреЗ GWL_USERDATA рдлрд╝реАрд▓реНрдб рдореЗрдВ рд╕рд╣реЗрдЬрддреЗ рд╣реИрдВред рдЕрдм рдХрд┐рд╕реА рднреА рд╕рдордп рд╣рдо рд╣рд╛рде рдкрд░ рдХреЗрд╡рд▓ HWND рдХреЗ рд╕рд╛рде CWnd рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрддрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЕрдЧрд▓рд╛, рд╣рдо рдирдХреНрд╢реЗ рдореЗрдВ рд╡рд░реНрддрдорд╛рди рд╕рдВрджреЗрд╢ рдХреА рддрд▓рд╛рд╢ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдпрджрд┐ рдпрд╣ рд╣реИ, рддреЛ рдЗрд╕ рдирдХреНрд╢реЗ рд╕реЗ рд╣реИрдВрдбрд▓рд░ рдХреЛ рд╕реВрдЪрдХ рджреНрд╡рд╛рд░рд╛ рдХреЙрд▓ рдХрд░реЗрдВред

рдЕрдм рд╣рдо рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдЬреЛ рдорд╛рдирдЪрд┐рддреНрд░ рдореЗрдВ рдПрдХ рд╕рдВрджреЗрд╢ рдЬреЛрдбрд╝ рджреЗрдЧрд╛:
//
// - T - CWnd
template<typename T>
bool AddMessage(UINT message,CWnd* wnd,LRESULT (T::*funcpointer)(LPARAM,WPARAM))
{
if (!wnd || !funcpointer) return false ;

POINTER msg;
msg.wnd=wnd;
msg.func=reinterpret_cast<FuncPointer>(funcpointer);

_msgmap.insert(pair<UINT,POINTER>(message,msg));

return true ;
}


* This source code was highlighted with Source Code Highlighter .

рдпрд╣ рдПрдХ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдФрд░ рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред рдХрд┐рд╕реА рднреА CWnd рд╡рдВрд╢ рд╕рджрд╕реНрдп рд╡рд░реНрдЧ рдХреЗ рд╕рджрд╕реНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реВрдЪрдХ рдХреЛ рдПрдХ рд╕реВрдЪрдХ рдореЗрдВ CWnd рдХреЗ рд╕рджрд╕реНрдп рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдХрдирд╡рд░реНрдЯ рдХрд░рддрд╛ рд╣реИред рд╕рднреА рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЛ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдкрд░ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИред

рдмрд╕, рд╣рдорд╛рд░рд╛ рд░реИрдкрд░ рддреИрдпрд╛рд░ рд╣реИред
рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг:
// CWnd
class CMyWnd: public CWnd
{
public :
CMyWnd()
{
// WM_CREATE WM_DESTROY
AddMessage(WM_CREATE, this ,&CMyWnd::OnCreate);
AddMessage(WM_DESTROY, this ,&CMyWnd::OnDestroy);
}
LRESULT OnCreate(LPARAM lparam,WPARAM wparam)
{
MessageBox(0,_T( "HelloHabr!" ),_T( "" ),0);
return 0;
}
LRESULT OnDestroy(LPARAM lparam,WPARAM wparam)
{
PostQuitMessage(0);
return 0;
}
};

int APIENTRY WinMain(HINSTANCE hinst,HINSTANCE prev,LPSTR cmd, int showcmd)
{
//
CMyWnd *wnd= new CMyWnd;
wnd->Create(0,L "HelloHabr!" ,0,WS_OVERLAPPEDWINDOW|WS_VISIBLE,300,300,500,400,0);

//
CApp *app= new CApp;
app->Run();
return 0;
}


* This source code was highlighted with Source Code Highlighter .

рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡рд┐рдВрдбреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо CWnd рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдЖрддреЗ рд╣реИрдВ, рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИрдВрдбрд▓рд░ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдорд╛рдирдЪрд┐рддреНрд░ рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рддреИрдпрд╛рд░ рд╣реЛрддрд╛ рд╣реИред

Source: https://habr.com/ru/post/In123648/


All Articles