如何在OnPaint里用gdi+实现双缓冲画图?

wangsiyuanoo 2009-10-27 11:49:15
GDI+的初始化已经都完成了
其实我就是想在对话框上贴个bmp的背景图,但是动态读取图片路径然后再画上去的
所以想到了用gdi
可是具体怎么实现呢?
void CFirstPageDlg::OnPaint()
{
CPaintDC dc(this);
Graphics graphics;
}
...全文
1161 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhp21 2009-10-27
  • 打赏
  • 举报
回复
http://cache.baidu.com/c?m=9d78d513d99617f44fece4690d66c0666843f1132ba4a0027ea48438e3732b325016e2ac50250443939b733d47e90b4beb832b6f6d5837b7ec98db118bfc852858d97a6b6d4adb0a458404ff951b70dc7bd60db6b21ee7bda03791fad4d7de0002c8595370d4f0dd5b0a139d6be71446b9e0c616&p=893fd61485cc4bfb08e292745b53&user=baidu
WuXinyang 2009-10-27
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 wangsiyuanoo 的回复:]
引用 5 楼 wuxinyang 的回复:
C/C++ code// 创建内存DC    CClientDC dc(this);
    CDC memdc;
    memdc.CreateCompatibleDC(&dc);
    CBitmap bmp;
    CRect rc;
    GetClientRect(&rc);
    bmp.CreateCompatibleBitmap(&dc, rc.Width(), rc.H¡­

我写在:
C/C++ codevoid CFirstPageDlg::OnPaint()
{// 创建内存DC CPaintDC dc(this);//你写的时候CClientDC dc(this); CDC memdc;
memdc.CreateCompatibleDC(&dc);
CBitmap bmp;
CRect rc;
GetClientRect(&rc);
bmp.CreateCompatibleBitmap(&dc, rc.Width(), rc.Height());
memdc.SelectObject(&bmp);
bmp.DeleteObject();// 创建GDI+画图对象 Graphics graphics(memdc);
Image image( ToWChar("china.jpg"));

Point ShowMatrix[3]=
{
Point(0,0),
Point(image.GetWidth(),0),
Point(0, image.GetHeight())
};// 开始画图 graphics.DrawImage(&image, ShowMatrix,3);
dc.BitBlt(0,0, rc.Width(), rc.Height(),&memdc,0,0, SRCCOPY);// 清理内存 memdc.DeleteDC();
}
没有图片,只是一片黑。。。。
[/Quote]

你把这里的图片路径改一下啊
Image image( ToWChar("这里写你的图片路径"));
zhongxianfei 2009-10-27
  • 打赏
  • 举报
回复
因为你是gdi+的所以很简单
在onpaint中
CpaintDC dc(this);
Graphics graphics(dc.GetSafeHdc());
Image image(L"./res/XX.bmp",True));//图片在当前res文件夹中,你可以随意路径,路径正确才能显示
graphics.DraImage(&image,0,0,image.GetWidth(),image.GetHeight());//位置可以调整
这样就可以
wangsiyuanoo 2009-10-27
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wuxinyang 的回复:]
C/C++ code// 创建内存DC CClientDC dc(this);
CDC memdc;
memdc.CreateCompatibleDC(&dc);
CBitmap bmp;
CRect rc;
GetClientRect(&rc);
bmp.CreateCompatibleBitmap(&dc, rc.Width(), rc.H¡­
[/Quote]
我写在:
void CFirstPageDlg::OnPaint()
{

// 创建内存DC
CPaintDC dc(this); //你写的时候CClientDC dc(this);
CDC memdc;
memdc.CreateCompatibleDC(&dc);
CBitmap bmp;
CRect rc;
GetClientRect(&rc);
bmp.CreateCompatibleBitmap(&dc, rc.Width(), rc.Height());
memdc.SelectObject(&bmp);
bmp.DeleteObject();

// 创建GDI+画图对象
Graphics graphics(memdc);
Image image( ToWChar("china.jpg"));

Point ShowMatrix[3] =
{
Point(0, 0),
Point(image.GetWidth(), 0),
Point(0, image.GetHeight())
};

// 开始画图
graphics.DrawImage(&image, ShowMatrix, 3);
dc.BitBlt(0, 0, rc.Width(), rc.Height(), &memdc, 0, 0, SRCCOPY);

// 清理内存
memdc.DeleteDC();
}

没有图片,只是一片黑。。。。
WuXinyang 2009-10-27
  • 打赏
  • 举报
回复
突然发现,LZ结帖率65.59%....
WuXinyang 2009-10-27
  • 打赏
  • 举报
回复
多字节字符集转换成宽字节字符集,GDI+函数参数要求必须是宽字节的.

WCHAR* ToWChar(char * str)
{
//在GDI+中,有关字符的参数类型全部都是WCHAR类型
//该函数是将传统字符串进行转换
static WCHAR buffer[1024];
wcsset(buffer,0);
MultiByteToWideChar(CP_ACP, 0, str, strlen(str), buffer, 1024);
return buffer;
}
WuXinyang 2009-10-27
  • 打赏
  • 举报
回复

// 创建内存DC
CClientDC dc(this);
CDC memdc;
memdc.CreateCompatibleDC(&dc);
CBitmap bmp;
CRect rc;
GetClientRect(&rc);
bmp.CreateCompatibleBitmap(&dc, rc.Width(), rc.Height());
memdc.SelectObject(&bmp);
bmp.DeleteObject();

// 创建GDI+画图对象
Graphics graphics(memdc);
Image image( ToWChar("1.jpg"));

Point ShowMatrix[3] =
{
Point(0, 0),
Point(image.GetWidth(), 0),
Point(0, image.GetHeight())
};

// 开始画图
graphics.DrawImage(&image, ShowMatrix, 3);
dc.BitBlt(0, 0, rc.Width(), rc.Height(), &memdc, 0, 0, SRCCOPY);

// 清理内存
memdc.DeleteDC();
dkbrain 2009-10-27
  • 打赏
  • 举报
回复
void CMsgTipDlg::DrawMsg(CDC *pDC)
{
CRect rc;
GetClientRect(&rc);
CDC memDC;
memDC.CreateCompatibleDC(pDC);
CBitmap bmp;
bmp.CreateCompatibleBitmap(pDC,rc.Width(),rc.Height());
CBitmap *pOldBmp = memDC.SelectObject(&bmp);
memDC.FillSolidRect(rc,theApp.m_sysINIFile.GetMsgTipConfig().nMsgTipBkColor);

DrawGrid(&memDC,rc);//用兼容DC绘制你的图形内容
pDC->BitBlt(0, 0, rc.Width(),rc.Height(), &memDC, 0, 0, SRCCOPY) ;
pDC->SelectObject(pOldBmp);
bmp.DeleteObject();
memDC.DeleteDC();
}
liumenghappy 2009-10-27
  • 打赏
  • 举报
回复
首先给出实现的程序,然后再解释,同样是在OnDraw(CDC *pDC)中:
CDC MemDC; //首先定义一个显示设备对象
CBitmap MemBitmap;//定义一个位图对象
//随后建立与屏幕显示兼容的内存显示设备
MemDC.CreateCompatibleDC(NULL);
//这时还不能绘图,因为没有地方画 ^_^
//下面建立一个与屏幕显示兼容的位图,至于位图的大小嘛,可以用窗口的大小,也可以自己定义(如:有滚动条时就要大于当前窗口的大小,在BitBlt时决定拷贝内存的哪部分到屏幕上)
MemBitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight);

//将位图选入到内存显示设备中
//只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上
CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);
//先用背景色将位图清除干净,这里我用的是白色作为背景
//你也可以用自己应该用的颜色
MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255));
//绘图
MemDC.MoveTo(……);
MemDC.LineTo(……);

//将内存中的图拷贝到屏幕上进行显示
pDC->BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY);
//绘图完成后的清理
MemBitmap.DeleteObject();
MemDC.DeleteDC();
网上有很多例子,LZ自己再搜搜
ct025028 2009-10-27
  • 打赏
  • 举报
回复
先新建用CreateCompatibleDC建一个与显示DC相兼容的DC,将要画的内容先画在兼容DC上,最后再一次性使用BitBlt帖到显示DC中

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧