• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

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

            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
            調用SystemParametersInfoSPI_GETNONCLIENTMETRICS,sizeof(nm),&nm,0

            重設SystemParametersInfoSPI_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,命令IDIDC_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();
            }

            posted on 2008-04-02 18:54 wrh 閱讀(1393) 評論(0)  編輯 收藏 引用

            導航

            <2010年8月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            2930311234

            統計

            常用鏈接

            留言簿(19)

            隨筆檔案

            文章檔案

            收藏夾

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            狠色狠色狠狠色综合久久| 免费一级欧美大片久久网| 久久天天婷婷五月俺也去| 久久99精品久久久久久水蜜桃| 婷婷五月深深久久精品| 无码国内精品久久人妻| 久久精品亚洲AV久久久无码| 久久精品一本到99热免费| 午夜精品久久久久久久| 久久国产精品99精品国产| 99久久成人国产精品免费| 国产精品久久久久AV福利动漫| 精品国产乱码久久久久久1区2区| 欧美亚洲色综久久精品国产| 国产综合久久久久久鬼色| 久久99精品国产麻豆宅宅| 久久精品国产亚洲av瑜伽| 亚洲国产成人久久综合区| 精品综合久久久久久98| 精品国产乱码久久久久久1区2区| 99久久综合国产精品二区| 色悠久久久久久久综合网| 亚洲人成伊人成综合网久久久| 久久99精品久久久久久动态图| 色综合久久久久网| 亚洲国产高清精品线久久| 午夜天堂精品久久久久| 国内精品久久久久影院网站| 国产美女亚洲精品久久久综合| 精品人妻久久久久久888| 欧美国产精品久久高清| 久久午夜无码鲁丝片| 久久er国产精品免费观看8| 日韩乱码人妻无码中文字幕久久 | 精品久久久久久久| 久久精品国产精品亚洲下载| 综合网日日天干夜夜久久| 青青草国产精品久久| 亚洲精品白浆高清久久久久久| 日韩一区二区久久久久久| 久久综合噜噜激激的五月天|