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