首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

怎么实现多缓存绘制透明窗体

2013-01-07 
如何实现多缓存绘制透明窗体?我想把某个内存位图(如绘制时钟面板,但指针还没绘出时的位图)复制出来储存到

如何实现多缓存绘制透明窗体?
我想把某个内存位图(如绘制时钟面板,但指针还没绘出时的位图)复制出来储存到一个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楼的说法就很不错

所谓全局变量,用当其实,烂用不好,不用就是书呆子

热点排行