Basic Structure of Win32 application, basic structure of win32
0 Introduction
Win32 API is an application programming interface used to create Windows applications. Generally, a Win32 application contains the following parts:
1) application portal;
2) Registration window class;
3) create a window;
4) display window;
5) Update window
6) message loop;
7) send messages;
1 application portal
The Win32 application uses the WinMain function as the program entry. The function prototype is as follows:
Int WinMain (
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
Int nCmdShow );
2. Registration window class
To register a window class, you must provide a custom window class name. In the window created by this window class name, the operating system delivers the message to the window process function specified when the window class is registered.
The Win32 application uses RegisterClassEx to register the window class. The function prototype is as follows:
ATOM RegisterClassEx (const wndclassex * pWndClass );
When Visual Studio is used to create a win32 project, a function of the registration window is automatically generated. The function implementation is as follows:
ATOM MyRegisterClass (HINSTANCE hInstance)
{
WNDCLASSEX wcex;
Wcex. cbSize = sizeof (WNDCLASSEX );
Wcex. style = CS_HREDRAW | CS_VREDRAW;
Wcex. lpfnWndProc = WndProc;
Wcex. cbClsExtra = 0;
Wcex. cbWndExtra = 0;
Wcex. hInstance = hInstance;
Wcex. hIcon = LoadIcon (hInstance, MAKEINTRESOURCE (IDI_SKINUI ));
Wcex. hCursor = LoadCursor (NULL, IDC_ARROW );
Wcex. hbrBackground = (HBRUSH) (COLOR_WINDOW + 1 );
Wcex. lpszMenuName = MAKEINTRESOURCE (IDC_SKINUI );
Wcex. lpszClassName = szWindowClass;
Wcex. hIconSm = LoadIcon (wcex. hInstance, MAKEINTRESOURCE (IDI_SMALL ));
Return RegisterClassEx (& wcex );
}
3. Create window
The Win32 application uses createmediawex to create a window. The function prototype is as follows:
HWND createmediawexw (
_ In DWORD dwExStyle,
_ In_opt maid,
_ In_opt LPCWSTR lpWindowName,
_ In DWORD dwStyle,
_ In int X,
_ In int Y,
_ In int nWidth,
_ In int nHeight,
_ In_opt HWND hWndParent,
_ In_opt HMENU hMenu,
_ In_opt HINSTANCE hInstance,
_ In_opt LPVOID lpParam );
4. display window
The Win32 application uses ShowWindow to display the window. The function prototype is as follows:
BOOL ShowWindow (_ in HWND hWnd, _ in int nCmdShow );
5. Update window
The Win32 application uses UpdateWindow to update the window. The function prototype is as follows:
BOOL UpdateWindow (_ in HWND hWnd );
6. Message Loop
Each Win32 application requires at least one message loop with the following structure:
MSG msg;
While (GetMessage (& msg, NULL, 0, 0 ))
{
If (! TranslateAccelerator (msg. hwnd, hAccelTable, & msg ))
{
TranslateMessage (& msg );
DispatchMessage (& msg );
}
}
Function prototypes are not listed here. For details, refer to MSDN.
7. Send messages
The window procedure function is used to receive messages delivered by the system. Win32 applications send messages here. A typical window procedure function is as follows:
Lresult callback WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
Int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
Switch (message)
{
Case WM_COMMAND:
WmId = LOWORD (wParam );
WmEvent = HIWORD (wParam );
// Parse the menu selections:
Switch (wmId)
{
Case IDM_ABOUT:
DialogBox (hInst, MAKEINTRESOURCE (IDD_ABOUTBOX), hWnd, About );
Break;
Case IDM_EXIT:
DestroyWindow (hWnd );
Break;
Default:
Return DefWindowProc (hWnd, message, wParam, lParam );
}
Break;
Case WM_PAINT:
Hdc = BeginPaint (hWnd, & ps );
// TODO: Add any drawing code here...
EndPaint (hWnd, & ps );
Break;
Case WM_DESTROY:
PostQuitMessage (0 );
Break;
Default:
Return DefWindowProc (hWnd, message, wParam, lParam );
}
Return 0;
}
8 conclusion
Through the combination of the above parts, a simple Win32 application is complete. The Code is as follows:
Int WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
UNREFERENCED_PARAMETER (hPrevInstance );
UNREFERENCED_PARAMETER (lpCmdLine );
MyRegisterClass (hInstance );
HWND hWnd = CreateWindow (szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL );
If (! HWnd)
{
Return FALSE;
}
ShowWindow (hWnd, nCmdShow );
UpdateWindow (hWnd );
MSG msg;
While (GetMessage (& msg, NULL, 0, 0 ))
{
If (! TranslateAccelerator (msg. hwnd, hAccelTable, & msg ))
{
TranslateMessage (& msg );
DispatchMessage (& msg );
}
}
Return (int) msg. wParam;
}