<请教>SDK编程的一个疑惑。
以下是一个简单的API程序:
#include < windows.h >
BOOL RegistWindowsClass( HINSTANCE hInstance );
BOOL CreateWindows( HINSTANCE hInstance, int nCmdShow );
LRESULT WINAPI WndProc( HWND hWnd, UINT Message, UINT wParam, LONG lParam );
int WINAPI WinMain
(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
)
{
if(! RegistWindowsClass( hInstance ))
return FALSE ;
if(! CreateWindows( hInstance, nCmdShow )) //?它所创建的窗口句柄已经丢失
return FALSE ;
MSG Message ;
while( GetMessage( &Message, 0, 0, 0 )) //这个消息循环是属于这个程序的还是这个窗口的?
{
TranslateMessage( &Message );
DispatchMessage( &Message );
}
return Message.wParam ;
}
BOOL RegistWindowsClass( HINSTANCE hInstance )
{
WNDCLASS WndClass ;
WndClass.hInstance = hInstance ;
WndClass.lpszClassName = "WinFill" ;
WndClass.lpfnWndProc = WndProc ;
WndClass.cbClsExtra = 0 ;
WndClass.cbWndExtra = 0 ;
WndClass.style = 0 ;
WndClass.hIcon = LoadIcon( NULL, "END" );
WndClass.hCursor = LoadCursor( NULL, IDC_ARROW );
WndClass.lpszMenuName = NULL ;
WndClass.hbrBackground = (HBRUSH)GetStockObject( WHITE_BRUSH );
return RegisterClass( &WndClass );
}
BOOL CreateWindows( HINSTANCE hInstance, int nCmdShow )
{
HWND hWnd ;
hWnd = CreateWindow
(
"WinFill",
"填充示例程序",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
0,
CW_USEDEFAULT,
0,
NULL,
NULL,
hInstance,
NULL
);
if(! hWnd )
return FALSE ;
ShowWindow( hWnd, nCmdShow );
UpdateWindow( hWnd );
return TRUE ;
}
LRESULT WINAPI WndProc
(
HWND hWnd,
UINT Message,
UINT wParam,
LONG lParam
)
{
switch( Message )
{
case WM_PAINT:
HDC hDC ;
PAINTSTRUCT PtStr ;
hDC = BeginPaint( hWnd, &PtStr );
SetMapMode( hDC, MM_ANISOTROPIC );
HPEN hPen ;
hPen = (HPEN)GetStockObject( BLACK_PEN );
SelectObject( hDC, hPen );
HBRUSH hBrush ;
hBrush = (HBRUSH)GetStockObject( DKGRAY_BRUSH );
SelectObject( hDC, hBrush );
RoundRect( hDC, 50, 120, 100, 200, 15, 15 );
hBrush = (HBRUSH)GetStockObject( LTGRAY_BRUSH );
SelectObject( hDC, hBrush );
Ellipse( hDC, 150, 50, 200, 150 );
hBrush = (HBRUSH)GetStockObject( HOLLOW_BRUSH );
SelectObject( hDC, hBrush );
Pie( hDC, 250, 50, 300, 100, 250, 50, 300, 50 );
DeleteObject ( hPen );
EndPaint( hWnd, &PtStr );
break ;
case WM_DESTROY:
PostQuitMessage( 0 );
break ;
default:
return( DefWindowProc( hWnd, Message, wParam, lParam ));
}
return 0 ;
}
请注意:
1、在我的函数BOOL CreateWindows( HINSTANCE hInstance, int nCmdShow )结束后,这个函数所创建窗口的句柄并未返回,而是丢失了。只是在返回的WM_CREATE、WM_PAINT这两个消息中带有窗口的句柄值,在这两个消息被处理后程序再也无法获得窗口句柄,然而程序却能正常运行,请问其中原因。
2、程序中的消息循环没有得到窗口的任何参数,那么它是隶属于窗口的还是隶属于程序的,我总是搞不太清楚,请指教。