<menu id="w8yyk"><menu id="w8yyk"></menu></menu>
  • <dd id="w8yyk"><nav id="w8yyk"></nav></dd>
    <menu id="w8yyk"></menu>
    <menu id="w8yyk"><code id="w8yyk"></code></menu>
    <menu id="w8yyk"></menu>
    <xmp id="w8yyk">
    <xmp id="w8yyk"><nav id="w8yyk"></nav>
  • 網站首頁 > 物聯資訊 > 技術分享

    積累的VC編程小技巧之標題欄和菜單

    2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀
    睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接

    1.窗口最大最小化按紐的控制

    怎樣在程序開始的時候讓它最大化?

    vc++做出來的exe文件在窗體的右上方是沒有最大化和最小化按鈕的,怎樣實現這一功能?

    如何在顯示窗口時,使最大化按鈕變灰?

     

    在App類里的C…App::InitInstance()中把m_pMainWnd->ShowWindow(SW_SHOW)改成m_pMainWnd->ShowWindow(SW_MAXIMIZE);

    在CreateWidnow時用WS_SYSMENU|WS_MINIMIZEBOX|WS_MAXIMIZEBOX 風格.

         第一種方法:

    BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) 

    if( !CFrameWnd::PreCreateWindow(cs) ) 
    return FALSE; 
    // TODO: Modify the Window class or styles here by modifying 
    //  the CREATESTRUCT cs 
    // disable the maxmini box 
    cs.style &= ~WS_MAXIMIZEBOX; 
    return TRUE; 
    }

    第二種方法:

    CMenu *pMenu=AfxGetApp()->m_pMainWnd->GetSystemMenu(FALSE); 
             int x=pMenu->GetMenuItemCount( ); 
             UINT pID=pMenu->GetMenuItemID(x-1); 
             pMenu->EnableMenuItem(pID, MF_DISABLED);

    第三種方法:

    ModifyStyle(WS_MAXIMIZEBOX, 0); 
    這個函數也可以是最大化按鈕失效! 
    并且可以在程序中動態的改變窗口的風格

     

    2.創建動態菜單

    void CMainFrame::OnSelectState(NMTOOLBAR* pnmtb, LRESULT *plr)

    {

           CMenu menu;

           if(!menu.CreateMenu())

           return;

           menu.AppendMenu(MF_STRING,0,"開始");

           menu.AppendMenu(MF_STRING,0,"結束");

           CRect rc;

           m_wndToolBar.SendMessage(TB_GETRECT, pnmtb->iItem, (LPARAM)&rc); 

           m_wndToolBar.ClientToScreen(&rc);

           menu.TrackMenu( TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_VERTICAL,

                         rc.left, rc.bottom, this, &rc);

    //     menu.DestroyMenu();

           menu.detach();

    }

     

    3.如何禁止對話框關閉按鈕和浮動工具條上的系統菜單

    1、禁止對話框中的關閉按鈕有二種方法。
    第一種方法,用ModiftMenu()涵數來實現:

    CMenu* pMenu = this->GetSystemMenu(FALSE);
    pMenu->ModifyMenu(SC_CLOSE,MF_BYCOMMAND | MF_GRAYED );

    第二種方法,用EnableMenuItem()涵數來實現:

    CMenu* pMenu = this->GetSystemMenu(FALSE);
    pMenu->EnableMenuItem( SC_CLOSE, MF_BYCOMMAND|MF_GRAYED);

    2、禁止浮動工具條上的系統菜單。
    新建一個CToolBar的派生類CxxToolBar,在新類中的左鍵雙擊(CxxToolBar::OnLButtonDblClk(...))
    和左鍵單擊(CxxToolBar:: OnLButtonDown(...))涵數中分別加入下面代碼既可:
    if (IsFloating()) //工具條正在浮動狀態中
    {
       CWnd* pMiniFrame;
       CWnd* pDockBar;

       pDockBar = GetParent();
       pMiniFrame = pDockBar->GetParent();

       //去除其上系統菜單
       pMiniFrame->ModifyStyle(WS_SYSMENU, NULL);

       //重繪工具條
       pMiniFrame->ShowWindow(SW_HIDE);
       pMiniFrame->ShowWindow(SW_SHOW);
    }

    3、禁止窗口最大化按鈕
    在PreCreateWindow()涵數中去掉WS_MAXIMIZEBOX風格顯示既可。
    BOOL CxxFrameWnd::PreCreateWindow(CREATESTRUCT& cs)
    {
        cs.style &= ~WS_MAXIMIZEBOX;
        return CFrameWnd::PreCreateWindow(cs);
    }

     

    4.如何將標題欄上的右鍵菜單屏蔽掉?

      [解決方法]
        右鍵菜單是系統菜單,只要將其WS_SYSMENU的屬性去掉即可.
      [程序實現]
        int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
        {
             ........
       long style = GetWindowLong(m_hWnd, GWL_STYLE);
             style &= ~WS_SYSMENU;
             SetWindowLong(m_hWnd, GWL_STYLE, style);

       return 0;
        }

     

    5.修改標題欄高度

    NONCLIENTMETRICS nm
    調用SystemParametersInfo(SPI_GETNONCLIENTMETRICS,sizeof(nm),&nm,0)

    重設SystemParametersInfo(SPI_SETNONCLIENTMETRICS,sizeof(nm),&nm,0)

     

    6.窗口最大化、最小化及關閉的消息是什么?如何截獲?

    最大化、最小化將發送WM_SYSCOMMAND消息。要處理該消息,可以這么做: 
        1、在Form的頭文件中添加: 
         void __fastcall RestrictMinimizeMaximize(TMessage &Msg); 
         
         BEGIN_MESSAGE_MAP 
         MESSAGE_HANDLER(WM_SYSCOMMAND, TMessage, RestrictMinimizeMaximize) 
         END_MESSAGE_MAP(TForm) 
        2、在Form的單元文件中添加: 
         
         void __fastcall TForm1::RestrictMinimizeMaximize(TMessage& Msg) 
         { 
         if (Msg.WParam == SC_MINIMIZE) 
         { 
         //catches minimize... 
         } 
         else if (Msg.WParam == SC_MAXIMIZE) 
         { 
         //catches maximize... 
         } 
         TForm::Dispatch(&Msg); 
         // or "else TForm::Dispatch(&Msg)" to trap 
         } 
        關閉窗口的消息為WM_CLOSE,C++Builder提供了OnClose事件。

     

    7.如何改變窗口標題?

      [問題提出]
        在應用程序的不同運行時期,要反映當前狀態往往會修改應用程序標題.

      [解決方法]
        在MFC類庫中提供了CWnd::SetWindowText函數,通過該函數可以改變任何窗體(包括控件)的標題.
        改變主窗體的標題:
        CWnd *m_pMainWnd;
        m_pMainWnd=AfxGetMainWnd();
        m_pMainWnd->SetWindowText(_T("改變標題"));
        當改變多視MDI的子窗口的標題時,用:
        GetParentFrame()->SetWindowText(_T("MDI Child改變標題"));
        當改變按鈕的標題時(假設按鈕的ID=IDC_BUTTON1):
        GetDlgItem(IDC_BUTTON1)->SetWindowText(_T("Button 改變標題"));
        運行看看.

     

    8.如何用VC++ 動態修改應用程序菜單

      [問題提出]
        本文將介紹一些使用CMenu的方法,如查找指定菜單,在指定選項前添加菜單項.....

      [解決方法]
        使用CWnd::GetMenu( )訪問主菜單,GetMenu( )返回指向CMenu對象的指針,它有一些成員函數,允許我們修改一個菜單。
        1) 如何實現找到一個菜單項:
        步驟如下:
        {
             //動態修改菜單:
             // Get the Main Menu
             CMenu* pMainMenu = AfxGetMainWnd()->GetMenu();
             CMenu* pSubMenu = NULL;
             int i;
             for (i=0; i<(int)pMainMenu->GetMenuItemCount(); i++)
             {
                pSubMenu = pMainMenu->GetSubMenu(i);
                if (pSubMenu && pSubMenu->GetMenuItemID(0) == ID_FILE_NEW)
                   break;
             }
             CString s;
             s.Format("%d",i);//菜單項的位數.
             AfxMessageBox(s);
             ASSERT(pSubMenu);
        }

        2) 動態編輯菜單:
        步驟如下(可以用上例的pSubMenu,要加的菜單你自己定義.):
        1) 添加一個稱為Wzd2,命令ID為IDC_NAME_NEW1的菜單命令到該菜單中,可以用:
             pSubMenu->AppendMenu(0,IDC_NAME_NEW1,"New&1");

        2) 在New1前插入New2,可以用:
             pSubMenu->InsertMenu(IDC_NAME_NEW1,MF_BYCOMMAND,IDC_NAME_NEW2, "New&2");

        3) 把New1改變成New3,可以用:
             pSubMenu->ModifyMenu(IDC_NAME_NEW1,MF_BYCOMMAND,IDC_NAME_NEW3, "New&3");

        4) 刪除該菜單中第二項,可以用:
             pSubMenu->RemoveMenu(1,MF_BYPOSITION);

     

    9.屏蔽掉子框架的右上角的關閉按鈕

     int CChildFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) 
    {
        if (CMDIChildWnd::OnCreate(lpCreateStruct) == -1)
            return -1;
    。。。
        CMenu* pSysMenu = GetSystemMenu(FALSE);
        pSysMenu->EnableMenuItem(SC_CLOSE,MF_BYCOMMAND |MF_DISABLED|MF_GRAYED);
        return 0;
    }

     

    10.隱藏標題欄和菜單欄

    隱藏標題欄 ModifyStyle(WS_CAPTION,0)
    隱藏菜單欄 SetMenu(NULL)

     

    11.動態增加或刪除菜單

    1、 增加菜單
    添加

    CMenu *mainmenu;
    mainmenu=AfxGetMainWnd()->GetMenu(); //得到主菜單
    (mainmenu->GetSubMenu (0))->AppendMenu (MF_SEPARATOR);//添加分隔符
    (mainmenu->GetSubMenu (0))->AppendMenu(MF_STRING,ID_APP_ABOUT,
                                            _T("Always on &Top")); //添加新的菜單項
                                            DrawMenuBar(); //重畫菜單

    2、 刪除菜單

    刪除

    CMenu *mainmenu;
    mainmenu=AfxGetMainWnd()->GetMenu(); //得到主菜單

    CString str ;
    for(int i=(mainmenu->GetSubMenu (0))->GetMenuItemCount()-1;i>=0;i--) //取得菜單的項數。
    {
        (mainmenu->GetSubMenu (0))->GetMenuString(i,str,MF_BYPOSITION);
        //將指定菜單項的標簽拷貝到指定的緩沖區。MF_BYPOSITION的解釋見上。
        if(str=="Always on &Top") //如果是剛才我們增加的菜單項,則刪除。
        {
            (mainmenu->GetSubMenu (0))->DeleteMenu(i,MF_BYPOSITION);
            break;
        }
    }

     

    12.另一種改變窗口標題的方法

      使用語句 CWnd* m_pCWnd = AfxGetMainWnd( ),然后,再以如下形式調用SetWindowText()函數:

    SetWindowText( *m_pCWnd,(LPCTSTR)m_WindowText);// m_WindowText可以是一個CString類的變量。

     

    13.上下文菜單事件觸發事件

    OnContextMenu事件

     

    14.顯示和隱藏程序菜單

    CWnd *pWnd=AfxGetMainWnd();
    if(b_m) //隱藏菜單
    {
        pWnd->SetMenu(NULL);
        pWnd->DrawMenuBar();
        b_m=false;
    }
    else
    {
        CMenu menu;
        menu.LoadMenu(IDR_MAINFRAME); ////顯示菜單 也可改變菜單項
        pWnd->SetMenu(&menu);
        pWnd->DrawMenuBar();
        b_m=true;
        menu.Detach();
    }

     

    RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全