/*
时间:2012.07.16
功能:用鼠标画图
目的:拦截鼠标以及拦截的解决方案
*/
#define _WIN32_WINNT 0x0400 //鼠标滚轮的操作所必须的宏定义!
#include <windows.h>
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam,LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
WNDCLASS wndcls;
MSG msg;
HWND hwnd;
TCHAR szClassName[] = TEXT("Myclass");
wndcls.style = CS_VREDRAW | CS_HREDRAW | CS_DBLCLKS;
wndcls.lpfnWndProc = WindowProc;
wndcls.cbClsExtra = 0;
wndcls. cbWndExtra = 0;
wndcls. hInstance = hInstance;
wndcls. hIcon =LoadIcon(NULL,IDI_APPLICATION);
wndcls.hCursor = LoadCursor(NULL,IDC_ARROW);
wndcls. hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
wndcls.lpszMenuName =NULL;
wndcls.lpszClassName = szClassName;
RegisterClass(&wndcls);
hwnd = CreateWindow(szClassName,"window",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))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WindowProc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
)
{
HDC hdc;
PAINTSTRUCT pt;
static POINT ptend,ptBeg;
static BOOL IsPaint = FALSE;
switch(uMsg)
{
case WM_LBUTTONDOWN:
{
IsPaint = TRUE;
if(IsPaint)
{
SetCursor(LoadCursor(NULL,IDC_CROSS));
ptend.x = ptBeg.x = LOWORD(lParam);
ptend.y = ptBeg.y = HIWORD(lParam);
SetCapture(hwnd);
InvalidateRect(hwnd,NULL,TRUE);
}
return 0;
}
case WM_MOUSEMOVE:
{
SetCursor(LoadCursor(NULL,IDC_CROSS));
if(IsPaint)
{
ptend.x = LOWORD(lParam);
ptend.y = HIWORD(lParam);
InvalidateRect(hwnd,NULL,TRUE);
}
return 0;
}
case WM_LBUTTONUP:
{
SetCursor(LoadCursor(NULL,IDC_ARROW));
if(IsPaint)
{
ptend.x = LOWORD(lParam);
ptend.y = HIWORD(lParam);
InvalidateRect(hwnd,NULL,TRUE);
IsPaint = FALSE;
}
ReleaseCapture();
return 0;
}
case WM_PAINT:
{
hdc = BeginPaint(hwnd,&pt);
SelectObject(hdc,GetStockObject(BLACK_BRUSH));
Rectangle(hdc,ptBeg.x,ptBeg.y,ptend.x,ptend.y);
EndPaint(hwnd,&pt);
return 0;
}
case WM_CLOSE:
{
PostQuitMessage(0);
return 0;
}
}
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
/*
处理WM_LBUTTONUP消息时 窗口上的IDC_CORSS 无法恢复原状。
在程序中加入了 SetCapture 和 ReleaseCapture 两个函数进行鼠标拦截
*/