以鼠标为例,当用鼠标单击菜单栏的任何部分时,鼠标只送入一个WM-NCHITTEST消息,默认函数DefWindowProc( )对此消息的处理结果是先后发出WM_SYSCOMMAND和WM_INITMENU。这两条消息不送入消息队列,函数DefWindowProc( )直接把消息给窗口过程函数。这两条函数默认还是用DefWindowProc( )处理。先不讨论对WM_SYSCOMMAND的处理。DefWindowProc( )对WM_INITMENU的处理将导致三种情况发生:1鼠标单击在菜单栏的命令项上,则发出WM_COMMAND。2鼠标单击在菜单栏的弹出项时,发出WM_INITMENUPOPUP,这条消息处理完后显示弹出式菜单,单击弹出式菜单中的命令项,发出WM_COMMAND。3鼠标单击在菜单栏的空白处时,不做反映。以上消息除WM-NCHITTEST放入消息队列外,其他均直接调用窗口处理函数去处理。
下面为自己写的测试代码:
#include<windows.h>
LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM );
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
HWND hwnd;
MSG Msg;
WNDCLASS wndclass;
char lpszClassName[] = "Windows";
char lpszTitle[] = "Windows Example";
wndclass.style = 0;
wndclass.lpfnWndProc = WndProc;
wndclass.cbWndExtra = 0;
wndclass.cbClsExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon( NULL, IDI_HAND );
wndclass.hCursor = LoadCursor( NULL, IDC_CROSS );
wndclass.hbrBackground = (HBRUSH)GetStockObject( WHITE_BRUSH );
wndclass.lpszMenuName = "#101";
wndclass.lpszClassName = lpszClassName;
if ( !RegisterClass( &wndclass ) )
{
MessageBeep( 0 );
return FALSE;
}
hwnd = CreateWindow( lpszClassName, lpszTitle,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL );
ShowWindow( hwnd, nCmdShow );
UpdateWindow( hwnd );
while ( GetMessage( &Msg, NULL, 0, 0 ) )
{
//Sleep(1000);
TranslateMessage( &Msg );
DispatchMessage( &Msg );
}
return Msg.wParam;
}
LRESULT CALLBACK WndProc( HWND hwnd, UINT message,
WPARAM wParam, LPARAM lParam )
{
switch( message )
{
HDC hdcClick;
case WM_DESTROY: PostQuitMessage( 0 );
case WM_SYSCOMMAND:
hdcClick=GetDC(hwnd);
TextOut(hdcClick,0,0,"SYSCOMMAND",sizeof("SYSCOMMAND"));
ReleaseDC(hwnd,hdcClick); Sleep(1000);
return DefWindowProc( hwnd, message, wParam, lParam );
case WM_INITMENU:
hdcClick=GetDC(hwnd);
TextOut(hdcClick,0,20,"INITMENU",sizeof("INITMENU"));
ReleaseDC(hwnd,hdcClick); Sleep(1000);
return DefWindowProc( hwnd, message, wParam, lParam );
case WM_INITMENUPOPUP:
hdcClick=GetDC(hwnd);
TextOut(hdcClick,0,40,"INITMENUPOPUP",sizeof("INITMENUPOPUP"));
ReleaseDC(hwnd,hdcClick); Sleep(1000);
return DefWindowProc( hwnd, message, wParam, lParam );
case WM_COMMAND:
hdcClick=GetDC(hwnd);
TextOut(hdcClick,0,60,"COMMAND",sizeof("COMMAND"));
ReleaseDC(hwnd,hdcClick);
return DefWindowProc( hwnd, message, wParam, lParam );
case WM_NCHITTEST:
hdcClick=GetDC(hwnd);
TextOut(hdcClick,0,80,"NCHITTEST",sizeof("NCHITTEST"));
ReleaseDC(hwnd,hdcClick); Sleep(1000);
return DefWindowProc( hwnd, message, wParam, lParam );
case WM_LBUTTONDBLCLK:
hdcClick=GetDC(hwnd);
TextOut(hdcClick,0,100,"LBUTTONDBLCLK",sizeof("LBUTTONDBLCLK"));
ReleaseDC(hwnd,hdcClick);
return DefWindowProc( hwnd, message, wParam, lParam );
case WM_LBUTTONDOWN:
hdcClick=GetDC(hwnd);
TextOut(hdcClick,0,120,"LBUTTONDOWN",sizeof("LBUTTONDOWN"));
ReleaseDC(hwnd,hdcClick);
return DefWindowProc( hwnd, message, wParam, lParam );
default:
return DefWindowProc( hwnd, message, wParam, lParam );
}
return 0;
}