现在我用一张PNG的图片做表盘
用GDI+画了指针
也基本实现了功能
就是指针在转动时 会有轻微的闪烁
我在网上看了不少VC6下GDI+的双缓冲 好多讲得不详细 基本是基于SDI的
恕小弟愚笨 不会应用在基于对话框的程序中
望各位赐教一二 临帖涕零
用GDI+画了指针
也基本实现了功能
就是指针在转动时 会有轻微的闪烁
我在网上看了不少VC6下GDI+的双缓冲 好多讲得不详细 基本是基于SDI的
恕小弟愚笨 不会应用在基于对话框的程序中
望各位赐教一二 临帖涕零
{};class CView : public CWnd
{};都在 DC 上绘图 双缓存不过是创建与屏幕DC兼容的后台DC在后台DC中绘制好后再Blt到屏幕DC
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
CDC memDC; // 缓存DC
CDC selDC; // 选入图片的DC
HBITMAP hBmp;
HBITMAP hOldBMP;
memDC.CreateCompatibleDC(&dc);
selDC.CreateCompatibleDC(&dc);
hBmpMem = CreateCompatibleBitmap(dc.m_hDC, m_nCx, m_nCy); // 画背景到缓存DC
memDC.FillSolidRect(0, 0, m_nCx, m_nCy, RGB(0, 0, 0));
// 画图片到缓存DC
hBmpMem = LoadBitmap(NULL, MAKEINTRESOURCE(ID_BMP1));
hOldBMP = memDC.SelectObject(hBmpMem);
memDC.BitBlt(0, 0, m_nCx, m_nCy, &selDC, 0, 0, SRCCOPY); // 从缓存画到窗口DC
dc.BitBlt(0, 0, m_nCx, m_nCy, &memDC, 0, 0, SRCCOPY);
// 清除GDI对象
}
{
return TRUE;
}
CDC memDC; // 创建 缓存CDC
CBitmap memBitMap; // 创建 缓存位图
memDC.CreateCompatibleDC(pDC); // 使内存CDC适应客户区域的CDC
memBit.CreateCompatibleBitmap(pDC,rectArea.Width(),rectArea.Height());
CBitmap* pOldBit = memDC.SelectObject(&memBitMap); // 选入位图
memDC.SetBkMode(TRANSPARENT); dc.BitBlt(......,memDC.......); // 将缓存中的图像贴到客户区域 // 这是单缓存的 再加个CDC往 memDC上贴就是双缓存了,不过感觉你这个用不到,双缓存做游戏可以
CDC memDC; // 创建 缓存CDC
CBitmap memBitMap; // 创建 缓存位图
memDC.CreateCompatibleDC(pDC); // 使内存CDC适应客户区域的CDC
memBit.CreateCompatibleBitmap(pDC,rectArea.Width(),rectArea.Height());
CBitmap* pOldBit = memDC.SelectObject(&memBitMap); // 选入位图
memDC.SetBkMode(TRANSPARENT); dc.BitBlt(......,memDC.......); // 将缓存中的图像贴到客户区域 // 这是单缓存的 再加个CDC往 memDC上贴就是双缓存了,不过感觉你这个用不到,双缓存做游戏可以
CDC memDC; // 创建 缓存CDC
CBitmap memBitMap; // 创建 缓存位图
memDC.CreateCompatibleDC(pDC); // 使内存CDC适应客户区域的CDC
memBit.CreateCompatibleBitmap(pDC,rectArea.Width(),rectArea.Height());
CBitmap* pOldBit = memDC.SelectObject(&memBitMap); // 选入位图
memDC.SetBkMode(TRANSPARENT); dc.BitBlt(......,memDC.......); // 将缓存中的图像贴到客户区域 // 这是单缓存的 再加个CDC往 memDC上贴就是双缓存了,不过感觉你这个用不到,双缓存做游戏可以
Bitmap bmp = new Bitmap(600, 600);2、获取这块内存画布的Graphics引用:
Graphics g = Graphics.FromImage(bmp);3、在这块内存画布上绘图:
g.FillEllipse(brush, i * 10, j * 10, 10, 10);4、将内存画布画到窗口中
this.CreateGraphics().DrawImage(bmp, 0, 0);
我现在学用GDI+
有没有GDI+实现的方法
毕竟VC6也是通过设置一系列的东西才支持GDI+吧
双缓冲方面就不能像.NET里面那样容易实现了
网上其他人的方法 貌似只有一个版本
难道VC6 就没有更好的实现GDI+双缓冲的办法了?using namespace Gdiplus;
Graphics graphics( dc.m_hDC );
graphics.SetSmoothingMode(SmoothingModeAntiAlias);//平滑处理 抗锯齿
Image image(L"E:\\图片相关\\表盘1.png");
graphics.DrawImage(&image, 220,220);
Pen pen(ARGB(0xFFFF4500),9);
SolidBrush brush(ARGB(0xFFB0C4DE));
pen.SetStartCap(LineCapRoundAnchor);
pen.SetEndCap(LineCapArrowAnchor);
double radian = 3.14159265358979323846 / 180.0;
REAL fla;
fla=(400-180)*m_fgicret+180;//(范围最大值-范围最小值)*数据百分比+范围最小值
graphics.DrawLine(&pen, 348, 347, 348 + (INT) (100 * cos(fla * radian)),
347 + (INT) (100 * sin(fla * radian)));
graphics.FillEllipse(&brush,343,342,10,10);在这个代码的基础上 用双缓冲可以实现不?
Bitmap bmp = new Bitmap(600, 600); 就出问题了
我是在VC6的环境下 (不知道是不是这个缘故)
没用成这个方法 所以跑到CSDN来问了
http://www.vckbase.com/document/viewdoc/?id=1811
网上所说的 VC6下GDI+双缓冲 基本都是这个版本
而且是在SDI下实现的
DLG下如何做呢??
不要嫌我笨
OnPaint中绘制所有的东西(Onpaint中的代码里面并不会用到双缓存);在图像改变的时候再使用缓存;比如MouseDown、MouseMove中,根据你的情况应该是在中标指针变化的时候使用(可能是你的OnTime事件当中)。
不过效果并不很好 貌似只有一点点进步
是没用好 还是什么原因啊
搞不明白
CPaintDC dc(this); // device context for paintingdc.BitBlt(0,50,861,705,&m_memDC,0,50,SRCCOPY);//双缓冲用CPaintDC 跟CClientDC 有区别不?