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);
第三種方法:
 
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.如何將標題欄上的右鍵菜單屏蔽掉?
 
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++提供了OnClose事件Builder
 
7.如何改變窗口標題?
 
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();
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章