利用兼容DC创建缩略图

void CTestView::DoubleBuffer(CDC *pDC)
{
    CRect rect;//获取客户区
    GetClientRect(&rect);
    
    CDC memDC;//缓冲区设备上下文要与显示设备上下文兼容
    memDC.CreateCompatibleDC(pDC);
    
    CBitmap newBitmap, * pOldBitmap;//准备好缓冲区
    //创建和显示设备上下文客户区一致的位图,用于绘图
    newBitmap.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height());
    pOldBitmap = memDC.SelectObject(&newBitmap);//将位图选入缓冲区
    memDC.FillSolidRect(rect, pDC->GetBkColor());//填充缓冲区背景
    
    DrawTriangle(&memDC);//画三角形,缓冲区绘制完后将图像拷贝回显示设备上下文
    
    pDC->BitBlt(rect.left, rect.top, rect.Width(), rect.Height(),
        &memDC, 0, 0, SRCCOPY);
    
    memDC.SelectObject(pOldBitmap);//恢复缓冲区设备上下文
    newBitmap.DeleteObject();//释放用毕资源
    memDC.DeleteDC();


}

void CTestView::DrawTriangle(CDC *pDC)
{
    pDC->SelectStockObject(GRAY_BRUSH);//选灰色画刷
    
    for (int i = 0; i < 3; ++i) 
    {
        //3个顶点依次处理
        CString str;
        str.Format(CString("x=%d,y=%d"), p[i].x, p[i].y);
        pDC->SetTextColor(RGB(255, 0, 0));
        pDC->TextOut(p[i].x, p[i].y, str);//输出顶点实时坐标
        
        //绘制顶点的引力域
        pDC->Rectangle(p[i].x - 5, p[i].y - 5, p[i].x + 5, p[i].y + 5);
        
        //连线,画三角形
        if (i == 0)pDC->MoveTo(p[i]);
        else pDC->LineTo(p[i]);
    }
    
    pDC->LineTo(p[0]);//连最后一条边

}

void CTestView::OnDrawIcon(CDC *pDC)
{
    CClientDC dc(this);

    CDC m_compatibleDc ;
    
    if (m_compatibleDc.CreateCompatibleDC(&dc))  //判断是否创建了兼容DC 
    {
        
        CRect rect;
        GetClientRect(&rect); //获得客户区矩形的区域
        CBitmap bitmap;
        bitmap.CreateCompatibleBitmap(&dc,350,200); //获得创建兼容位图
        m_compatibleDc.SelectObject(&bitmap);//选择位图            

        //将原始设备描述表的颜色表及像素数据块拷贝到兼容设备描述表        
        m_compatibleDc.StretchBlt(0, 0, 350,200,&dc,0,0,rect.Width(),rect.Height(),SRCCOPY); 

        //将兼容DC的显示描述表数据拷贝到目的DC,即屏幕,这行必须要
        pDC->BitBlt(1000,100,rect.Width(),rect.Height(),&m_compatibleDc,0,0,SRCCOPY);

    }

}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值