精华内容
下载资源
问答
  • Windows 窗体添加菜单和菜单项

    千次阅读 2016-01-21 06:34:15
    Windows 窗体上的菜单是使用 MainMenu 对象...还可以用编程方法添加菜单,方法是向 Windows 窗体添加一个或多个 MainMenu 对象并向该集合中添加 MenuItem 对象。本主题中的过程说明如何使用菜单设计器或代码创

    Windows 窗体上的菜单是使用 MainMenu 对象创建的,该对象是一个 MenuItem 对象集合。可以在设计时向 Windows 窗体添加菜单,方法是添加MainMenu 组件然后使用菜单设计器向其追加菜单项。还可以用编程方法添加菜单,方法是向 Windows 窗体添加一个或多个 MainMenu 对象并向该集合中添加 MenuItem 对象。本主题中的过程说明如何使用菜单设计器或代码创建一个名为 File 的简单菜单。

    在设计时向 Windows 窗体添加菜单

    1. 在 Windows 窗体设计器中打开要将菜单添加到的窗体。
    2. 在“工具箱”中双击 MainMenu 组件。

      一个菜单被添加到窗体中(该窗体显示文本“请在此处输入”),同时 MainMenu 组件添加到了组件栏中。

    以编程方式向 Windows 窗体添加菜单

    1. 在代码编辑器中,创建一个新公共方法,其中包含将菜单添加到窗体的代码。有关打开代码编辑器的更多信息,请参见在设计器中显示 Windows 窗体
      ' Visual Basic
      Public Sub AddMenu()
      
      End Sub
      
      // C#
      public void AddMenu(){
      
      }
      
      // C++
      public:
         void AddMenu()
         {
      
         }
      
    2. 在该方法内添加类似于以下内容的代码,以创建 MainMenu 组件的实例:
      ' Visual Basic
         Dim mnuFileMenu as New MainMenu()
         Me.Menu = mnuFileMenu
      
      // C#
         MainMenu mnuFileMenu = new MainMenu();
         this.Menu = mnuFileMenu;
      
      // C++
         MainMenu *mnuFileMenu = new MainMenu();
         this->Menu = mnuFileMenu;
      

    将 MainMenu 组件添加到 Windows 窗体后,需要向其添加菜单项。菜单设计器可让您在设计时向菜单组件添加菜单项。菜单内容保存在一个集合内,所以可在运行时通过向此集合添加 MenuItem 对象来向菜单添加菜单项。

    在设计时向菜单添加菜单项

    1. 单击 Windows 窗体上的 MainMenu 组件。

      显示文本“请在此处输入”。

    2. 单击显示的文本,然后键入所需菜单项的名称以添加它。
    3. 若要添加另一个菜单项,请单击“菜单设计器”内的另一个“请在此处输入”区域。
      • 单击当前菜单项右侧的区域以添加子菜单。

        - 或 -

      • 单击当前菜单项下方的区域,以便将另一个项添加到同一菜单中。

    以编程方式向菜单添加菜单项

    1. 如果还没有 MainMenu 组件,则向公共方法内的 Windows 窗体添加一个 MainMenu 组件,并将一个 MainMenu 类的实例分配给该窗体的Menu 属性。有关集合的更多信息,请参见对象之间的关系
      ' Visual Basic
      Public Sub AddMenuAndItems()
         Dim mnuFileMenu as New MainMenu()
         Me.Menu = mnuFileMenu
      End Sub
      
      // C#
      public void AddMenuAndItems(){
         MainMenu mnuFileMenu = new MainMenu();
         this.Menu = mnuFileMenu;
      }
      
      // C++
      public:
         void AddMenu()
         {
            MainMenu *mnuFileMenu = new MainMenu();
            this->Menu = mnuFileMenu;
         }
      
    2. 在该方法内,创建要添加到 MainMenu 对象的集合中的 MenuItem 对象:
      ' Visual Basic
         Dim myMenuItemFile as New MenuItem("&File")
         Dim myMenuItemNew as New MenuItem("&New")
      
      // C#
         MenuItem myMenuItemFile = new MenuItem("&File");
         MenuItem myMenuItemNew = new MenuItem("&New");
      
      // C++
         MenuItem *myMenuItemFile = new MenuItem(S"&File");
         MenuItem *myMenuItemNew = new MenuItem(S"&New");
      
      注意   默认情况下,MainMenu 对象不包含菜单项,所以添加的第一个菜单项成为菜单标题。这就是 myMenuItemFile 的 Text属性设置为 &File 的原因。
    3. 在该方法内,分配顶级菜单项并向其添加后面的菜单项:
      ' Visual Basic
         mnuFileMenu.MenuItems.Add(myMenuItemFile)
         myMenuItemFile.MenuItems.Add(myMenuItemNew)
      
      // C#
         mnuFileMenu.MenuItems.Add(myMenuItemFile);
         myMenuItemFile.MenuItems.Add(myMenuItemNew);
      
      // C++
         mnuFileMenu->MenuItems->Add(myMenuItemFile);
         myMenuItemFile->MenuItems->Add(myMenuItemNew);
      
      注意   若要创建子菜单,可将 MenuItem 对象添加到父 MenuItem 的 MenuItems 属性中。对于上面的示例,如果希望将第三个菜单项 (myMenuItemFolder) 作为第二个菜单项 (myMenuItemNew) 的子菜单添加,则应包括下列代码行:
      ' Visual Basic
      Dim myMenuItemFolder as New MenuItem("&Folder")
      myMenuItemNew.MenuItems.Add(myMenuItemFolder)
      
      // C#
      MenuItem myMenuItemFolder = new MenuItem("&Folder");
      myMenuItemNew.MenuItems.Add(myMenuItemFolder);
      
      // C++
      MenuItem *myMenuItemFolder = new MenuItem(S"&Folder");
      myMenuItemNew->MenuItems->Add(myMenuItemFolder);
      

      菜单项也可在创建时动态添加,属性也是这样,可在创建和添加菜单项时设置。例如,若要向上面的集合中添加第四个菜单项,请输入下列代码:

      ' Visual Basic
      mnuFileMenu.MenuItems.Add("Save &As")
      
      // C#
      mnuFileMenu.MenuItems.Add("Save &As");
      
      // C++
      mnuFileMenu->MenuItems->Add("Save &As");
      

    有关向 MenuItems 集合中添加菜单项时动态创建菜单项的更多信息,请参见 Menu.MenuItemCollection 类

    向菜单项添加功能

    最后,建立菜单结构后,需要为菜单项提供功能。通常需要通过 MenuItem.Click 事件的事件处理程序做到这一点。有关事件处理程序的更多信息,请参见 Windows 窗体中事件处理程序的介绍

    展开全文
  • vc ATL外壳编程添加windows右键菜单

    热门讨论 2011-01-20 20:47:22
    类似于winrar的功能,右键单击txt文件,弹出的右键菜单添加了一个菜单项,用于显示文件名。
  • Windows外壳扩展编程添加右键菜单  在Windows下的一些软件提供了这样的功能:当安装了这些软件之后,当在Windows的Explore中鼠标右键单击文件或者文件夹后,在弹出菜单中就会多出与该软件操作相关的菜单项,...

    Windows外壳扩展编程之添加右键菜单


        在Windows下的一些软件提供了这样的功能:当安装了这些软件之后,当在Windows的Explore中鼠标右键单击文件或者文件夹后,在弹出菜单中就会多出与该软件操作相关的菜单项,点击该项就会激活相应的程序对用户选中的文件进行相应的操作。例如安装了Winzip之后,当用户选中一个文件夹后单击右键,在弹出菜单中就会多出一个Add To Zip和一个 Add To xxx.zip的选项,其中xxx为选中的文件夹的名称。只要单击上面的两个菜单项中的一个,就可以方便的压缩目录了。这样的功能称为Windows外壳扩展(Shell Extensions)
      外壳扩展概述

      下面是与外壳扩展相关的三个重要术语:
      (1)文件对象(File Object)
         文件对象是外壳中的一项,大家最熟识的文件对象是文件和目录,此外,打印机、控制面板程序、共享网
           络等也都是文件对象。
      (2)文件类(File Class)
           文件类是具有某种共同特性的文件对象的集合,比如,扩展名相同的文件属于同一文件类。
      (3)处理程序(Handler)
         处理程序是具体实现某个外壳扩展的代码。

      Windows支持七种类型的外壳扩展(称为Handler),它们相应的作用简述如下:
      (1)Context menu handlers向特定类型的文件对象增添上下文相关菜单;
      (2)Drag-and-drop handlers用来支持当用户对某种类型的文件对象进行拖放操作时的OLE数据传输;
      (3)Icon handlers用来向某个文件对象提供一个特有的图标,也可以给某一类文件对象指定图标;
      (4)Property sheet handlers给文件对象增添属性页,属性页可以为同一类文件对象所共有,也可以给一个
           文件对象指定特有的属性页;
      (5)Copy-hook handlers在文件夹对象或者打印机对象被拷贝、移动、删除和重命名时,就会被系统调用,
           通过为Windows增加Copy-hook handlers,可以允许或者禁止其中的某些操作;
      (6)Drop target handlers在一个对象被拖放到另一个对象上时,就会被系统被调用;
      (7)Data object handlers在文件被拖放、拷贝或者粘贴时,就会被系统被调用。

      Windows的所有外壳扩展都是基于COM(Component Object Model) 组件模型的,外壳是通过接口(Interface)来访问对象的。外壳扩展被设计成32位的进程中服务器程序,并且都是以动态链接库的形式为操作系统提供服务的。因此,如果要对Windows的用户界面进行扩充的话,则具备写COM对象的一些知识是十分必要的。

      写好外壳扩展程序后,必须将它们注册才能生效。所有的外壳扩展都必须在Windows注册表的HKEY_CLASSES_ROOT\CLSID键之下进行注册。在该键下面可以找到许多名字像{0000002F-0000-0000-C000-000000000046}的键,这类键就是全局唯一类标识符。每一个外壳扩展都必须有一个全局唯一类标识符,Windows正是通过此唯一类标识符来找到外壳扩展处理程序的。在类标识符之下的InProcServer32子键下记录着外壳扩展动态链接库在系统中的位置。与某种文件类型关联的外壳扩展注册在相应类型的shellex主键下。如果所处的Windows操作系统为Windows NT,则外壳扩展还必须在注册表中的HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\ShellExtensions\Approved主键下登记。

      注册表HKEY_CLASSES_ROOT主键下有几个特殊的子键,如*、Folder、Drive以及Printer。如果把外壳扩展注册在*子键下,那么这个外壳扩展将对Windows中所有类型的文件有效;如果把外壳扩展注册在Folder子键下,则对所有目录有效。

        上面提到的在Windows Explore中在鼠标右键菜单中添加菜单项(我们成为上下文相关菜单)的操作属于外壳扩展的第一类,即Context menu handlers向特定类型的文件对象增添上下文相关菜单。要动态地在上下文相关菜单中增添菜单项,可以通过写Context Menu Handler来实现。
      编写Context Menu Handler必须实现IShellExtInit和IContextMenu两个接口。除了IUnknown接口所定义的函数之外,Context Menu Handler还需要用到QueryContextMenu、InvokeCommand和GetCommandString这三个非常重要的成员函数。

      (1)QueryContextMenu函数:每当系统要显示一个文件对象的上下文相关菜单时,它首先要调用该函数。为了在上下文相关菜单中添加菜单
     项,我们在该函数中调用InsertMenu函数。

      (2)InvokeCommand函数:当用户选定了某个Context Menu Handler登记过的菜单项后,该函数将会被调用,系统将会传给该函数一个指向
     LPCMINVOKECOMMANDINFO结构的指针。在该函数中要执行与所选菜单项相对应的操作。

      (3)GetCommandString函数:当鼠标指针移到一个上下文相关菜单项上时,在当前窗口的状态条上将会出现与该菜单项相关的帮助信息,此
     信息就是系统通过调用该函数获取的。

        下面我通过具体的例程来说明编写一个比较完整的上下文菜单程序,这个程序是一个文件操作程序,当安装并注册了外壳扩展的服务器动态连接库之后,当选择一个或者多个文件并单击鼠标右键后,在右键菜单中就会多出一个“执行文件操作”的上下文菜单,点击菜单就会弹出相应的程序执行文件操作。
        在整个程序的编写中,外壳扩展的服务器动态连接库是有Delphi4.0编写的,而动态连接库调用的文件操作程序是由VB6编写的。下面首先介绍服务器动态连接库的编写:
        服务器动态连接库的工程文件内容如下:

    library contextmenu;
    uses
      ComServ,
      ContextMenuHandler in 'Unit2.pas';

    exports
       DllGetClassObject,
       DllCanUnloadNow,
       DllRegisterServer,
       DllUnregisterServer;

    {$R *.TLB}

    {$R *.RES}

    begin

    end.
    //--------------------------------------------------------------------
       // 将工程文件保存为contextmenu.dpr。
       // 服务器动态连接库的单位文件内容如下:   

    unit ContextMenuHandler;

    interface
       uses Windows,ActiveX,ComObj,ShlObj,Classes;

    type
       TContextMenu = class(TComObject,IShellExtInit,IContextMenu)
       private
          FFileName: array[0..MAX_PATH] of Char;
       protected
          function IShellExtInit.Initialize = SEIInitialize; // Avoid compiler warning
          function SEIInitialize(pidlFolder: PItemIDList; lpdobj: IDataObject;
                   hKeyProgID: HKEY): HResult; stdcall;
          function QueryContextMenu(Menu: HMENU; indexMenu, idCmdFirst, idCmdLast,
                   uFlags: UINT): HResult; stdcall;
          function InvokeCommand(var lpici: TCMInvokeCommandInfo): HResult; stdcall;
          function GetCommandString(idCmd, uType: UINT; pwReserved: PUINT;
                   pszName: LPSTR; cchMax: UINT): HResult; stdcall;
    end;

    const

       Class_ContextMenu: TGUID = '{19741013-C829-11D1-8233-0020AF3E97A9}';

    {全局唯一标识符(GUID)是一个16字节(128位)的值,它唯一地标识一个接口(interface)}
    var
       FileList:TStringList;
       Buffer:array[1..1024]of char;

    implementation

    uses ComServ, SysUtils, ShellApi, Registry,UnitForm;

    function TContextMenu.SEIInitialize(pidlFolder: PItemIDList; lpdobj: IDataObject;
       hKeyProgID: HKEY): HResult;
    var
       StgMedium: TStgMedium;
       FormatEtc: TFormatEtc;
       FileNumber,i:Integer;
    begin
       file://如果lpdobj等于Nil,则本调用失败
       if (lpdobj = nil) then begin
          Result := E_INVALIDARG;
          Exit;
       end;

       file://首先初始化并清空FileList以添加文件
       FileList:=TStringList.Create;
       FileList.Clear;
       file://初始化剪贴版格式文件
       with FormatEtc do begin
          cfFormat := CF_HDROP;
          ptd := nil;
          dwAspect := DVASPECT_CONTENT;
          lindex := -1;
          tymed := TYMED_HGLOBAL;
       end;
       Result := lpdobj.GetData(FormatEtc, StgMedium);
       if Failed(Result) then Exit;

       file://首先查询用户选中的文件的个数
       FileNumber := DragQueryFile(StgMedium.hGlobal,$FFFFFFFF,nil,0);
       file://循环读取,将所有用户选中的文件保存到FileList中
       for i:=0 to FileNumber-1 do begin
          DragQueryFile(StgMedium.hGlobal, i, FFileName, SizeOf(FFileName));
          FileList.Add(FFileName);
          Result := NOERROR;
       end;

       ReleaseStgMedium(StgMedium);
    end;

    function TContextMenu.QueryContextMenu(Menu: HMENU; indexMenu, idCmdFirst,
       idCmdLast, uFlags: UINT): HResult;
    begin
       Result := 0;
       if ((uFlags and $0000000F) = CMF_NORMAL) or
          ((uFlags and CMF_EXPLORE) <> 0) then begin
     // 往Context Menu中加入一个菜单项
        InsertMenu(Menu, indexMenu, MF_STRING or MF_BYPOSITION, idCmdFirst,
          PChar('执行文件操作'));
     // 返回增加菜单项的个数
       Result := 1;
       end;
    end;

    function TContextMenu.InvokeCommand(var lpici: TCMInvokeCommandInfo): HResult;
    var
    //   sFile:TFileStream;
       charSavePath:array[0..1023]of char;
       sSaveFile:String;
       i:Integer;
       F: TextFile;
       FirstLine: string;
    begin
       // 首先确定该过程是被系统而不是被一个程序所调用
       if (HiWord(Integer(lpici.lpVerb)) <> 0) then
       begin
          Result := E_FAIL;
          Exit;
       end;
       // 确定传递的参数的有效性
       if (LoWord(lpici.lpVerb) <> 0) then begin
          Result := E_INVALIDARG;
          Exit;
       end;

       file://建立一个临时文件保存用户选中的文件名
       GetTempPath(1024,charSavePath);
       sSaveFile:=charSavePath+'chen0001.tmp';

       AssignFile(F,sSaveFile);   { next file in Files property }
       ReWrite(F);
       file://将文件名保存到临时文件中
       for i:= 0 to FileList.Count -1 do begin
          FirstLine:=FileList.Strings[i];
          Writeln(F,FirstLine);    { Read the first line out of the file }
       end;
       CloseFile(F);
       file://调用文件操作程序对用户选中的文件进行操作
       ShellExecute(0,nil,'c:\FileOP.exe',PChar(sSaveFile),charSavePath,SW_NORMAL);

       Result := NOERROR;
    end;

     

    function TContextMenu.GetCommandString(idCmd, uType: UINT; pwReserved: PUINT;
             pszName: LPSTR; cchMax: UINT): HRESULT;
    begin
       if (idCmd = 0) then begin
       if (uType = GCS_HELPTEXT) then
          {返回该菜单项的帮助信息,此帮助信息将在用户把鼠标移动到该菜单项时出现在状态条上。}
          StrCopy(pszName, PChar('点击该菜单项将执行文件操作'));
          Result := NOERROR;
       end
       else
          Result := E_INVALIDARG;
    end;

     

    type
       TContextMenuFactory = class(TComObjectFactory)
       public
       procedure UpdateRegistry(Register: Boolean); override;
    end;

     

    procedure TContextMenuFactory.UpdateRegistry(Register: Boolean);
    var
       ClassID: string;
    begin
       if Register then begin
          inherited UpdateRegistry(Register);
          ClassID := GUIDToString(Class_ContextMenu);
          CreateRegKey('*\shellex', '', '');
          CreateRegKey('*\shellex\ContextMenuHandlers', '', '');
          CreateRegKey('*\shellex\ContextMenuHandlers\OpenWithWordPad', '', ClassID);

        file://如果操作系统为Windows NT的话
          if (Win32Platform = VER_PLATFORM_WIN32_NT) then
          with TRegistry.Create do
          try
             RootKey := HKEY_LOCAL_MACHINE;
             OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions', True);
             OpenKey('Approved', True);
             WriteString(ClassID, 'Context Menu Shell Extension');
          finally
             Free;
          end;
       end
       else begin
          DeleteRegKey('*\shellex\ContextMenuHandlers\FileOpreation');
          DeleteRegKey('*\shellex\ContextMenuHandlers');
    //      DeleteRegKey('*\shellex');
          inherited UpdateRegistry(Register);
       end;
    end;

     

    initialization
     TContextMenuFactory.Create(ComServer, TContextMenu, Class_ContextMenu,
       '', 'Context Menu Shell Extension', ciMultiInstance,tmApartment);

    end.

        将该单位文件保存为unit2.pas,文件同contextmenu.dpr位于同一个目录下。
        打开Delphi,选菜单中的 file | open project 打开contextmenu.dpr文件,然后选 Project | build contextmenu菜单项编译连接程序,如果编译成功的话,会建立一个contextmenu.dll的动态连接库文件,这个文件就是服务器动态连接库。

        然后注册contextmenu.dll,注册的方法是,在DOS窗口中进入Windows\system子目录,输入 Regsvr32 x:\xxxxx\contextmenu.dll 。其中x:\xxxxx\为Contextmenu.dll文件所在的驱动器和目录。如果注册成功,系统会弹出对话框,显示 DllRegisterServer in ..\xxx\contextmenu.dll Success 提示注册成功。
        注册成功后,再选择文件并单击右键,就会发现在弹出菜单中多了一个“执行文件操作”的菜单项,点击该项,系统就会调用FileOP.exe执行文件操作。


    展开全文
  • Windows基础编程 -菜单

    千次阅读 2016-02-17 23:53:03
    前言windows窗口创建以后,往里头添加菜单就是一件很有意义的事了,菜单关联的东西有 -它本身是一种资源,有菜单句柄HMENU需要维护 -菜单点击会发出消息,需要知道怎么维护相关的消息处理函数 分类>窗口顶层菜单、弹...

    前言

    windows窗口创建以后,往里头添加菜单就是一件很有意义的事了,菜单关联的东西有
            -它本身是一种资源,有菜单句柄HMENU需要维护
            -菜单点击会发出消息,需要知道怎么维护相关的消息处理函数
    

    分类

    >窗口顶层菜单、弹出式菜单、系统菜单
    

    窗口顶层菜单

    资源

    窗口顶层菜单是一个窗口下的一级菜单,把它称作一个菜单栏(menu bar)更为合适,而里头的任何一项(没有下一级)可以称为
        一个菜单项(menu item),有下一级的被称为子菜单或者下拉菜单(即菜单项是一个新的菜单)
    -通过函数CreateMenu我们可以创建一个窗口顶层菜单,它会返回一个HMENU的句柄,这就是这个顶层菜单的资源,这是编写程序
      创建菜单的方式,还有一种图形化创建资源文件的方式创建,这里你获得的只是一个标识,如IDR_MENU
    -然后通过函数AppendMenu/DeleteMenu可以往这个资源里添加东西了,这里头可以添加的东西有菜单项(menu-item,对应一个
    menu-item id),下拉菜单或子菜单(对应menu handle),这两类的添加方式会导致调用AppendMenu函数第二个第三个参数的区分.
    -最后,我们可以用下面3种方式将这个菜单和对应的窗口关联起来,
        --a.使用SetMenu将HMENU和HWND进行绑定
        --b.在设计窗口类时,对应的LPCTSTR lpszMenuName填上,这里你需要用添加资源文件进行填充
            ((MAKEINTERSOURCE(IDR_MENU)).
        --c.创建窗口时,对应的HMENU hMenu填上,如果菜单是资源文件的方式添加的,可以用LoadMenu获得菜单句柄.
    

    消息

    窗口顶层菜单会产生两种消息WM_COMMAND,WM_INITMENUPOPUP,分别对应点击menu-item和弹出式菜单时产生,如果是WM_COMMAND
    消息,我们可以通过菜单项的id来区分到底是那一项被点击了,而WM_INITMENUPOPUP消息,则通过菜单句柄来区分了。
    

    菜单项操作函数

        menu-item可以通过函数CheckMenuItem    和EnableMenuItem来修改,它们分别有两种用法注意区分。
    

    弹出式菜单

    弹出式菜单无法直接和窗口挂钩,它只能选择1.加入窗口菜单。2.通过消息触发(比如右键响应).
    

    资源

        -首先,我们可以用过函数CreatePopupMenu函数创建一个弹出式菜单。
        -然后,依旧通过AppendMenu往这个菜单里头添加东西。
        -最后,还是通过AppendMenu把它挂到窗口菜单或系统菜单下,或者通过在消息响应中调用TrackPopupMenu函数让它短暂的
            出现在客户区任何地方,再通过点击对它进行响应,注意TrackPopupMenu是个阻塞函数。
    

    消息

        点击弹出式菜单是会产生WM_INITPOPUPMENU消息.
    

    系统菜单

    系统菜单是固定的,它无法被创建,只能获取,但是你可以修改它,基本上我们不会去改变它。
    

    资源

        -通过GetSystemMenu可以获得系统菜单的句柄。
        -依旧通过AppendMenu/DeleteMenu可以修改里头的菜单项,有意思的是你把里面的东西删完了,你会发现这个窗口无法放大,
            缩小,移动和关闭了。
    

    消息

        点击系统菜单会产生WM_SYSCOMMAND消息,而诸如最大化,最小化,关闭按钮其实都是系统菜单里的菜单项,所以点击关闭按钮
            其实并不会产生WM_DESTROY消息,而是产生WM_SYSCOMMAND的消息。
    

    菜单消息传递的参数

    type wParam lParam note
    WM_COMMAND (HI)0 (LO)菜单项ID NULL windows里用的最多的消息
    WM_INITMENUPOPUP 菜单句柄 菜单索引和菜单标识
    WM_SYSCOMMAND (LO)菜单项ID 光标位置
    展开全文
  • vc ATL 外壳编程添加windows右键菜单

    千次阅读 2011-01-20 20:43:00
    这个程序在codeproject上面有,我也已经上传了,具体的流程和网页中的大致是一样的 程序的功能是:类似于winrar的功能,你右键单击一个文件,在弹出的右键菜单添加了一个选项,可以在弹出的右键菜单...

    程序在

    http://www.programbbs.com/doc/473.htm

    这个网页里面说了具体的流程,但好像通过上面网页的方法好像在vc中有点编译不过去,加了头文件也不行。

    这个程序在codeproject上面有,我也已经上传了,具体的流程和网页中的大致是一样的

    程序的功能是:类似于winrar的功能,你右键单击一个文件,在弹出的右键菜单中添加了一个选项,可以在弹出的右键菜单选项中实现具体的功能。

    例如,我添加的是:右键单击txt文件,在弹出的菜单中添加了一项,点击这一项之后弹出一个对话框显示当前txt的文件名。

    如果你不想再txt的右键菜单添加这一项,而是其他的文件格式,则修改工程中的SimpleShlExt.rgs这个文件,打开这个文件,可以看到文件的内容如下:

    HKCR

    {

        NoRemove CLSID

        {

            ForceRemove {5E2121EE-0300-11D4-8D3B-444553540000} = s 'SimpleShlExt Class'

            {

                InprocServer32 = s '%MODULE%'

                {

                    val ThreadingModel = s 'Apartment'

                }

            }

        }

        NoRemove txtfile

        {

            NoRemove ShellEx

            {

                NoRemove ContextMenuHandlers

                {

                    ForceRemove SimpleShlExt = s '{5E2121EE-0300-11D4-8D3B-444553540000}'

                }

            }

        }

    }

    这个文件具体的内容我也不是很明白,但NoRemove txtfile这里很关键,这个txtfile是注册表中HKEY_CLASSES_ROOT子项中的一项,注册表必须要有这一项,运行这个程序后才能将txt文件的右键菜单添加一项。如果注册表中没有这一项,需要在注册表中添加这一项,我博客中有文档讲到,代码也已经上传了,就不再多说。

    但这个程序是一个ATL的工程,生成的是一个dll文件,我对ATL一点都不了解,本来还想把这个工程添加到我的MFC的工程中去,但是最后不知道如何在我们的代码中调用这个工程的函数或是借口而不了了之,望有能者赐教也。

    下面是一些ATL的程序文档,感觉还是很有用的。

    http://www.vckbase.com/document/viewdoc/?id=682

    http://blog.sina.com.cn/s/blog_4baa485201000938.html

    http://www.vckbase.com/document/viewdoc/?id=211

     

     

     

     

    展开全文
  • 好久没有学windows编程了,今天计算机图形学作业用到了mfc,发现各种不适应。好了,不吐槽了,come on baby! 1. 首先新建当文档程序,并命名为Demo1,如图:一路next。。,注意点如图:2. 接下来添加菜单项操作过程...
  •  这个函数就是添加菜单项的函数。  InsertMenu(hmenu, uMenuIndex, MF_SEPARATOR | MF_BYPOSITION, 0, NULL);这一句加的是一个空菜单,显示时就是一个菜单里的分隔符。  SetMenuItemBitmaps(hSubMenu, 2, MF_...
  • Windows下的一些软件提供了这样的功能:当安装了这些软件之后,当在Windows的Explore中鼠标右键单击文件或者文件夹后,在弹出菜单中就会多出与该软件操作相关的菜单项,点击该项就会激活相应的程序对用户选中的...
  • LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) { // 注释掉这句: AtlCreateEmptyMenuBar(m_hWnd); // 1 在Menu资源中加入菜单资源IDR_LEFT, 包含2个菜单项: ID_N
  • 转自:VC Windows shell扩展编程(为系统右键菜单添加二级菜单傻瓜教程) 2012-08-07 16:26 650人阅读 评论(0) 收藏 举报 windowsshell编程扩展nullstring 打开VC6,新建一个工程,选ATL COM APPWIZARD,...
  • 关于注册表添加右键菜单的测试。 我在win7 64位 日语系统里面发现很奇怪的结论。 不知道是不是我弄错了。 1: [HKEY_CLASSES_ROOT\Directory\Background\shell\test] 1)右键桌面空白区域 有效果 2)...
  • Windows 外壳扩展编程--添加系统右键菜单运行指定程序(delphi)--实例
  • RegisterClass (&wndclass)) { MessageBox (NULL, TEXT ("This program requires Windows NT!"), szAppName, MB_ICONERROR) ; return 0 ; } hwnd = CreateWindow (szAppName, TEXT ("Menu Demonstration"), WS_...
  • 在工程文件下右键-添加-资源,选择menu 新建即可进入可视化的菜单资源编辑
  • Windows 编程

    2018-10-30 20:44:00
    Windows 编程 在WndProc函数中 最好不要出现WM_SYSCOMMAND消息, 如果有了这个消息, 可能我们对创建出来的窗口就什么都管不了了, 因为我们阻碍了DefWndProc函数去处理它 不在.rc文件中添加弹出式...
  • {添加菜单项} AppendMenu(hm, MFT_STRING, IDM_2, 'Menu&2'); AppendMenu(hm, MFT_STRING, IDM_3, 'Menu&3'); end; {收到 WM_COMMAND 消息时需要做的工作} procedure OnCommand(h: HWND; wParam: Integer); var ...
  • C#+MFC添加修改windows窗口系统菜单 自己有修改菜单的需求,但是作为一个刚接触编程不久的小白在修改系统菜单这方面很吃力,最终是做了增加删除的效果但是还有子菜单和图标的问题没有解决,记录一下,效果图: ...
  • Windows编程基础--第10节 MFC菜单

    千次阅读 2017-10-26 22:45:08
    MFC菜单(CMenu)MFC菜单分为两类: 窗体菜单 快捷菜单:又叫弹出菜单,或者上下文菜单 1、创建项目打开vs2010...2、创建系统菜单切换到资源视图,右击我们的项目“day10”,选择添加资源,出现如下界面: 选择

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 437
精华内容 174
热门标签
关键字:

windows编程添加菜单