您的位置:逆风者 VC++ 正文
原作者:南京 宋陈三 添加时间:2007-09-08 原文发表:2007-09-08 人气:502 来源:www.vckbase.com

本文章共8424字,分5页,当前第1页,快速翻页:
 

下载源代码

摘要:用Visual Studio搞开发的朋友对Spy++这个工具一定不陌生,它可以分析窗体结构、进程和窗口消息,对开发工作有很大辅助作用。我们需要研究某个对象时,只要调出其查找窗口,拖动探测器的指针到指定窗口/控件上释放即可。下面,笔者就和大家一起,用VC打造一个属于自己的Spy++。

逆风者

关键字:句柄 消息 子类化

正文:

  打开VC集成开发环境,建立一个基于对话框的工程。我们把这个工程取名为SpyXX。在窗体中画上一个图片框控件(Picture)、一个静态文本控件(Static)、两个复选框控件(Check Box)和一个选项卡控件(Tab Control)。界面设计如下图。

  
  探测器的制作需要两个图标文件(.ico)和一个鼠标光标文件(.cur),分别用于正常状态下的显示、鼠标拖出时的显示以及拖出时的鼠标指针;这些资源哪里来啊?Spy++中就有啊,用eXeScope挖一下吧。(我是从其他软件中挖出来的,名字好像叫超级什么霸,记不太清了,呵呵。)选项卡控件定义5个标签页,分别为"常规"、"样式"、"类"、"窗口"和"消息"。每个标签页的内容用一个属性页(Property Page)对话框来制作。下面,我们按照顺序描述一下开发过程。
  

  一、探测器的制作
  探测器用一个图片框控件来显示,正常状态下显示一幅有靶的图标。当鼠标在上面按下时,显示内容立刻换为另一幅无靶的图标,同时鼠标指针变为靶状。这样,就给人一种靶心被拖出去的感觉了。通过上面的叙述,我们了解到图片框需要响应WM_LBUTTONDOWN消息和WM_LBUTTONUP消息。而图片框在正常状态下只响应鼠标单击消息BN_CLICK。所以,我们要通过子类化来响应上述两个消息。
  把图片框的ID设为IDC_PIC,并选中其Notify属性(否则不响应消息)。依次点击菜单Insert->New Class,Class type选择MFC Class,类名取为CMyPic,基类为CStatic。添加CSpyXXDlg类的私有成员变量CMyPic m_pic,在对话框的初始化过程中将其与图片框关联。代码如下:

BOOL CSpyXXDlg::OnInitDialog()
{
    CDialog::OnInitDialog();
    m_pic.SubclassDlgItem(IDC_PIC,this);
    ……
    return TRUE;
}

  在CMyPic类中,我们就可以响应鼠标左键按下和弹起的消息了。按Ctrl + W打开Class Wizard,选择Message Maps标签页,在Class name下拉列表中选择CMyPic。从Messages列表中分别增加WM_LBUTTONDOWN和WM_LBUTTONUP消息,并接受其缺省函数名OnLButtonDown和OnLButtonUp。图标交换和鼠标光标交换的代码如下:

void CMyPic::OnLButtonDown(UINT nFlags, CPoint point) 
{
    // TODO: Add your message handler code here and/or call default
    SetCapture();   //鼠标捕获
    HCURSOR hc = LoadCursor(AfxGetApp()->m_hInstance, MAKEINTRESOURCE (IDC_CURSOR1)); 
    //IDC_CURSOR1是靶形光标资源号
    ::SetCursor(hc);
    HICON hicon2 = LoadIcon(AfxGetApp()->m_hInstance, MAKEINTRESOURCE (IDI_ICON2)); 
    //IDI_ICON2为无靶图标资源号
    this->SetIcon(hicon2);
    CStatic::OnLButtonDown(nFlags, point);
}
void CMyPic::OnLButtonUp(UINT nFlags, CPoint point) 
{
    // TODO: Add your message handler code here and/or call default
    ReleaseCapture(); //释放鼠标捕获
    HICON hicon1 = LoadIcon(AfxGetApp()->m_hInstance, MAKEINTRESOURCE (IDI_ICON1)); 
    //IDI_ICON1是有靶图标资源号
    this->SetIcon(hicon1);
    CStatic::OnLButtonUp(nFlags, point);
}

  探测器外观制作完成了。可以先运行一下,把鼠标按下后拖动试试。下面来实现其功能:获取窗口句柄。根据鼠标位置来确定窗口需要用到API函数GetCursorPos和WindowFromPoint。此外,我们还想做到像抓图程序那样,鼠标移动到的地方,窗口四周会出现闪烁的矩形。这一点,我们用定时器来实现。定时器设在CSpyXXDlg类中,但要由CMyPic中的OnLButtonUp来启动。所以,我们定义一个全局变量g_hMe将CSpyXXDlg的实例句柄保存起来。同时,被选取的窗口句柄也涉及到在多个标签页中显示,所以也用全局变量g_hWnd将之保存。其余的用于显示标签页的属性页对话框句柄分别用g_hPage0、g_hPage1、g_hPage2、g_hPage3和g_hPage4来保存。启动定时器的代码如下:
 

本文章更多内容1 - 2 - 3 - 4 - 5 - 下一页>>
相关文章

汉诺塔游戏的设计
关于控件注册和使用许可问题的解决办法
基于MFC对话框的NT服务程序框架
计算MDI子窗口数,仅显示文件夹的打开对话框
PE文件格式详解(下)
GDI和GDI 对象的相互转换
软件框架的利器、TangramMini组件应用教程二
C语言高效编程的几招
VC 操作 SQL Server 主从表
软件测试悖论
WIN32程序挂钩SetLastError,输出错误描述到
超强仿QQ自动伸缩窗口
VC实用小知识总结 (一)
VC实用小知识总结 (二)
BMP图象解析
让你的软件界面更漂亮(五)
MFC中基于对话框程序快捷键的实现
用递归的方法画分形图
利用IJG JPEG Library压缩图像为jpg格式
软件框架的利器、TangramMini组件应用教程六

相关评论


本文章所属分类:首页 VC++

  热门关键字: