使用UpdateLayeredWindow创建异形窗口所遇到的奇怪问题

Starmean 2010-03-11 04:22:52
以前写过一个小程序,其中使用UpdateLayeredWindow函数创建了异形窗口,当时运行一切正常,可是最近发现它不显示了,不知道什么原因。后来从网上下载了源码(一个蝴蝶小钟的那个),运行结果也是无法正常显示。其中不提示任何错误,运行正常。
主要代码如下:

RECT rc;
GetWindowRect(&rc);
const int nWidth = rc.right - rc.left;
const int nHeight = rc.bottom - rc.top;

CDC* pDC = GetDC();
CDC memDC;
memDC.CreateCompatibleDC(pDC);
CBitmap bmp;
bmp.CreateCompatibleBitmap(&memDC, nWidth, nHeight);
CBitmap *pOldBmp = memDC.SelectObject(&bmp);

Graphics graph(memDC.m_hDC);
Image img(L"e:\\a.png");
graph.DrawImage(&img, 0, 0, nWidth, nHeight);

BLENDFUNCTION blend;
blend.BlendOp = 0;
blend.BlendFlags = 0;
blend.AlphaFormat = 1;
blend.SourceConstantAlpha = 255;
POINT ptWinPos = {rc.left, rc.top};
SIZE sizeWindow = {nWidth, nHeight};
POINT ptSrc = {0,0};

DWORD dwExStyle = GetWindowLong(m_hWnd, GWL_EXSTYLE);
if((dwExStyle&0x80000) != 0x80000) SetWindowLong(m_hWnd, GWL_EXSTYLE, dwExStyle^0x80000);
BOOL bRet = UpdateLayeredWindow(m_hWnd, pDC->m_hDC, &ptWinPos, &sizeWindow, memDC.m_hDC, &ptSrc, 0, &blend, 2);

graph.ReleaseHDC(memDC.m_hDC);
memDC.SelectObject(pOldBmp);
memDC.DeleteDC();
bmp.DeleteObject();
ReleaseDC(pDC);



现在我自己摸索了一下,已经可以显示了,但中间添加了很多代码,降低了很多效率。我就不明白,这些代码以前都正常的很,为什么现在不行了?
...全文
252 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
gavin18 2010-08-16
  • 打赏
  • 举报
回复
遇到同样的问题
Starmean 2010-03-12
  • 打赏
  • 举报
回复
在色深32位下,兼容位图是最简单的,也是可以的
我上面提到过,现在自己已经可以让它显示了,就是添加了创建32位位图的代码,只是感觉这样效率可能会下降。
问题就是出在不知道什么时候,电脑被改成16位色了,我根本就没想起来,这个函数在16位色下无法正常执行,谢楼上的提醒。
flyhigh 2010-03-11
  • 打赏
  • 举报
回复
应该是你的机器显示色深不是32位。调一下显示就好了。
创建位图的时候应该创建32位位图,而不应该是兼容位图。

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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