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

2012-03-19 21:22:59|?次阅读|上传:wustguangh【已有?条评论】发表评论

关键词:C/C++, MFC, 界面设计, 操作系统|来源:唯设编程网

4.  重写OnInitDialog初始化函数:

在对话框的初始化函数中,实现了全屏居中显示对话框的功能。

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
}

5. 修改OnPaint函数

该步骤主要实现对话框重绘时显示屏幕截图的功能。

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函数实现将位图显示到给定的设备描述表中。

6. 修改光标响应函数

该步骤实现了光标的设置功能,用户可以设置成你喜欢的光标样式。

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

7. 鼠标按下拖动时绘制选择矩形框

当鼠标按下时设置控制变量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);
}
发表评论0条 】
网友评论(共?条评论)..
VC编程实现交互式截屏的MFC DLL(二)