clayui

仿苹果工具栏 完美解决图标毛边(黑边)

预览:

工程下载

这个是clayui界面库的一个最新的示例,是参照objectDock做的,主要的动态效果都比较完美的实现了,使用方法也一样,直接将桌面上的图标拖进去就可以了。

先来说说图标毛边的问题吧,这个可能部分同学比较感兴趣。

当使用Gdiplus::Bitmap::FromHICON载入一个图标对象时,Gdiplus会丢失掉图标的alpha信息,导致绘制时出现毛边(黑边),我个人觉得这应该是一个BUG,下面给出解决方案

虽然Gdiplus::Bitmap::FromHICON有问题,但是Gdiplus::Bitmap::FromHBITMAP却可以正常工作,不会丢失alpha信息,那么可以先使用GetIconInfo得到图标的ICONINFO,在ICONINFO这个结构里包含有hbmColor,hbmMask这2个HBITMAP对象,hbmColor其实就是图标的图象了,hbmMask是遮罩,得到了这2个HBITMAP,那么就可以根据图标的绘制原理自己加上alpha信息了,具体代码如下:

ICONINFO icInfo = { 0 };
        if (!::GetIconInfo(hicon, &icInfo))
            return ;

BITMAP bitmap;
        GetObject(icInfo.hbmColor, sizeof(BITMAP), &bitmap);
        BITMAP bmmask;
        GetObject(icInfo.hbmMask, sizeof(BITMAP), &bmmask);

//得到遮罩的图象缓存
        BYTE* maskbits = new BYTE[bmmask.bmWidthBytes * bmmask.bmHeight];
        ::GetBitmapBits(icInfo.hbmMask, bmmask.bmWidthBytes * bmmask.bmHeight, maskbits);

//先从hbmColor创建出Bitmap对象

Gdiplus::Bitmap *pIcon = Bitmap::FromHBITMAP(icInfo.hbmColor, NULL);

BitmapData bmpData;
        Rect rect(0,0,pIcon->GetWidth(),pIcon->GetHeight());

//得到Bitmap的图像缓存,这样就可以根据遮罩来自己加入alpha信息了
        pIcon->LockBits(&rect, ImageLockModeRead, pIcon->GetPixelFormat(), &bmpData);
        BYTE* temp = (bmpData.Stride>0)?((BYTE*)bmpData.Scan0):((BYTE*)bmpData.Scan0+bmpData.Stride*(bmpData.Height-1));
        
        int stride = abs(bmpData.Stride);

//根据遮罩的图象缓存来还原图标原本的alpha信息

for ( int i = 0; i < bmpData.Height; i++)
        {
            BYTE* Bits = temp + i * stride;
            
            unsigned char* MaskBits = maskbits + (bmpData.Height - 1 - i) * bmmask.bmWidthBytes;
            int bitoffset = 0;

for ( int j = 0; j < bmpData.Width; j++ )
            {
                unsigned char Alpha = ( (*MaskBits << bitoffset ++) & 0x80 )?0:255;

if(Alpha)
                {
                    if(!Bits[j * 4 + 3])
                        Bits[j * 4 + 3] = Alpha;
                }
                else
                    Bits[j * 4 + 3] = 0;

if  ( ! (bitoffset % 8)  )
                {
                    bitoffset -= 8;
                    MaskBits++;
                }
            }
        }

delete [] maskbits;
        pIcon->UnlockBits(&bmpData);

最后这个pIcon就是含有alpha信息的图标图象了。

然后是动态效果,这个大家看工程里的代码吧,主要的实现方面的也就200多行,都在CIconFrame里,我简单说一下要点吧:

1. 在CIconFrame::OnMM里,根据鼠标与窗口的间距计算窗口的大小,这个也就是窗口随着鼠标移动而改变大小的核心所在了

2. 在CIconFrame::Update里,按照从左到右方式排列窗口,这样做窗口就会紧紧的靠在一起了

clayui 仿苹果工具栏 完美解决图标毛边(黑边)相关推荐

  1. Windows XP仿苹果工具栏—RocketDock

    找到一个windows xp仿苹果工具栏工--RocketDock,想必有所耳闻吧,试用了一下 感觉挺好,以前下过一个不能保存自定义设置,这个是可以的,跟大家分享一下吧

  2. 完美解决deepin-wine-wechat微信黑块以及聊天输入框中文字体显示为竖条的问题(亲测有效!)

    一. 解决显示微信黑块的问题 1. 安装wmctrl sudo apt-get install wmctrl 2. 使用wmctrl命令查看系统正在运行的窗口 打开微信聊天窗口后会有黑块显示,此时如下 ...

  3. html仿苹果浏览器,完美仿iPhone风格主题 领航浏览器体验

    1仿iPhone的图标式导航页 手机浏览器这个市场因其使用情况极为广泛和频繁因此吸引了无数厂商进入,不仅是传统的浏览器厂商也有许多新晋的手机软件厂商,其产品也从强调省流量.云概念.操作体验和自主核心. ...

  4. 仿苹果通知显示在图标右上角上

    您可能在遇到这样的需求时,通过搜索,看到了这篇文章.但是很抱歉,目前我也没有什么好的解决办法.而这个问题的提出,也是我的同事在偶然间提到的. 目前,我所见的小米在4.4以上的系统中提供了这样的功能,不 ...

  5. Linux kubuntu x64系统下解决QT5.12编辑菜单和工具栏不显示图标问题

    Linux kubuntu x64系统下发现QT5.12在设计视图下编辑菜单和工具栏显示图标,但是编译运行后发现菜单和工具栏不显示图标,如下图: 我的解决办法是: 1.在QT项目中,菜单和工具栏图标一 ...

  6. 完美解决Mac电脑睡眠之后苹果电脑没有声音的方法

    Mac苹果电脑睡眠再唤醒之后没有声音了怎么办?解决这个问题通常是重启一下就能解决,但是出现这种情况的原因就是因为不想重启苹果电脑,因为开了很多应用程序亦或者正在工作当中不想重启,此问题可以通过以下方法 ...

  7. android 苹果电脑底部图标滚动效果,JS实现仿苹果底部任务栏菜单效果代码

    本文实例讲述了JS实现仿苹果底部任务栏菜单效果代码.分享给大家供大家参考.具体如下: 这款仿苹果电脑的底部任务栏菜单,是纯JavaScript实现的菜单特效,鼠标放上有响应效果,菜单图标会变大,而且动 ...

  8. 仿苹果的Dock工具栏

    最近发现一款仿苹果的Dock工具栏 StandaloneStack,可以用在XP或Win7中,效果不错.留下来备用 补充:配合另外一款软件RocketDock,可以很好的模拟macOS中的Dock工具 ...

  9. 小马哥-----高仿苹果6S 主板型号A231 全网通机型刷机 完美root图与拆机主板图

    高仿苹果A系列 A236  235 231 233等等都是6735芯片 其中有两个版本是全网通4G  目前来说A233配置与做工相对其他版本来说较好.是真2g运存 1300万与500万像素 另外还有几 ...

最新文章

  1. 2.2. 对网络安全的威胁
  2. app启动流程:冷启动,热启动,暖启动
  3. Vue——显示微信用户名称中enjoin表情
  4. 使用pytorch动手实现LSTM模块
  5. 51的IO口和上拉电阻驱动
  6. 发现一个CentOS第三方源epel的仓库地址(repos.fedorapeople.org)
  7. C++:获取图片文件信息-图片名称、类型、像素宽高
  8. map 值为指针_Go sync.Map 并发效率为什么那么高?
  9. 数学建模-模糊综合评价法(评价模型)
  10. 【已失效】创维DT741-csf光猫管理员/root超级密码获取方法
  11. Relatively Prime Pairs
  12. java时区转换_java中的时区转换
  13. android删除sd卡照片恢复,手机内存清理方法及照片误删恢复方法 手机党必备
  14. 7.2—查找—Sear Insert Position
  15. 图表横坐标怎么改倾斜_Excel 图表横轴文字太长,不想让它倾斜,如何分行显示?...
  16. 管理模型 - RACI模型
  17. cubemx 配置多通道ADC进行ADC采样
  18. 埋在大学时光里的那些人
  19. python除法float float_python中的float除法和整除法
  20. MySql 如果字段为NULL则返回0

热门文章

  1. Blog5 无监督深度关键短语生成——关键代码分析3
  2. Linux C++ libdl.so dlfcn.h使用方法(dlopen()、dlsym()、dlclose()、dlerror())(用于动态链接库操作)(懒加载、立即加载)共享库符号、动态库
  3. JTable设置表头背景色
  4. Tecnomatix Plant Simulation 14 学习之路(五)
  5. Error Pe007: unrecognize token
  6. java高并发如何保证数据安全
  7. 大数据舆情监测分析工作如何有效做好的解决方案
  8. 微信小程序页面跳转三种方式
  9. 项目1 图书管理系统
  10. 使用Things 3 for Mac管理个人事务的小技巧