2012-03-19 21:22:59|?次阅读|上传:wustguangh【已有?条评论】发表评论
关键词:C/C++, MFC, 界面设计, 操作系统|来源:唯设编程网
VC编程实现交互式截屏的MFC DLL(一)介绍了实现交互式截屏的MFC DLL入口部分,虽然已经可以实现截屏的功能,但是尚未实现真正的交互,本文承接前文,实现该项目的其它功能:全屏静态展示当前屏幕,接受用户交互式的鼠标操作。用户可以按下鼠标左键,拖动形成选区,释放完成截屏。本文主要用到的技术包括:在对话框中显示位图(BMP)、鼠标事件的处理、位图拷贝、修改光标。
先回顾前文的交互式截屏函数:
示例:
// 交互式截图 // 结果保存在成员变量m_pBackBitmap中 CScreenShutter* CScreenShutter::getScreenBitmap(){ //显示位图 AFX_MANAGE_STATE(AfxGetStaticModuleState()); CScreenSnapDlg dlg(m_pBitmap); dlg.DoModal(); return this; }
这里用到了模态对话框CScreenSnapDlg ,本文将详细介绍CScreenSnapDlg类的设计方案和具体VC源码。下面逐步介绍详细的设计步骤:
在资源视图Dialog节点点击右键,弹出菜单中选择"插入Dialog"增加对话框资源(Dialog)到项目的资源文件中,设置对话框属性:Border[Thin],TitleBar[False]。
如果没有资源文件,你可以添加一个。
双击窗体可以快速为刚才添加的对话框资源定义关联类,取名为CScreenSnapDlg。选中类CScreenSnapDlg以后,在属性面板的消息选项卡下面添加类CScreenSnapDlg的消息响应函数,本实例增加了响应函数的消息包括:WM_PAINT、WM_SETCURSOR、WM_MOUSEMOVE、WM_LBUTTONUP、WM_LBUTTONDOWN,然后添加需要用到的成员变量,类WM_CScreenSnapDlg最终声明的完整代码如下。
示例:
// CScreenSnapDlg 对话框 class CScreenSnapDlg : public CDialog { DECLARE_DYNAMIC(CScreenSnapDlg) private: //绘制矩形 void drawRect(CRect& rect,CDC* pDC); // 截取全屏幕的位图,以显示在对话框中 void getScreenBitmap(); //加载截取的位图 void loadShutterBitmap(); private: HCURSOR hCursor; //截屏时使用的光标 bool m_drawRegin; //显示区域 CPoint startPos; //鼠标左键按下时的位置 CPoint prePos; //保留上次鼠标移动的位置 CPoint endPos; //保留左键抬起时的位置 CPen pen,*pOldPen; //设置画笔 CBitmap* pScreenBitmap; //对话框中显示的全屏位图 CBitmap*& pResBitmap; //保存截图结果的位图 public: //显示位图 void drawScreenBitmap(CPaintDC* dc); public: CScreenSnapDlg(CBitmap* &bitMap,CWnd* pParent = NULL); // 标准构造函数 virtual ~CScreenSnapDlg(); // 对话框数据 enum { IDD = IDD_DIALOG1 }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 DECLARE_MESSAGE_MAP() public: virtual BOOL OnInitDialog(); afx_msg void OnPaint(); afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message); afx_msg void OnMouseMove(UINT nFlags, CPoint point); afx_msg void OnLButtonUp(UINT nFlags, CPoint point); afx_msg void OnLButtonDown(UINT nFlags, CPoint point); };
CScreenSnapDlg类的构造和析构函数主要实现了获取当前屏幕截图、设置自定义光标、画笔初始化等操作,为后续用户操作做准备。
CScreenSnapDlg::CScreenSnapDlg(CBitmap*& bitMap,CWnd* pParent /*=NULL*/) : CDialog(CScreenSnapDlg::IDD, pParent),pResBitmap(bitMap) { //取得全屏幕的位图 getScreenBitmap(); //加载光标 hCursor=LoadCursorFromFile(_T("cd_arrowcolor.ani")); m_drawRegin=false; pen.CreatePen(PS_DOT,1,RGB(43,86,170)); //cursor=LoadCursor(NULL,IDC_WAIT); } CScreenSnapDlg::~CScreenSnapDlg() { //清除全屏截图位图资源 if (pScreenBitmap != NULL) { delete pScreenBitmap; pScreenBitmap = NULL; } //删除画笔对象 pen.DeleteObject(); } // 截取全屏幕的位图,以显示在对话框中 void CScreenSnapDlg::getScreenBitmap(){ //取的屏幕分辨率 int width = ::GetSystemMetrics(SM_CXSCREEN); int height = ::GetSystemMetrics(SM_CYSCREEN); pScreenBitmap = new CBitmap(); CDC ScrDC,MemDC; ScrDC.CreateDC(_T("DISPLAY"), NULL, NULL, NULL); MemDC.CreateCompatibleDC(&ScrDC); //创建位图 pScreenBitmap->CreateCompatibleBitmap(&ScrDC,width,height); MemDC.SelectObject(pScreenBitmap); MemDC.BitBlt(0, 0, width, height,&ScrDC,0, 0,SRCCOPY); ScrDC.DeleteDC(); MemDC.DeleteDC(); }
getScreenBitmap实现了全屏截图,实现原理在VC编程实现交互式截屏的MFC DLL(一)中已经介绍,读者可以参考。