VC编程实现交互式截屏的MFC DLL(二)

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源码。下面逐步介绍详细的设计步骤:

1. 增加对话框资源(Dialog)到项目件中

在资源视图Dialog节点点击右键,弹出菜单中选择"插入Dialog"增加对话框资源(Dialog)到项目的资源文件中,设置对话框属性:Border[Thin],TitleBar[False]。

如果没有资源文件,你可以添加一个。

2. 定义截屏对话框类CScreenSnapDlg

双击窗体可以快速为刚才添加的对话框资源定义关联类,取名为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);
};

3. 截屏对话框类CScreenSnapDlg的构造和析构函数:

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(一)中已经介绍,读者可以参考。

<123>
发表评论0条 】
网友评论(共?条评论)..
VC编程实现交互式截屏的MFC DLL(二)