对GDI的一点疑问?

IndependentDeveloper 2014-03-24 11:43:34
首先,我先说下我的开发环境:
并没有直接使用GDI......
使用wxWidgets做的UI界面,但wxWidgets底层使用的是GDI

需求说明:在窗口中贴一张图,当用鼠标点击图片某一部分时,该部分半透明化。
思路:直接操作图片数据修改图片对应位置的Alpha值实现透明效果。
问题:在wxWidgets中渲染图片的函数DrawBitmap底层就是调用GDI相应函数实现,而GDI貌似不支持Bitmap半透明化......

低效的实现:在wxWidgets中使用DrawBitmap渲染时构建wxBitmap( image指针 ),直接修改image对象的Alpha数据。
这种方式可以做到该效果,但是每次渲染都要创建bitmap对象,效率低的无法忍受,尤其是大图片的时候。

未完成的实现:如何直接能操作wxBitmap数据的Alpha数据,就可以在渲染时只操作指针完成渲染,但是始终没找到可行的方式。

问:GDI能否实现类似效果?是如何实现的?越详细越好!
...全文
237 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
这个问题最终自己解决了,相关代码放上一小段,有需要的自行参考! //-----获取前景图位图句柄----- m_FrontDC.SelectObject( bmp ); WXHBITMAP hbmp = m_FrontDC.GetSelectedBitmap().GetHBITMAP(); assert( hbmp ); //-----获取前景图位图数据----- BITMAP tmpBMP; memset( &tmpBMP, 0, sizeof( BITMAP ) ); GetObject( hbmp, sizeof( BITMAP ), (LPSTR)&tmpBMP ); int width = tmpBMP.bmWidth; int height = tmpBMP.bmHeight; uchar* bit = static_cast<uchar*>( tmpBMP.bmBits ); assert( tmpBMP.bmBitsPixel == 32 && width == m_PicWidth && height == m_PicHeight && bit );
赵4老师 2014-03-24
  • 打赏
  • 举报
回复
WS_EX_TRANSPARENT Specifies that a window created with this style is to be transparent. That is, any windows that are beneath the window are not obscured by the window. A window created with this style receives WM_PAINT messages only after all sibling windows beneath it have been updated.
赵4老师 2014-03-24
  • 打赏
  • 举报
回复
WS_EX_TRANSPARENT

19,468

社区成员

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

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