说来惭愧,简单的画图竟然还这么的坎坷,不过找到解决的办法和弄清楚一些画图的情况也算是今天的一点收获吧,不多说,往下看。。
说到用GDI画矩形,线,点,椭圆,肯定立马就能想到在Onpaint中用 CPaintDC 或者 CWindowsDC 或者 CDC去画,是的,很easy,easy的我竟然选择了用内存DC去画,结果就是显示不到对话框界面上,下边是我的代码:
CWindowDC cdc(this); //得到系统DC。其实用CPaintDC也成,客户端DC也行
CDC MemDc;
MemDc.CreateCompatibleDC(&cdc); //创建内存DC
MemDc.Rectangle(10, 10, 50,50);//画矩形,当然这样画出来的矩形默认是白色的不透明的黑边框矩形
cdc.BitBlt(0,0, rect.Width(), rect.Height(), &MemDc, 0,0, SRCCOPY);//将画在内存中的矩形拷贝到对话框界面上显示出来
上边这五行代码多么的简明扼要,清楚明白,但是运行将看到对话框上没画出任何东西,你的对话框上还是一如既往的干净,具体原因不是很清楚,但BitBlt执行成功了,说明根本就没有画到内存里?这个暂且不要去纠结,总之现在界面上空白一片,怎么解决,才是最关心的问题,下来说两种解决办法:
1、给内存DC在建立一个兼容的画布、位图,如下:
CWindowDC cdc(this);
CRect rect;
GetClientRect(&rect);//得到客户端的大小
CDC MemDc;
MemDc.CreateCompatibleDC(&dc); //创建内存DC
CBitmap MemBitmap;
MemBitmap.CreateCompatibleBitmap( &cdc, rect.Width(), rect.Height());//创建一张和内存DC兼容的画布
CBitmap *pOldBit = MemDc.SelectObject( &MemBitmap );//将画布选入内存DC中,然后进行画图
MemDc.FillSolidRect( 0, 0, rect.Width(), rect.Height(), RGB(0,255,0) );//先将画布刷上背景色,类似于OnEraseBkgnd(CDC* pDC)
MemDc.Rectangle(10, 10, 50,50);//画矩形
dc.BitBlt(0,0, rect.Width(), rect.Height(), &MemDc, 0,0, SRCCOPY);//拷贝到对话框上
MemDc.SelectObject( pOldBit );
MemBitmap.DeleteObject();
MemDc.DeleteDC();
如此一来,矩形框立马就显示在你的界面上,妥妥的,这其实就是所谓的双缓冲,一般解决画图时屏幕闪烁的问题,但是一般都是话一张位图的时候为了防止闪烁才回去使用双缓冲,此处就是画个矩形框而已,这样用的话简直大材小用,那么接下来就是第二种解决办法。
2、直接用OnPaint()里边的CPaintDC dc(this);画:
CPaintDC dc(this);
dc.Rectangle(10, 10, 50,50);
就两句,我擦。。简直不忍直视。。对了,就这样,画线,画矩形,画椭圆核心就这两句。简单到爆。至于其他的写字,设字体大小,设背景色,线宽,边框颜色等如下选用:
CPen pen(PS_SOLID, 3, RGB(255, 0, 0)); // 创建一个宽度为3的红色实线画笔
CPen* oldPen = dc.SelectObject(&pen);//将画笔选入到设备中
CBrush brush(RGB(0,0,0));//创建一个黑色画刷
CBrush* oldBrush = dc.SelectObject(&brush);//将画刷选入设备中
CBrush* pBrush = CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));//创建一个透明画刷
CBrush* oldBrush = dc.SelectObject(pBrush);//选入
CFont font;
font.CreatePointFont( 100, _T("Arial"));//设置字体为Arial,大小为100
CFont* oldFont = dc.SelectObject(&font);//选入
dc.SetBkColor(RGB( 255, 255, 255));//设置字体背景颜色
dc.SetTextColor(RGB( 255, 255, 255));//设置字体颜色
dc.SetBkMode(TRANSPARENT);//设置字体背景色为透明,一旦设置透明,上边设置字体背景颜色将无效
dc.TextOut( 10, 10, _T("Hello"));//坐标(10,10)处,用上边设置的字体写一个字符串“Hello”
//画矩形, 画线, 画椭圆,画点等
dc.SelectObject(oldPen);//将原来的画笔重新选入设备中
dc.SelectObject(oldBrush);//下同
.....