有没有人试过在delphi2009中使用vclskin后.在任务栏点右键.没有系统菜单?
delphi7都行.唯一的办法就是不给标题栏换肤!!!

解决方案 »

  1.   

    我也碰到这个问题,搞了半天都不行,看来可能是VclSkin的一个BUG
      

  2.   

    后来在测试,发现只有在设置Application.MainFormOnTaskbar := True;的时候才会有这个情况发生
    还有即使没有VclSkin,在设置MainForm的BorderStyle为None的时候也没有菜单,看在MainFormOnTaskbar为False的时候是有菜单出现的,这么明显的BUG,无语。。
      

  3.   

    显示子窗口的时候用 TFORM.SHOW;若有启动皮肤则任务栏的右键不弹出菜单,我也遇到。不知道那个朋友能帮忙解决下?????????
      

  4.   

    VCLSKIN改造任务栏右键菜单显示及主菜单背景显示 
      
     
    在Delphi 2010上安装了下载的VclSkin 5.4版本后,发现激活SKIN后程序在任务栏上的右键菜单弹不出来。在盒子论坛上提问了几天也没人回,求人不如求己。翻了一下书,应该是窗口风格被改了,于是打开VclSkin的源码,搜索SetWindowLong和WS_SYSMENU,在WinSkinForm.pas中找到一过程UpdateStyle,这个过程在UnSubClass、Minimize、WMNCPaint这3个地方被用到。分析一下UpdateStyle的代码:  if false {(windowstate=swsmin)} then begin
        if (hsysmenu > 0) then
          dwstyle := dwstyle or WS_SYSMENU;作者屏蔽了窗体最小化时任务栏菜单的样式,把条件中的false去掉,果真,程序在最小化时可以点出任务栏右键菜单了。再细看这个UpdateStyle的功能,一时无法理解为什么要那样处理,干脆屏蔽整个过程,再运行程序,任务栏右键菜单OK了。VclSkin有一个问题就是主菜单和窗体外框的样式SKIN化是同时的,你不能仅选择SKIN化外框而不SKIN化主菜单。想根据状态通过OwnerDraw的方式改变主菜单背景也变得无法实现了。继续分析WinSkinForm.pas,在InitSkin过程里,我们看到这段代码:    if sMainMenu then begin
          hmenu := GetMenu(hWnd);
          if (hmenu <> 0) and (formstyle <> sfsMDIChild) then begin
            menu := TWinSkinMenu.create(self);
            menu.fsd := fsd;
            Menu.sf := self;
            MenuHeight := GetSystemMetrics(SM_CYMENU);
            if fform <> nil then menu.menu := fform.menu;
            menu.UpdataBtn;
          end;
          //.............显然,这部分就是截取主菜单的地方。屏蔽menu.UpdateBtn这句,再运行程序你就会发现主菜单有显示SKIN的菜单背景,但是菜单文字没有了。转到UpdateBtn,却没发现一点和绘制菜单背景有关系的地方,无奈,从头开始看TWinSkinMenu的代码,终于在DrawMenu过程里找到了:    if fsd.menubar.tile = 1 then
        begin
          DrawRect2(bg.canvas.handle, rc, fsd.menubar.map, fsd.menubar.r, i, 2, 0, 0, 1)
        end分析fsd.menubar.map来源,知道这个就是SKIN文件里的菜单背景。可是到现在还是没能找到禁止VclSkin自画主菜单的办法,也没有心思花时间在这上面,于是就尝试替换fsd.menubar.map。在WinSkinData.pas里,在TSkinData的private部分,增加fmainmenubg: TBitmap;在published部分里增加property MainMenuBackground: TBitmap read fmainmenubg write fmainmenubg;这样我们就可以把我们自己想要的主菜单背景传递过去了:SkinData1.MainMenuBackground := Image1.Picture.Bitmap;接下来修改TWinSkinMenu.DrawMenu,把上面if fsd.menubar.tile = 1 then那部分代码改成这样:    if fsd.menubar.tile = 1 then
        begin
          if fsd.MainMenuBackground.Empty then
            DrawRect2(bg.canvas.handle, rc, fsd.menubar.map, fsd.menubar.r, i, 2, 0, 0, 1)
          else
            DrawRect2(bg.canvas.handle, rc, fsd.MainMenuBackground, fsd.menubar.r, i, 2, 0, 0, 1);
        end
        else
        begin
          if fsd.MainMenuBackground.Empty then
            DrawRectTile(bg.canvas, rc, fsd.menubar.map, fsd.menubar.r, i, 2)
          else
            DrawRectTile(bg.canvas, rc, fsd.MainMenuBackground, fsd.menubar.r, i, 2);
        end;注意的是,传递进去的主菜单背景的高度要是2倍主菜单高度,并且背景图片纵向排列,这是因为我们是替换SKIN文件里的主菜单背景,因此图片样式要和SKIN文件里定义的一样。OK,这样,通过替换Image1的图片,我们就可以在程序运行中随时替换主菜单的背景图片了。