Windows CE定制 - 开始菜单 问题

fhjfhj520   2008-4-18 16:04 楼主
91program blog 中这样写到


具体的修改,主要是修改WinCE500\PUBLIC\SHELL\OAK\HPC\EXPLORER\TASKBAR\stmenu.cpp文件。
由于是在Windows CE内核源代码的基础之上进行修改的,所以没有将全部代码贴出来。将修改的主要部分内容,进行了说明。其中所需要的部分变量需要自己根据需要自定义。

第一:修改stmenuData数组
例如增加:{IDM_MOBILE, IDS_MOBILE, IDI_MOBILE, STATIC_ITEM, 0, 0, 0},
等,需要多个菜单的,可增加多行的内容

第二:为菜单定义背景图,并加载背景图:hbmStMenuBackGround

第三:在StartMenu_DrawMenuItem()的ODA_SELECT分支中,增加菜单背景绘制过程
if(hbmStMenuBackGround)
{
    HDC hdcmem = CreateCompatibleDC(lpdis->hDC);
    if(hdcmem)
    {
        SelectObject(hdcmem, hbmStMenuBackGround);

        BitBlt(lpdis->hDC, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, hdcmem, rc.left, rc.top, SRCCOPY);
        DeleteDC(hdcmem);
    }
}

第四:在StartMenu_ProcessCommand()函数中,处理菜单响应

    case IDM_MOBILE:
        info.cbSize = sizeof(info);
        info.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_FLAG_NO_UI;
        info.lpVerb = NULL;
        info.lpFile = L"\\ResidentFlash\\MyMobileApp.exe";
        info.lpParameters = NULL;
        info.lpDirectory = NULL;
        info.nShow = SW_SHOW;
        info.hInstApp = NULL;
        ShellExecuteEx(&info);
    break;

最后:删除背景图资源
新添加菜单的图标和字符串,在下列两个文件中修改的
WINCE600\PUBLIC\SHELL\OAK\HPC\EXPLORER\MAIN\explorerbase.rc 文件和resource.h文件

按照此方法做了,但是现在的问题是开始菜单的背景没有修改成功,新添加的菜单也没有图标和字符显示

回复评论 (17)

LZ是如何编译的?
点赞  2008-4-19 18:16
哦,用的build and sysen之后又make Run-Time Image之后图标和字符串添加进去了,
但是背景怎么还是灰色的?

把菜单背景绘制过程添加在分支中:如下
  1. ODA_SELECT

  2.         case ODA_SELECT:               
  3.                                         if(hbmStMenuBackGround)
  4.                                         {
  5.                                                 HDC hdcmem = CreateCompatibleDC(lpdis->hDC);
  6.                                                  if(hdcmem)
  7.                                                  {
  8.                                                      SelectObject(hdcmem, hbmStMenuBackGround);
  9.                                                      BitBlt(lpdis->hDC, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, hdcmem, rc.left, rc.top, SRCCOPY);
  10.                                                      DeleteDC(hdcmem);
  11.                                                  }
  12.                                         }
  13.                                                
  14.            if ((lpdis->itemState & ODS_SELECTED) && lpst->idMenuCmd)
  15.             {
  16.                 HBRUSH hbrush = CreateSolidBrush(GetSysColor(COLOR_HIGHLIGHT));
  17.                 SetTextColor(lpdis->hDC, GetSysColor(COLOR_HIGHLIGHTTEXT));
  18.                 FillRect(lpdis->hDC, &rc, hbrush);
  19.                 DeleteObject((HGDIOBJ)hbrush);
  20.             }
  21.             else
  22.             {
  23.                 HBRUSH hbrush = CreateSolidBrush(GetSysColor(COLOR_MENU));
  24.                 SetTextColor(lpdis->hDC, GetSysColor(COLOR_MENUTEXT));
  25.                 FillRect(lpdis->hDC, &rc, hbrush);
  26.                 DeleteObject((HGDIOBJ)hbrush);
  27.             }

  28.             break;

点赞  2008-4-21 09:53
WinCE500\PUBLIC\SHELL\OAK\HPC\EXPLORER\TASKBAR目录,需要从console中单独编译,否则不可能产生正确的东东。

编译完后,将生成的三个文件(好像是)复制到工程的目标文件目录,再make Run-Time Image。
点赞  2008-4-21 13:07
基本上ok了,只是开始菜单的分阁线有点难看,再研究研究
你啥时候把修改状态栏背景的方法教教,~嘿嘿~~
点赞  2008-4-21 16:19
是啊,要首先查看dir看build all是不是编译了,如果没有就单独编译才行。

第三步,有一个像素的内存泄漏,91program太懒了。
点赞  2008-4-22 09:03
哦 ,没看出来,怎么讲:有一个像素的内存泄漏?
点赞  2008-4-22 13:40
我也没有看出来内存泄漏啊!
点赞  2008-4-22 13:46
我编译用的build and sysen ,就是花费的时间久
点赞  2008-4-22 15:25
如果只修改WinCE500\PUBLIC\SHELL\OAK\HPC\EXPLORER\TASKBAR中的代码,不用build and sysen 。

单独编译这个目录,将生成的文件复制到工程的目标目录,然后make Run-Time Image
点赞  2008-4-22 16:53
哦,
91program,说说怎么修把状态栏的背景修改成和桌面一致的吧,找了两天资料了,没能找到
点赞  2008-4-22 17:47
状态栏?是任务栏吗???
点赞  2008-4-22 20:39
恩,是的
点赞  2008-4-22 22:51
if(hbmStMenuBackGround)
{
    HBITMAP hOldBitmap = NULL;
    HDC hdcmem         = CreateCompatibleDC(lpdis->hDC);
    if(hdcmem)
    {
        hOldBitmap = (HBITMAP)SelectObject(hdcmem, hbmStMenuBackGround);
        BitBlt(...);
        SelectObject(hdcmem, hOldBitmap);
        DeleteDC(hdcmem);
    }
}

创建的新内存DC中,默认有一个像素的BITMAP,所以每次选新的bitmap时,要把旧的保存起来,每次删除时,要把这个一像素的old bitmap选回去再删除。
点赞  2008-4-22 22:53
你是说没有删除hOldBitmap吗?呵呵
点赞  2008-4-22 23:02
没仔细看清楚你的代码,是呀,这里应该把旧的先保存起来,不然,hdcmem也是删不掉的
点赞  2008-4-23 09:40
什么呀
点赞  2008-5-1 08:53
支持搂主,收藏
点赞  2008-5-1 18:39
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复