如何实现多缓存绘制透明窗体?
我想把某个内存位图(如绘制时钟面板,但指针还没绘出时的位图)复制出来储存到一个HBITMAP变量中,以后刷新时直接从内存中读取提高效率。不知如何做?
曾经看到这么一个博客:http://blog.csdn.net/cometnet/article/details/6533534
不知道怎么实现的。请高手予以指点!
以下是我一个绘制透明时钟的原码:
BLENDFUNCTION m_Blend;
m_Blend.BlendOp = 0;
m_Blend.BlendFlags = 0;
m_Blend.AlphaFormat = 1;
m_Blend.SourceConstantAlpha = m_Transparence;//全局透明度
CRect rc;
this->GetWindowRect(&rc);
//绘制内存位图
HDC hdcTemp = GetDC()->m_hDC;
HDC m_hdcMemory=CreateCompatibleDC(hdcTemp);
HBITMAP hBitMap=CreateCompatibleBitmap(hdcTemp, rc.Width(), rc.Height());
SelectObject(m_hdcMemory,hBitMap);
HDC hdcScreen=::GetDC (m_hWnd);
Graphics graphics(m_hdcMemory);
Image m_Image1(ImagePath1); //钟面
Image m_Image2(ImagePath2); //时针
Image m_Image3(ImagePath3); //分针
Image m_Image4(ImagePath4); //秒针
//绘制钟面
graphics.DrawImage(&m_Image1, Rect(0, 0, rc.Width(), rc.Height()), 0, 0, m_Image1.GetWidth(), m_Image1.GetHeight(), UnitPixel, NULL);
//我想把当前仅绘制钟面的位图复制出来储存到一个HBITMAP变量中,以后刷新时直接从内存中读取提高效率。不知如何做?
//指针
int OX = (m_Image1.GetWidth())/2;
int OY = (m_Image1.GetHeight())/2;
int HourW = m_Image2.GetWidth();
int HourH = m_Image2.GetHeight();
int MinuteW = m_Image3.GetWidth();
int MinuteH = m_Image3.GetHeight();
int secondW = m_Image4.GetWidth();
int secondH = m_Image4.GetHeight();
SYSTEMTIME SystemTime;
GetLocalTime(&SystemTime);
//时针
Matrix matrixH(1,0,0,1,(float)OX,(float)OY);
matrixH.Rotate((float)SystemTime.wHour*30 + (float)SystemTime.wMinute/2);
Point pointsH[] = { Point(0, 0),Point(HourW, 0),Point(0, HourH)};
matrixH.Translate((float)-HourW/2, (float)-HourH/2);
matrixH.TransformPoints(pointsH, 3);
graphics.DrawImage (&m_Image2, pointsH, 3);
//分针
Matrix matrixM(1,0,0,1,(float)OX,(float)OY);
matrixM.Rotate((float)SystemTime.wMinute*6);
Point pointsM[] = {Point(0, 0),Point(MinuteW, 0), Point(0, MinuteH)};
matrixM.Translate((float)-MinuteW/2, (float)-MinuteH/2);
matrixM.TransformPoints(pointsM, 3);
graphics.DrawImage (&m_Image3, pointsM, 3);
//秒针
Matrix matrixS(1,0,0,1,(float)OX,(float)OY);
matrixS.Rotate((float)SystemTime.wSecond*6);
Point pointsS[] = { Point(0, 0),Point(secondW,0),Point(0,secondH)};
matrixS.Translate((float)-secondW/2, (float)-secondH/2);
matrixS.TransformPoints(pointsS, 3);
graphics.DrawImage (&m_Image4, pointsS, 3);
POINT ptWinPos={rc.left, rc.top};
SIZE sizeWindow={rc.Width(), rc.Height()};
POINT ptSrc={0, 0};
::UpdateLayeredWindow(m_hWnd, hdcScreen ,&ptWinPos, &sizeWindow,
m_hdcMemory, &ptSrc, 0, &m_Blend, ULW_ALPHA);
::SelectObject (m_hdcMemory,hBitMap);
::DeleteObject(hBitMap);
::DeleteDC(m_hdcMemory);
::ReleaseDC(m_hWnd,hdcTemp);
::ReleaseDC(m_hWnd,hdcScreen);
[解决办法]
楼主说那个博客是我的,呵呵.
sign-----------------------------------

[解决办法]
上面有点说错了。
全局保存一个m_hdcMemory,这个m_hdcMemory已经建立完位图,并且把钟面拷贝到m_hdcMemory上面了。(在初始化的时候做)
之后再OnPaint之中的时候,建立新的临时m_hdcTempMemory 只要用graphics把m_hdcMemory内容拷贝到m_hdcTempMemory 上面,再画3个指针就达到提高效率的方法了。
[解决办法]
为什么一直需要用的HDC 与graphics 放在全局变量呢。。。每次改变就不需要重新创建 效率会好一些。
为什么只弄一个HDC呢?多个的话。。 只改变个别的HDC 然后合成。。 不就是多缓冲了么?
[解决办法]
楼主终于醒悟了
别老听那些2B成天嚷嚷啥要封装啊,要封闭啊的,不要用全局啊
那些2货就他妈操蛋得很
要有全局布局思想
如果你有全局思想,还要封装个屁啊
那是给循规蹈矩的小学生的教条
是给那些脑水不够用转不过弯来的人的保护条例
同时也是一个坑
2楼的说法就很不错
所谓全局变量,用当其实,烂用不好,不用就是书呆子