VC中对鼠标的确定及简单控制
2008-04-09 04:10:27来源:互联网 阅读 ()
LRESULT APIENTRY WndProc(HWND, UINT, WPARAM, LPARAM); //窗口函数
BOOL ckzc(HINSTANCE); //注册窗口类函数
BOOL ckcj(HINSTANCE, int); //创建窗口函数
HINSTANCE hInst; //当前句柄
HWND hWndMain; //窗口句柄
上面首先是window窗口函数声明。然后依照惯例注册窗口类函数和创建窗口函数。通过关键字HINSTANCE、HWND分别获得当前句柄、窗口句柄。
BOOL ckzc(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);
}
进行window类注册。
BOOL ckcj(HINSTANCE hInstance,int nCmdShow)
{
hInst = hInstance;
hWndMain = CreateWindow("MouseWClass",
"我的鼠标---cnscom",
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);
}
窗口创建工作。
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
MSG msg;
if(!ckzc(hInstance)) //注册窗口类
return (FALSE);
if(!ckcj(hInstance,nCmdShow)) //创建窗口
return (FALSE);
InvalidateRect(hWndMain, NULL, TRUE); //按指定区域更新区域
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (msg.wParam);
}
一个窗口程序最重要的环节了。WinMain对以上我们建立的函数进行了总汇。
LRESULT APIENTRY WndProc(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)); //在指定位置输出文本
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash