16,472
社区成员
发帖
与我相关
我的任务
分享
#include <Windows.h>
#define DIVISIONS 5
LRESULT CALLBACK wWinProc( HWND, UINT, WPARAM, LPARAM );
LRESULT CALLBACK wChildWinProc( HWND, UINT, WPARAM, LPARAM );
TCHAR szChildClass[] = TEXT("Checker3_Child");
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCommandLine, int iCmdShow )
{
static TCHAR szAppName[] = TEXT("Checker3_Child");
HWND hWnd;
MSG msg;
WNDCLASS wndclass;
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = wWinProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon( NULL, IDI_APPLICATION );
wndclass.hCursor = LoadIcon( 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;
}
wndclass.lpfnWndProc = wChildWinProc;
wndclass.cbWndExtra = sizeof( long );
wndclass.hIcon = NULL;
wndclass.lpszClassName = szChildClass;
RegisterClass( &wndclass );
hWnd = CreateWindow( szAppName, //windows class name
TEXT("Checker3 Mouse Hit-Test Demo"), // windows caption.
WS_OVERLAPPEDWINDOW, //windows style.
CW_USEDEFAULT, // initial X positon.
CW_USEDEFAULT, // initial Y positon.
CW_USEDEFAULT, // initial X size.
CW_USEDEFAULT, // initial Y positon.
NULL, //Parent window handle.
NULL, //window menu handle.
hInstance, // program instance handle.
NULL); // creation parameters.
ShowWindow( hWnd, iCmdShow );
UpdateWindow( hWnd );
while( GetMessage( &msg, NULL, 0, 0 ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
return msg.wParam;
}
LRESULT CALLBACK wWinProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
{
static HWND hwndChild[DIVISIONS][DIVISIONS];
int cxBlock, cyBlock, x,y;
switch (message)
{
case WM_CREATE:
for( x = 0; x < DIVISIONS; x++ )
for( y = 0; y < DIVISIONS ; y++ )
hwndChild[x][y] = CreateWindow( szChildClass, NULL,
WS_CHILDWINDOW | WS_VISIBLE,
0, 0, 0, 0,
hwnd, (HMENU)( y << 8 | x ),
(HINSTANCE)GetWindowLong( hwnd, GWL_HINSTANCE ),
NULL );
return 0;
case WM_SIZE:
cxBlock = LOWORD( lParam ) / DIVISIONS;
cyBlock = HIWORD( lParam ) / DIVISIONS;
for( x = 0; x < DIVISIONS; x++ )
for( y = 0; y < DIVISIONS; y++ )
{
MoveWindow( hwndChild[x][y] ,
x * cxBlock, y * cyBlock,
cxBlock, cyBlock, TRUE );
}
return 0;
case WM_LBUTTONDOWN:
MessageBeep( 0 );
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc( hwnd, message, wParam, lParam );
}
LRESULT CALLBACK wChildWinProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
{
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
switch (message)
{
case WM_CREATE:
SetWindowLong( hwnd, 0, 0 );
return 0;
case WM_LBUTTONDOWN:
SetWindowLong( hwnd, 0, 1 ^ GetWindowLong( hwnd, 0 ));
InvalidateRect( hwnd, NULL, FALSE );
return 0;
case WM_PAINT:
hdc = BeginPaint( hwnd, &ps );
GetClientRect( hwnd, &rect);
Rectangle( hdc, 0, 0, rect.right, rect.bottom );
if( GetWindowLong( hwnd, 0 ) )
{
MoveToEx( hdc, 0, 0, NULL );
LineTo( hdc, rect.right, rect.bottom );
MoveToEx( hdc, 0, rect.bottom, NULL );
LineTo( hdc, rect.right, 0 );
}
EndPaint( hwnd, &ps );
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc( hwnd, message, wParam, lParam );
}