我想做个类似于Windows开始菜单功能的小软件,主要是在托盘位置弹出一个动态创建的菜单,另外还有一个类似于《360桌面》一样的界面(但没那么漂亮)。
首先来看看Windows的开始菜单我自己写的程序是如下的样式:我主要有两点难题没法解决。
1.要在菜单上显示图标:
光是显示个图标这没多大难处,但网上也有很多列子。可问题是这些图表从哪里获取呢?
虽然说大部分图标都是SHELL32.dll里的,但是我必须得在里面一个个去提取图标吗?而且毕竟还有很多菜单项目的图标是在对应的程序文件里的,甚至还有很多文件的图标是随意指定的。再者如果要分情况一个个去提取图标似乎太复杂了。
windows的桌面管理进程explorer.exe是怎么做的呢?2.在开始菜单的某个项目上点击鼠标右键会弹出新的菜单,原来的菜单也不关闭。这是种什么原理呢?是响应某个消息吗?

解决方案 »

  1.   

    1 http://www.vckbase.com/english/code/listview/attach_system_image_list.shtml.htm
      

  2.   

    2 我认为那个不是Track出来的menu。还能拖item呢!自己做吧!
      

  3.   

    SHGetFileInfo真的很好很强大。SHFILEINFO sfi;
    HICON icon_large,icon_small;
    if(SUCCEEDED(::SHGetFileInfo(path,0,&sfi,sizeof(SHFILEINFO),SHGFI_ICON | SHGFI_LARGEICON)))
    {
    icon_large=sfi.hIcon;
    }if(SUCCEEDED(::SHGetFileInfo(path,0,&sfi,sizeof(SHFILEINFO),SHGFI_ICON | SHGFI_SMALLICON)))
    {
    icon_small=sfi.hIcon;
    }
      

  4.   

    调试了下Explorer发现还真不是Track出来的菜单,开始菜单的程序菜单原来是个工具条。看样子得另想办法了。
      

  5.   

    或则VS2008 + SP1补丁也可,微软在VS2008后就加入了BCG皮肤库
      

  6.   

    摆弄了一天终于能自绘菜单了。窗口菜单需要窗口自己的MeasureItem,DrawItem里绘制,右键菜单要在派生类里这两个函数里绘制。网上教程似乎都没点明这一点。做的好辛苦,自绘控件真不是件人做的事。MeasureItem中菜单宽度自适应文字的关键并不是获得一个DC,而是获取菜单字体。获取字体使用函数:SystemParametersInfo(SPI_GETNONCLIENTMETRICS,....