2012-03-19 21:22:59|?次阅读|上传:wustguangh【已有?条评论】发表评论
关键词:C/C++, MFC, 界面设计, 操作系统|来源:唯设编程网
在对话框的初始化函数中,实现了全屏居中显示对话框的功能。
BOOL CScreenSnapDlg::OnInitDialog() { CDialog::OnInitDialog(); // TODO: 在此添加额外的初始化 //居中全屏显示 MoveWindow(0,0,GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN)); return TRUE; // return TRUE unless you set the focus to a control // 异常: OCX 属性页应返回 FALSE }
该步骤主要实现对话框重绘时显示屏幕截图的功能。
void CScreenSnapDlg::OnPaint() { CPaintDC dc(this); // device context for painting // TODO: 在此处添加消息处理程序代码 // 不为绘图消息调用 CDialog::OnPaint() drawScreenBitmap(&dc); } //显示位图 void CScreenSnapDlg::drawScreenBitmap(CPaintDC* dc){ //获取图片内容 BITMAP bm; pScreenBitmap->GetBitmap(&bm); CDC dcMem; //创建兼容DC dcMem.CreateCompatibleDC(GetDC()); CBitmap *pOldBitmap=(CBitmap*)dcMem.SelectObject(pScreenBitmap); //获取客户区的大小范围 CRect lRect; this->GetClientRect(&lRect); //在Static控件上显示位图 dc->StretchBlt(lRect.left ,lRect.top ,lRect.Width(),lRect.Height(), &dcMem,0 ,0,bm.bmWidth,bm.bmHeight,SRCCOPY); dcMem.SelectObject(&pOldBitmap); }
drawScreenBitmap函数实现将位图显示到给定的设备描述表中。
该步骤实现了光标的设置功能,用户可以设置成你喜欢的光标样式。
BOOL CScreenSnapDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) { BOOL result; if(hCursor) { ::SetCursor(hCursor); result = TRUE; } else { result = CDialog::OnSetCursor(pWnd, nHitTest, message); } return result; //return CDialog::OnSetCursor(pWnd, nHitTest, message); }
当鼠标按下时设置控制变量m_drawRegin为true,鼠标释放时将控制选区绘制的变量m_drawRegin设置为false,通过R2_NOTXORPEN绘制模式进行选区绘制,由于point传入的鼠标位置是屏幕坐标,在绘制选区时还是用了ScreenToClient函数将屏幕坐标转换成窗口坐标,绘图时还用到了DPToLP将设备坐标转换成逻辑坐标。
//绘制矩形 void CScreenSnapDlg::drawRect(CRect& rect,CDC* pDC){ pDC->MoveTo(rect.TopLeft()); pDC->LineTo(rect.TopLeft().x,rect.BottomRight().y); pDC->LineTo(rect.BottomRight()); pDC->LineTo(rect.BottomRight().x,rect.TopLeft().y); pDC->LineTo(rect.TopLeft()); } //鼠标左键移动事件 void CScreenSnapDlg::OnMouseMove(UINT nFlags, CPoint point) { CClientDC dc(this); CPoint ptInClient=point; ScreenToClient(&ptInClient); //将屏幕坐标转换成窗口坐标 //显示鼠标拖动区域 if(m_drawRegin){ dc.DPtoLP(&ptInClient); dc.SetROP2(R2_NOTXORPEN); pOldPen=dc.SelectObject(&pen); //选择新画笔 CRect rec1(startPos,prePos); drawRect(rec1,&dc); CRect rec2(startPos,ptInClient); drawRect(rec2,&dc); dc.SelectObject(&pOldPen); //还原原来的画笔 //保存当前的鼠标位置 prePos=ptInClient; } CDialog::OnMouseMove(nFlags, point); } //鼠标左键按下事件 void CScreenSnapDlg::OnLButtonDown(UINT nFlags, CPoint point) { m_drawRegin=true; //打开显示鼠标拖动区域的开关 startPos=point; ScreenToClient(&startPos); //将屏幕坐标转换成窗口坐标 prePos=point; ScreenToClient(&prePos); //将屏幕坐标转换成窗口坐标 CDialog::OnLButtonDown(nFlags, point); }