正在开发中的游戏有个全屏功能--可以在window桌面背景上运行,就像一些视频播放器在桌面背景上播放一样的,花了个上午整了个Demo放出来留个纪念。

实现功能:显示图标,双击图标执行相应的程序,右击图标弹出该图标对应得菜单,点击非图标区则弹出桌面菜单。需要完整工程可以点此下载:DesktopWindow.rar。程序效果图如下:

在这个程序里,定义了一个XShellItem的数据结构,保持桌面图标的iten id(ITEMIDLiST),图标以及文字图标。

),
        name(L""),
        hit(FALSE),
        icon(NULL),
        nameIcon(NULL) ...{
        }
        ~XShellItem() ...{
        }
    };

然后定义一个数组CAtlArray<XShellItem> itemArray;用来保存所有桌面图标对象,在InitShellFolder()中对它进行初始化:

)));

                g2->DrawString(item.name, item.name.GetLength(), &font_i, rc, &sf, &br_t);

                item.nameIcon = nameIcon;
                item.nameW = NAME_WIDTH;
                item.nameH = NAME_HEIGHT;

                delete g2;
            }

            DestroyIcon(hIcon);
            DeleteObject(hBmp);
            DestroyIcon(stSHFileInfo.hIcon);
        }

        return TRUE;
    }

注意这里面并没有设置图标对象的位置,因为当窗口改变大小的时候,相应地也要调整图标的描绘位置,所以图标位置是在SetShellItemPosition()中动态调整的.

;
            }

            WTL::CRect rect;
            GetClientRect(&rect);
            y += iconSpacingHeight;
            if (y + iconSpacingHeight >= rect.bottom) ...{
                x += iconSpacingWidth;
                y = OFFSET_Y;
            }
        }
    }

描绘图标就很简单了,呵呵,不贴了,下面来说说弹出图标菜单,执行图标对应的程序以及弹出桌面菜单。

执行图标对应的程序,需要以先前保持的图标itemid作为参数,代码如下:

    void RunShellItem(ITEMIDLIST* pIID)
    ...{
        SHELLEXECUTEINFO info;
        info.cbSize = sizeof(SHELLEXECUTEINFO);
        info.fMask = SEE_MASK_INVOKEIDLIST;
        info.hwnd = m_hWnd;
        info.lpVerb = NULL;
        info.lpFile = NULL;
        info.lpParameters = NULL;
        info.lpDirectory = NULL;
        info.nShow = SW_SHOWNORMAL;
        info.hInstApp = NULL;
        info.lpIDList = pIID;
        ShellExecuteEx(&info);
    }

弹出桌面菜单的代码如下:

, lp);
    }

弹出图标菜单的代码如下,这里定义了两个全局的IContextMenu对象:
static IContextMenu2*  g_pIContext2 = NULL;
static IContextMenu3*  g_pIContext3 = NULL;

以便在消息回调函数中使用。具体代码如下:

 : TRUE);
            break;
        default:
            break;
        }

        return ::CallWindowProc((WNDPROC) GetProp(hWnd, TEXT("oldWndProc")), hWnd, message, wParam, lParam);
    }
jpg改rar 

模拟window桌面实现的更多相关文章

  1. Ext js框架模拟Windows桌面菜单管理模板

    一款超炫的后台,Ext模拟Windows桌面,Ext经典浅蓝风格,功能非常强大,包括最大化.最小化.状态栏.桌面图标等,不过需要非常懂Ext脚本的才可驾驭它.​ 1.图片 ​2. [代码][HTML] ...

  2. WPF案例 (四) 模拟Windows7桌面任务栏

    原文:WPF案例 (四) 模拟Windows7桌面任务栏 这个程序模彷了Windows7的桌面任务栏,当在桌面上双击某个快捷方式时,将打开一个新的子界面,并且在任务栏里创建一个链接到此界面的任务栏图标 ...

  3. 模拟window系统的“回收站”

    若要模拟window系统的“回收站”功能,具体的要求如下: 对于列表中的图片,可以通过拖动或单击“删除”的链接,以动画的方式移至“回收站”. 对于“回收站的图片”,可以通过拖动和单击“还原”的链接,以 ...

  4. js 模拟window.open 打开新窗口

    为什么要去模拟window.open() 打开一个 新的窗口呢,因为有些浏览器默认会拦截 window.open, 当需要函数中打开新窗口时,接可以使用a标签去模拟打开. /** * a模拟windo ...

  5. 打造一个window桌面应用:在线聊天对话机器人

    大家好,我是辰哥~~~ 本文目标:打造一个window桌面应用:在线聊天对话机器人. 今天辰哥教大家做一个在线聊天对话机器人桌面应用,已经打包成exe可执行文件,读者可以直接拿来使用, 先上演示图 聊 ...

  6. Delphi代码模拟“显示桌面”的功能

    今天有人问我:“用shell打开文件(显示桌面.scf)的方式还是用模拟键盘(Win+D)显示桌面”这应该有更好的方法,就搜了搜,关键字定位“ToggleDesktop”因为显示桌面.scf的内容是: ...

  7. Delphi&C#代码模拟“显示桌面”的功能(使用CreateOleObject('Shell.Application'))

    今天有人问我:“用shell打开文件(显示桌面.scf)的方式还是用模拟键盘(Win+D)显示桌面”这应该有更好的方法,就搜了搜,关键字定位“ToggleDesktop”因为显示桌面.scf的内容是: ...

  8. 一个模拟"显示桌面.scf"程序的JS小函数

    有时候我们或许有这样的一个需求,用JS模拟这样一个动作,同时按下组合快捷键:Windows旗帜键+D键,下面这个函数就可以帮到我们了. function f_ToggleDesktop() { var ...

  9. C++在WINdow桌面绘制文字图形

    [起因] 最近碰到一个项目,需要在电脑左面显示一些信息,因此在网上找了一些资料,成功实现在桌面绘制信息. [代码] #include "stdafx.h" #include < ...

随机推荐

  1. android:scaleType=&quot;matrix&quot;布局文件载入图片时候的显示方式

    android:scaleType="center" 以原图的几何中心点和ImagView的几何中心点为基准,按图片的原来size居中显示,不缩放,当图片长/宽超过View的长/宽 ...

  2. Objective-c的@property 详解

    转自:http://www.cnblogs.com/andyque/archive/2011/08/03/2125728.html 之前很多网友对我翻译的教程中的Property的使用感到有些迷惑不解 ...

  3. spring 发布 Jax-Ws Service (一)

    1.maven依赖: <dependency> <groupId>org.springframework.ws</groupId> <artifactId&g ...

  4. sass初学入门笔记(一)

    我本身是个新手,一边学sass一边记下的笔记,可能有点罗嗦,但是复习起来的话还是比较全面直观的.当然,最重要的还是去实践,实践得真理 其它 CSS 预处理器语言: CSS 预处理器技术已经非常的成熟, ...

  5. 区别:Use MFC In A Shared DLL 和 Use MFC In A Static Library

    摘自:Programming Windows with MFC, 2nd Edition Choosing Use MFC In A Shared DLL minimizes your applica ...

  6. mysql5.5和5.6版本间的坑

    mysql 5.5 int类型 设置不为null,无填充,添加新数据会自动填充0 而5.6同样的配置新建数据没值时,不让添加 5.5 datetime 不能设置默认时间(可以通过某些复杂的方式,这里说 ...

  7. lua工具库penlight--05日期和时间

    创建和显示时间 Date类提过了简洁的使用date和time的方法.它依赖于os.date和os.time. Date对象可以通过table创建,如果os.date,同时提过了获取和设置date 成员 ...

  8. [Linux]gcc/libc/glibc

    转自:http://blog.csdn.net/weiwangchao_/article/details/16989713 1.gcc(gnu collect compiler)是一组编译工具的总称. ...

  9. 《C++ Primer》笔记-#include,#ifndef

    1.理解 #include 指示是怎样工作的 #include 设 施是 C++ 预处理器的一部分.预处理器处理程序的源代码,在编译器之前运行. C++ 继承了 C 的非常精细的预处理器.现在的 C+ ...

  10. 微信小程序 - dialog

    实现了 标题,内容和按钮设置,可动态设置按钮,以及按钮点击事件的回调 可作为component 使用 直接上代码 //遮罩的代码 <viewclass="uiComponent uiC ...