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

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;
}
...全文
239 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位图就解决了
内容概要:本文系统研究了基于CNN-SVM的卷积神经网络与支持向量机融合的数据分类预测方法,聚焦其在工业故障识别中的应用,提供了完整的Matlab代码实现。通过CNN提取输入数据的深层空间特征,再由SVM进行高精度分类,充分发挥两者优势,有效提升了故障识别的准确性、鲁棒性与泛化能力。该方法特别适用于处理电力系统、机械设备等领域的高维、非线性、强噪声监测数据,在变压器故障诊断、轴承缺陷识别等场景中具有重要应用价值。文档还整合了机器学习、深度学习、图像处理、路径规划、电力系统优化等多个前沿科研方向的技术资源,配套大量Matlab/Simulink仿真案例与Python代码,全面支持科研复现与工程实践。; 适合人群:具备一定编程基础,熟练掌握Matlab或Python语言,从事电气工程、自动化、人工智能、机械故障诊断等相关领域研究的研发人员及高校研究生; 使用场景及目标:① 实现工业设备的状态监测与多类别故障分类;② 深入理解CNN与SVM融合模型的设计原理与工程实现细节;③ 借助所提供的丰富算法案例开展科研复现、模型优化与系统仿真验证; 阅读建议:建议按照文档目录结构系统化学习,结合百度网盘提供的完整代码资源进行动手实践,重点关注CNN特征提取层与SVM分类器之间的数据接口设计与参数调优策略,同时可延伸学习文中涉及的其他智能算法及其在电力系统、信号处理等领域的交叉应用,全面提升科研创新能力。

15,977

社区成员

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

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