Re: Strange problem about register window class
Thanks very much!
You typed "wndclass.hIconSm", but it should be "wc.hIconSm".
Yes,you are right.
Better using _stnprintf(), to avoid buffer overflows.
Where is the _stnprintf()?I can't find it in Win32 SDK.
so wc.hInstance = hInstance is correct and requires no cast.
I'm afraid you didn't see clearly.What I wrote is :
reinterpret_cast<HINSTANCE>(&hInstance),it's &hInstance,not
hInstance.So it requires cast.
In Win32 SDK,it says that wc.hInstance is the "Handle to the instance
that the window procedure of this class is within".
But I found even if assigning wc.hInstance with NULL,it's OK.So my
question is:
what use wc.hInstance has?
Below is an example,in which the wndclass.hInstance is assigned with
0.
#include <windows.h>
LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM ) ;
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE,
PSTR, int iCmdShow )
{
static TCHAR szAppName[] = "Hello" ;
HWND hwnd ;
MSG msg ;
WNDCLASS wndclass ;
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = 0 ;
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = szAppName ;
if( ! RegisterClass( &wndclass ) )
{
MessageBox( NULL, TEXT( "This program requires Windows NT!" ),
szAppName, MB_ICONERROR ) ;
return 0 ;
}
hwnd = CreateWindow( szAppName,
TEXT( "The Hello Program" ),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL ) ;
ShowWindow( hwnd, iCmdShow ) ;
UpdateWindow( hwnd ) ;
while( GetMessage( &msg, NULL, 0, 0 ) )
{
TranslateMessage( &msg ) ;
DispatchMessage( &msg ) ;
}
return msg.wParam ;
}
LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam,
LPARAM lParam )
{
HDC hdc ;
PAINTSTRUCT ps ;
RECT rect ;
switch( message )
{
case WM_PAINT :
hdc = BeginPaint( hwnd, &ps ) ;
GetClientRect( hwnd, &rect ) ;
DrawText( hdc, "Hello", -1, &rect,
DT_SINGLELINE | DT_CENTER | DT_VCENTER ) ;
EndPaint( hwnd, &ps ) ;
return 0 ;
case WM_DESTROY :
PostQuitMessage( 0 ) ;
return 0 ;
}
return DefWindowProc( hwnd, message, wParam, lParam) ;
}