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);
}