Windows 编程基础

三、使用鼠标 返回

  鼠标在系统中显示为一个斜向的箭头,发生鼠标动作时系统产生相应的事件消息,应用程序接收到消息后作出恰当的回应,从而完成命令操作

 

 1、鼠标动作包括单击、双击、移动等,系统已经定义好了它们的标识符,分别如下:

 

 1)单击:鼠标的单击动作是指按键轻巧地按下去又抬起来,包括按下和抬起两个动作,

 

 有左键和右键之分,左键按下的标识符是WM_LBUTTONDOWN,右键是WM_RBUTTONDOWN

 

 而抬起则是把后面的单词DOWN改成成UP即可,当鼠标单击时系统就会发送这两个消息给应用程序,而应用程序的消息处理过程MainWndProc里头加入一段这两个消息的处理代码;

 

 2)双击:双击一般指鼠标左键,迅速的两次单击,系统默认是0.5秒内,否则就是两次单击,

 

 双击时系统发送一个WM_LBUTTONDBLCLK消息给应用程序,然后应用程序的MainWndProc里头加上一段代码来处理这个消息;

 

 3)移动:在没有按键的情况下,移动鼠标,这时屏幕上的箭头鼠标指针也发生移动,

 

 这时系统将发送一个WM_MOUSEMOVE消息,应用程序也可以加上一段代码来响应这个鼠标事件,如果应用程序中没有这一段代码,这个消息将由系统处理代为处理;

 

 4)鼠标的其他情况还包括拖动、同时按住组合键、进入、穿越、离开程序的窗口,这些动作也有相应的处理程序代码;

 

 2、鼠标消息 鼠标消息是一种结构类型,它在指明鼠标动作的同时还携带一些附加信息,其中的lParam参数中携带了鼠标的位置信息,另一个参数wParam则判断是否有键盘上的组合键按下;

 

 下面我们通过一个程序来看看鼠标的使用方法:

 

 1)新建一个名为Mouse的Win32 Application工程,再新建一个名为Mouse的C/C++头文件和一个名为Mouse的C++源程序,

 

 输入程序的框架代码,框架代码经常用到,每次提前抄到本子上,或者打印下来,复制粘贴有时出现莫名其妙的“unexpected end”错误,还是输进去的 可靠些

 

 (绿色部分是注释,必须以双斜杠“//”开头),有的一行太长会自动折到下一行:

 

 头文件Mouse.h的内容是:

  
//申明函数原型
LRESULT CALLBACK MainWndProc(HWND,UINT,WPARAM,LPARAM);
BOOL Init
Application(HINSTANCE);
BOOL InitInstance(HINST
ANCE,int);

 

 源程序Mouse.cpp的内容是:

 

#include <windows.h> 

#include <string.h> 
#include "
Mouse.h"


HINSTANCE hInst;

HWND hWndMain;


int APIENTRY WinMain(
    HINSTANCE hInstance,
    HINST
ANCE hPrevInstance,
    LPSTR lpCmdLine,

    int nCmdShow)
{
   
MSG msg;
//定义一个消息结构msg

    if(!InitApplication(hInstance))
        return (F
ALSE);

    if(!InitInstance(hInstance,nCmdShow))
        return (F
ALSE);
    while (Get
Message(&msg,NULL,0,0))
    {
        Translate
Mess
age(&msg);
        Dispatch
Message(&msg);
    }

    return (msg.wParam);
}

BOOL Init
Application(HINSTANCE hInstance)
{

    WNDCLASS wcMouse;
    wc
Mouse.style=0;
    wc
Mouse.lpfnWndProc=(WNDPROC)MainWndProc;
   
wcMouse.cbClsExtra=0;
    wc
Mouse.cbWndExtra=0;
    wc
Mouse.hInstance=hInstance;
   
wcMouse.hInstance=hInstance;
    wc
Mouse.hIcon =LoadIcon(hInstance,IDI_APPLICATION);
    wc
Mouse.hCursor=LoadCursor(NULL,IDC_ARROW);

    wc
Mouse.hbrBackground=(HBRUSH)(14);
    wc
Mouse.lpszMenuName=NULL;
    wc
Mouse.lpszClassName="MouseWClass";

    return (RegisterClass(&wc
Mouse));
}

BOOL InitInstance(
    HINST
ANCE hInstance, int nCmdShow)
{

    hInst=hInstance;
    hWnd
Main=CreateWindow(
    "
MouseWClass","使用鼠标",
    WS_OVERL
APPEDWINDOW,
    CW_USEDEF
AULT,CW_USEDEFAULT,
    CW_USEDEF
AULT,CW_USEDEFAULT,
    NULL,NULL,hInstance,NULL);

 

    ShowWindow(hWndMain,nCmdShow);
    UpdateWindow(hWnd
Main);
    return (TRUE);
}


 再接着加入消息处理过程,这是本节关键知识,代码如下:


LRESULT
APIENTRY MainWndProc(
HWND hWnd,UINT message,
WPARAM wParam,LPARAM lParam)
{
    char szTitle[50];
//存放标题字符串

    switch(message)
    {
        case W
M_LBUTTONDOWN:

            SetWindowText(hWnd
Main,"按下鼠标");
//替换标题栏显示
           
MessageBox(hWnd,"你按下的是鼠标左键!","提示",MB_OK|MB_ICONINFORMATION);
           
break;
        case W
M_RBUTTONDOWN:
            SetWindowText(hWnd
Main,"按下鼠标");
           
MessageBox(hWnd,"你按下的是鼠标右键!","提示",MB_OK|MB_ICONINFORMATION);
            break;
        case W
M_MOUSEMOVE:
            wsprintf(szTitle,"%s(%d,%d)","鼠标位置",

    LOWORD(lParam),HIWORD(lParam)); //将鼠标位置存入一个字符串数组szTitle中
            SetWindowText(hWndMain,szTitle);//字符串显示到标题栏上
            break;
        case W
M_DESTROY:
            PostQuit
Message(0);
            break;
        default:
            return(DefWindowProc(hWnd,message,wParam,lParam));
    }
    return 0; 
}

 保存一下文件,单击编译条上的“构建”按钮,构建程序,如果出现了错误,就在仔细检查一下,

 

 通过后再单击“执行”按钮,运行一下自己的程序,分别单击左右按键和移动鼠标,看看程序的响应效果;

 

  本节学习了鼠标操作的编程知识,如果你成功地完成了练习,请继续学习下一课内容;

返回

 

  形影相随(在弹出的对话框中选择“运行”、“运行”)  

 

本教程由86团学校TeliuTe制作|著作权所有

基础教程网:http://teliute.org/

美丽的校园……



转载和引用本站内容,请保留作者和本站链接。