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. java并发编程实战:第十六章----Java内存模型
  2. 点滴印象中的周其凤校长
  3. 玩转SpringCloud Spring Cloud 微服务
  4. QT中添加背景图片,颜色,以及字体等
  5. 维特比算法—打字输入预测
  6. Jsp、Servlet
  7. linux闹钟软件下载,电量充满警示闹铃
  8. 详解 Qt 串口通信程序全程图文 (5)
  9. vb.net 同时给多个属性赋值_系统小技巧:充分用好文件的时间属性
  10. hadoop2.4的伪集群的搭建
  11. 工程选择LibGdx--开发环境搭建Strut2教程-java教程
  12. PictureBox滚动条、鼠标中轴滚动
  13. docker.[7] 数据卷容器
  14. 机器学习笔记(12)— K均值算法
  15. No Bootable Device 问题解决(由于误删ESP分区导致)
  16. mkv转mp4,mkv转换mp4格式
  17. unity自动生成敌人_Unity学习笔记一:敌人模块和敌人生成器模块脚本编写思路梳理(1)...
  18. 联想用u盘重装系统步骤_如何制作U盘系统盘以及U盘安装操作系统的方法
  19. 【秋招】搜狐游戏_数据分析岗_面试题整理
  20. 美食app的UI设计

热门文章

  1. 选择云服务器那些参数应该怎么选择?
  2. 2022亚马逊云科技re:Invent全球大会即将启幕
  3. 在php中将5按位与运算,PHP 5.2和PHP 5.3中对大整数的按位运算(Bitwise operations on big integers in PHP 5.2 and PHP 5.3)...
  4. CSDN博客:在非登录状态下通过百度搜索引擎查看自己的博客
  5. tensorflow玻尔兹曼机_受限玻尔兹曼机(Restricted Boltzmann Machine)
  6. Aristophanes ‘The Knights‘
  7. ion框架 android,模块化 GKI 的 ION 堆
  8. 下载 电子商城类型htm模板_【精品素材】 3C数码科技手机产品首页装修psd模板PC端店铺首页设计素材_高清psd图片素材 1920*5054像素...
  9. 【springmvc+mybatis项目实战】杰信商贸-11.购销合同业务
  10. 年轻时不做会后悔的八件事!