none
Windows Mobile 6.5 在.CPL程式中利用SHCreateMenuBar建立選單 RRS feed

  • 一般討論

  • 各位大大好~

    目前小弟在Windows Mobile 6.5上開發程式, 在產生menu的時候有遇到一些狀況

    專案是Win32的程式, 使用的平台是eVC4.0和VS 2005

    在寫執行檔時(副檔名是exe)menu的建立和點選沒有問題

    可是在寫控制台下的程式時(利用寫dll的專案 將副檔名換成 .cpl)

    menu可以建立, 可是按鈕都沒有作用, 只有中間的虛擬鍵盤有作用

    以下是我建立menu的方式, 不知道各位大大是否有遇過這樣的問題?

        SHMENUBARINFO mbi;
        memset(&mbi, 0, sizeof(SHMENUBARINFO));
        mbi.cbSize = sizeof(SHMENUBARINFO);
        mbi.hwndParent = hwnd;
        mbi.dwFlags = SHCMBF_HMENU;
        mbi.nToolBarId = IDR_MENU_BAR;
        mbi.hInstRes = g_hInstance;
        mbi.nBmpId = 0;
        mbi.cBmpImages = 0;   
       
        if (FALSE == SHCreateMenuBar(&mbi))
        {
            MessageBox(hwnd, L"SHCreateMenuBar Failed", L"Error", MB_OK);
        }
        g_hwndCB = mbi.hwndMB;
    • 已變更類型 bauannModerator 2010年2月3日 下午 05:46 自行解決問題
    2010年1月28日 上午 10:03

所有回覆

  • 請問您有沒有在WM_COMMAND訊息處理程序中處理功能表被使用者點中引發的訊息?
    2010年1月29日 上午 03:15
  • 有的, 可是看來在選單的地方不管怎麼點擊, 程式都收不到message, 因為點在程式的畫面上會有反應
    這是顯示訊息的code
        case WM_LBUTTONDOWN:
            MessageBox(hWnd, L"Click", NULL, 0);
            break;

    以下是註冊的code

    BOOL MenuInit(HINSTANCE hInstance)
    {
        WNDCLASS wc;
        BOOL     bSuccess;
       
        wc.style = CS_HREDRAW | CS_VREDRAW;
        wc.lpfnWndProc = (WNDPROC) TestDllDlgProc;
        wc.cbClsExtra = 0;
        wc.cbWndExtra = 0;
        wc.hInstance = hInstance;
        wc.hIcon = 0;
        wc.hCursor = 0;
        wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
        wc.lpszMenuName    = 0;
        wc.lpszClassName = (LPTSTR) L"TestDll";
       
        bSuccess = RegisterClass (&wc);
        return bSuccess;
    }

    以下是建立視窗的code
          g_hDlg = CreateWindow(_T("TestDll"), _T("TestDll"), WS_SYSMENU | WS_VISIBLE,
                      CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
                        hwndCpl, NULL, g_hInstance, NULL);

    今天有個發現, 就是不用CreateWindow的方式來建立視窗, 改用DialogBox的方式
    這樣子點擊選單就有反應

    這是因為使用CreateWindow所用的Style的關係嗎?
    2010年1月29日 上午 03:39
  • 現在有遇到另一個問題

    當我的menu有兩個pop up menu時(例如常見的 File, Edit等)

    發現右邊的按鈕按下去, 跳出的選單會和左邊的一樣......

    可是當兩邊都是按鈕時,就正常

    請問這個問題有人遇過嗎?


    另外有人知道RCDATA這個是做什麼用的嗎?

    我在Resource檔案中有看到, 不過不清楚他的作用
    2010年1月29日 上午 11:47
  • HI,

    您要處理的是WM_COMMAND訊息, 不是WM_LBUTTONDOWN訊息
    2010年1月31日 下午 12:01
  • 有的, 可是就算我沒有處理, 他一樣要出現子選單不是嗎?

    而且連最左的Start和最右邊的OK都沒有作用
    2010年1月31日 下午 03:25

  • 感謝各位大大撥空思考小弟的問題,

    目前最新狀況

    利用CreateWindow的方式所產生的cpl檔,可以有menu了~

    發現問題點在於這段程式, 當我NULL換成CreateWidnow所產生的Handle時會有這樣的問題
    // Main message loop:
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    現在目前還有的狀況是, 當建立的選單中, 最上層的兩個選單都是popup menu的時候

    右邊的按鈕按下去時, 跳出的選單會是左邊的

    而用按鍵去觸發右邊的按鈕, 跳出的選單是右邊的, 可是他的位置會出現在左邊

    左邊的按鈕都正常

    請問這和RCDATA會有關係嗎?

    我的rc檔裡頭沒有這部份
    2010年2月1日 上午 09:51
  • 更新一下最新狀況...

    今天在Windows Moblie 6.5的模擬器上和WM6.1 WM5.0的實機上測試都沒問題...

    後來才知道有問題的平台是Windows Mobile 6.5.3

    請問有人知道有Windows Mobile 6.5.3的SDK可以下載嗎?
    2010年2月2日 上午 08:34
  • Hi,
    目前WM6.5還沒有SDK,只有DTK;不過應該過一陣子就會有SDK放出來了,模擬器也會升到6.5.3的樣子。
    請注意討論區相關規則,良好的討論環境需要大家共同努力、遵守
    2010年2月3日 下午 05:46
    版主
  • 恩, 目前的狀況, 當一邊是按鈕另一邊是選單的時候是正常的

    兩邊都是選單的話, 當按下右邊的按鈕,左邊的選單會跳出來.....

    我找不到原因是什麼..

    可是當我建立一個AP的時候(上面是開啟一個dll的專案, 沒有勾選MFC or ATL)

    選單的部份就正常, 不過我有發現應用程式的專案, 他會有一個rc2的檔案產生

    我有嘗試在建立dll的專案時, 使用MFC, 然後產生一個rc2...

    不過這邊的rc2對於選單的部份似乎都沒作用(在AP的專案裡面是有作用的)

    目前懷疑是不是跟這個有關....

    到最後真的沒方法的話...

    我是有想到把一邊的選單當作按鈕, 被觸發時, 自己做一個子選單跳出來

    用來模擬選單Orz.....
    2010年2月8日 上午 09:23