www.pudn.com > 鼠标输入编程演示程序 20040602222110.rar > Mouse.cpp


// Mouse.cpp : Defines the entry point for the application. 
// 
 
#include "stdafx.h" 
 
LRESULT APIENTRY MainWndProc(HWND, UINT, WPARAM, LPARAM);		//窗口函数 
 
BOOL InitApplication(HINSTANCE);		//注册窗口类函数 
BOOL InitInstance(HINSTANCE, int);		//创建窗口函数 
 
HINSTANCE hInst;	//当前句柄 
HWND hWndMain;		//窗口句柄 
 
HBITMAP hSun, hMoon;		//位图句柄 
 
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, 
		     LPSTR lpCmdLine,	 int nCmdShow) 
{ 
	MSG	msg; 
 
	if(!InitApplication(hInstance))		//注册窗口类 
	    return (FALSE); 
 
	if(!InitInstance(hInstance,nCmdShow))		//创建窗口 
	    return (FALSE); 
 
	hSun = LoadBitmap(hInstance, "SUN");		//获取SUN位图句柄 
	hMoon = LoadBitmap(hInstance, "MOON");		//获取MOON位图句柄 
	InvalidateRect(hWndMain, NULL, TRUE);		//按指定区域更新区域 
	 
	while(GetMessage(&msg,NULL,0,0)) 
	{ 
	    TranslateMessage(&msg); 
	    DispatchMessage(&msg); 
	} 
	return (msg.wParam); 
} 
 
BOOL InitApplication(HINSTANCE hInstance) 
{ 
	WNDCLASSEX wcexMouse; 
 
	wcexMouse.cbSize		= sizeof(WNDCLASSEX); 
	wcexMouse.style		= CS_DBLCLKS;		//支持鼠标双击 
	wcexMouse.lpfnWndProc	= (WNDPROC)MainWndProc; 
	wcexMouse.cbClsExtra	= 0; 
	wcexMouse.cbWndExtra	= 0; 
	wcexMouse.hInstance	= hInstance; 
	wcexMouse.hIcon		= LoadIcon(NULL,IDI_WINLOGO); 
	wcexMouse.hCursor	= LoadCursor(NULL,IDC_ARROW); 
	wcexMouse.hbrBackground	= (HBRUSH) GetStockObject(WHITE_BRUSH); 
	wcexMouse.lpszMenuName	= NULL; 
	wcexMouse.lpszClassName	= "MouseWClass"; 
	wcexMouse.hIconSm	= LoadIcon(NULL,IDI_WINLOGO); 
 
	//为了保证程序WIN98/NT的兼容性和可移植性,用以下对窗口进行注册 
	if (!RegisterClassEx (&wcexMouse)) 
	{ 
		if (!RegisterClass((LPWNDCLASS)&wcexMouse.style)) 
			MessageBox (NULL, TEXT ("注册窗口类失败!"), "wcexMouse", MB_ICONERROR); 
			return (FALSE); 
	} 
	return (TRUE); 
} 
 
BOOL InitInstance(HINSTANCE hInstance,int nCmdShow) 
{ 
	hInst = hInstance; 
 
	hWndMain = CreateWindow("MouseWClass", 
				"使用鼠标示范程序", 
				WS_OVERLAPPEDWINDOW, 
				CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT, 
				NULL,NULL,hInstance,NULL); 
 
	if(!hWndMain) 
	    return (FALSE); 
 
	ShowWindow(hWndMain,nCmdShow); 
	UpdateWindow(hWndMain); 
 
	return (TRUE); 
} 
 
LRESULT APIENTRY MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
	HDC hDc, hMemDc; 
	PAINTSTRUCT ps; 
	DWORD fwKeys; 
	POINT ptMouse; 
	char szTitle[100]; 
	static RECT rect1, rect2; 
	static HCURSOR hCursorPen; 
 
	switch(message) 
	{ 
	case WM_CREATE: 
		rect1.left = 90; 
		rect1.right = 170; 
		rect1.top = 8; 
		rect1.bottom = 68; 
 
		rect2.left = 90; 
		rect2.right = 170; 
		rect2.top = 78; 
		rect2.bottom = 138; 
 
		hCursorPen = LoadCursor(hInst, "RCCURSOR"); 
		break; 
	case WM_LBUTTONDOWN: 
	case WM_RBUTTONDOWN: 
	case WM_MOUSEMOVE: 
		ptMouse.x = LOWORD(lParam);		//取lParam低字节为横坐标x 
		ptMouse.y = HIWORD(lParam);		//取lParam高字节为横坐标y 
		fwKeys = wParam;				//将鼠标按钮和键盘组合赋给32位无符号整数fwKeys 
 
		//下面代码对鼠标进行位置范围测试。如果鼠标落在位图上,那么把鼠标指针设置为自定义的 
		//否则,采用普通的箭头鼠标。 
 
		if (PtInRect(&rect1, ptMouse) || PtInRect(&rect2, ptMouse))		//判断指定点是否在指定矩形内 
			SetCursor(hCursorPen); 
 
		//在标题栏上显示鼠标的当前位置和按键和按键信息 
		//把输出格式和输出变量送到szTitle数组 
		wsprintf(szTitle, "鼠标测试程序 ---- 鼠标位置:[%d,%d]", ptMouse.x, ptMouse.y); 
 
		if (fwKeys!=0) 
		{ 
			//把指定的内容输出到szTitle数组中 
			lstrcat(szTitle, " ---- 您按下了"); 
 
			if(fwKeys & MK_CONTROL) 
				lstrcat(szTitle, "Ctrl "); 
			if(fwKeys & MK_SHIFT) 
				lstrcat(szTitle, "Shift "); 
			if(fwKeys & MK_LBUTTON) 
				lstrcat(szTitle, "鼠标左按钮"); 
			if(fwKeys & MK_RBUTTON) 
				lstrcat(szTitle, "鼠标右按钮"); 
			lstrcat(szTitle, "键"); 
		} 
		SetWindowText(hWnd, szTitle); 
		break; 
		 
	case WM_LBUTTONDBLCLK: 
	case WM_RBUTTONDBLCLK: 
		//如果鼠标双击了窗口客户区,那么就显示坐标信息 
		hDc = GetDC(hWnd); 
 
		//设置输出字体颜色 
		SetTextColor(hDc, (message == WM_LBUTTONDBLCLK) ? RGB(255, 0, 0) : RGB(0, 0, 255)); 
		wsprintf(szTitle, "(%d,%d)", LOWORD(lParam), HIWORD(lParam)); 
		TextOut(hDc, LOWORD(lParam), HIWORD(lParam), szTitle, lstrlen(szTitle));	//在指定位置输出文本 
 
		ReleaseDC(hWnd, hDc); 
		break; 
	case WM_PAINT: 
		hDc = BeginPaint(hWnd, &ps); 
		 
		hMemDc = CreateCompatibleDC(hDc); 
		SelectObject(hMemDc, hSun); 
		BitBlt(hDc, 90, 8, 80, 60, hMemDc, 0, 0, SRCCOPY); 
		DeleteDC(hMemDc); 
 
		hMemDc = CreateCompatibleDC(hDc); 
		SelectObject(hMemDc, hMoon); 
		BitBlt(hDc, 90, 78, 80, 60, hMemDc, 0, 0, SRCCOPY); 
		DeleteDC(hMemDc); 
 
		EndPaint(hWnd, &ps); 
		break; 
	case WM_DESTROY: 
		DeleteObject(hSun); 
		DeleteObject(hMoon); 
		PostQuitMessage(0); 
		break; 
	default: 
		return (DefWindowProc(hWnd, message, wParam, lParam)); 
	} 
	return (0); 
}