分享

http://book.51cto.com/art/200801/63840.htm

 昵称409217 2009-11-21

3.5 编写第一个Windows程序——实时显示鼠标位置

http://book.51cto.com  2008-01-08 11:18  屈磊,李媛媛编著  电子工业出版社易飞思公司  我要评论(0)

3.5  编写第一个Windows程序——实时显示鼠标位置

通过上面4节的内容,Windows编程的基本内容都已讲解完了。在本节中,就用一个例子来应用前面讲解的知识,从而对Windows编程有一个更加完整的认识。

实例3-14:实时显示鼠标在窗口中的位置。

程序的目的是捕获鼠标在进入程序窗口后的位置,并且在鼠标移动的时候,实时跟踪鼠标运动,同时显示鼠标当前的坐标。在程序中将通过WM_MOUSEMOVING来取得鼠标的实时坐标,并且在窗口的中间将鼠标的位置显示出来。

根据前面学过的知识直接生成一个Win32的应用程序,然后加入下面的代码即可,当然也可以直接使用光盘中的程序文件。

窗口的创建和主程序代码如下:

            

int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR     lpCmdLine,
int       nCmdShow)
{
// TODO: Place code here.
MSG msg;

MyRegisterClass(hInstance);

// Perform application initialization:
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}

// Main message loop:
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}

return msg.wParam;
}

ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;

wcex.cbSize = sizeof(WNDCLASSEX);

wcex.style   = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc  = (WNDPROC)WndProc;
wcex.cbClsExtra  = 0;
wcex.cbWndExtra  = 0;
wcex.hInstance  = hInstance;
wcex.hIcon   = LoadIcon(hInstance, (LPCTSTR)IDI_MOUSEMOVE);
wcex.hCursor   = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = "MouseMove";
wcex.hIconSm   = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);

return RegisterClassEx(&wcex);
}

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;

hInst = hInstance; // Store instance handle in our global variable

hWnd = CreateWindow(  "MouseMove",
"实时鼠标位置", WS_OVERLAPPEDWINDOW,
     CW_USEDEFAULT,
0,
CW_USEDEFAULT,
0,
NULL,
NULL,
hInstance,
NULL);

if (!hWnd)
{
return FALSE;
}

ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);

return TRUE;
}

Windows的窗口处理函数的代码如下,注意WM_MOUSEMOVE消息响应的处理。在这个消息处理中,使用了另外的一种获取图形设备句柄的方法。

            

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;
POINT pt;
CHAR szString[255];

switch (message)
{
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: Add any drawing code here...
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_MOUSEMOVE:     //响应鼠标的移动
pt.x = LOWORD(lParam); //取得x的坐标
pt.y = HIWORD(lParam); //取得y的坐标
//空格的目的是保证显示的正确性。sprintf函数目的是将需要输出
//的信息转换成字符串
sprintf( szString, "[ %d,  %d ]   ", pt.x, pt.y );
hdc = GetDC( hWnd );
//输出字符串
TextOut( hdc, 300, 200, szString, strlen( szString ) );
ReleaseDC( hWnd, hdc );
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}

程序运行结果如图3-16所示。

图3-16  鼠标实时捕捉结果
上面的程序是完整的实时显示鼠标的程序代码。在WM_MOUSEMOVE中读取鼠标位置使用到了两个宏,由于本书的篇幅有限,因此对这两个宏的详细使用和适用位置,不做解释,在MSDN中有详细的说明。
GetDC()函数和ReleaseDC()函数是一对函数。GetDC()函数的使用范围是非WM_PAINT消息。在这个消息以外如果需要取得图形设备句柄,那么就只能通过这个函数来读取。当使用完成后,需要使用ReleaseDC()来释放句柄。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多