[界面问题]问一个双缓冲贴图的问题,请前辈们赐教!

huixch 2010-06-04 06:03:54
问一个关于自绘界面的问题,可能很简单。我在用双缓冲贴图自绘按钮(圆角)时候总是在按钮的四个角出现四个黑点。我知道出现黑点是因为我在贴图时候做了透明处理,皮肤中的背景(粉红色)去掉以后就成黑色了。出现黑色是因为CreateCompatibleBitmap这个函数创建位图的背景是黑色的,可是我不知道如何让它透明。或者是我贴图的方法不对,不应该这样贴图。请大家帮忙看看!
先贴上图片:
皮肤资源:

效果图:

按钮放大后:


下面是代码:
LRESULT CSkinButton::OnPaint(HWND hWnd)
{
HDC hDC, hMemDC, hMemDCBuf;
RECT rtRect;
HBITMAP hBitmap, hSkinBmp;
PAINTSTRUCT psPaint;

hDC = BeginPaint(hWnd, &psPaint); //目的DC
GetClientRect(hWnd, &rtRect);
hMemDC = CreateCompatibleDC(NULL);
hBitmap = CreateCompatibleBitmap(hDC, rtRect.right - rtRect.left, rtRect.bottom - rtRect.top); //这里的背景是黑色,不知道怎么弄成透明的?
hMemDCBuf = CreateCompatibleDC(NULL); //创建第二个内存DC
SelectObject(hMemDC, hBitmap); //将空白位图选进第一缓冲区
hSkinBmp = (HBITMAP)LoadImage(NULL, "Skin.bmp", IMAGE_BITMAP, 0, 0, LR_DEFAULTSIZE | LR_LOADFROMFILE);
SelectObject(hMemDCBuf, hSkinBmp);

TransparentBlt(hMemDC, 0, 0, 3, 4, hMemDCBuf, 0, 43, 3, 4, RGB(0xFF, 0, 0xFF));
TransparentBlt(hMemDC, 3, 0, rtRect.right - 6, 4, hMemDCBuf, 3, 43, 7, 4, RGB(0xFF, 0, 0xFF));
TransparentBlt(hMemDC, rtRect.right -3, 0, 3, 4, hMemDCBuf, 10, 43, 3, 4, RGB(0xFF, 0, 0xFF));

TransparentBlt(hMemDC, 0, rtRect.top + 4, 3, rtRect.bottom - 7, hMemDCBuf, 0, 47, 3, 14, RGB(0xFF, 0, 0xFF));
TransparentBlt(hMemDC, 3, rtRect.top + 4, rtRect.right - 6, rtRect.bottom - 7, hMemDCBuf, 3, 47, 7, 14, RGB(0xFF, 0, 0xFF));
TransparentBlt(hMemDC, rtRect.right - 3, 4, 3, rtRect.bottom - 7, hMemDCBuf, 10, 47, 3, 14, RGB(0xFF, 0, 0xFF));

TransparentBlt(hMemDC, 0, rtRect.bottom - 3, 3, 3, hMemDCBuf, 0, 61, 3, 3, RGB(0xFF, 0, 0xFF));
TransparentBlt(hMemDC, 3, rtRect.bottom - 3, rtRect.right - 6, 3, hMemDCBuf, 3, 61, 7, 3, RGB(0xFF, 0, 0xFF));
TransparentBlt(hMemDC, rtRect.right - 3, rtRect.bottom - 3, 3, 3, hMemDCBuf, 10, 61, 3, 3, RGB(0xFF, 0, 0xFF));

BitBlt(hDC, 0, 0, rtRect.right - rtRect.left, rtRect.bottom - rtRect.top, hMemDC, 0, 0, SRCCOPY);

DeleteDC(hMemDCBuf);
DeleteDC(hMemDC);
DeleteObject(hSkinBmp);
DeleteObject(hBitmap);
EndPaint(hWnd, &psPaint);
return TRUE;
}
...全文
133 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
向立天 2010-06-04
  • 打赏
  • 举报
回复
如果你想做异型控件(非矩形)
需要用SetWindowRgn设置一下
cattycat 2010-06-04
  • 打赏
  • 举报
回复
转到VC/MFC版去问吧,那里有高手。这个不太清楚了。
arong1234 2010-06-04
  • 打赏
  • 举报
回复
我觉得原因是你需要绘制的是矩形,而你实际只绘制了圆角矩形所致。为了避免黑色,你需要把背景色(粉红色)当作前景色去绘制圆角矩形之外、矩形之内的那四个角
huixch 2010-06-04
  • 打赏
  • 举报
回复
问题解决了!结贴!
在内存DC画图的时候不做透明处理,带着背景色(粉红)画进去,显示的时候做透明处理!
已经试了,可以解决,但是不知道我这样做是不是合理,反正能用就行,哈哈!
huixch 2010-06-04
  • 打赏
  • 举报
回复
看来还是我没有动脑子好好想,我觉得在内存DC里画图的时候不做透明处理,还把粉红色背景画上,等到现实的时候再做透明处理,呵呵!先试试再说!
Eleven 2010-06-04
  • 打赏
  • 举报
回复
向立天 2010-06-04
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 lthyxy 的回复:]
xianglitian
是VC版的高手,问他吧
[/Quote]
谢谢抬爱
高手不敢当
只是提个建议而已
liutengfeigo 2010-06-04
  • 打赏
  • 举报
回复
xianglitian
是VC版的高手,问他吧
bruce2012 2010-06-04
  • 打赏
  • 举报
回复
用个mask位图就解决了

15,979

社区成员

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

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