蓄積したVCプログラミングのテクニックのタイトルバーとメニュー
7063 ワード
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; }
2つ目の方法:
CMenu *pMenu=AfxGetApp()->m_pMainWnd->GetSystemMenu(FALSE); int x=pMenu->GetMenuItemCount( ); UINT pID=pMenu->GetMenuItemID(x-1); pMenu->EnableMenuItem(pID, MF_DISABLED);
3つ目の方法:
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、ダイアログボックスの閉じるボタンを禁止するには2つの方法があります.第1の方法は、CMenu*pMenu=this->GetSystemMenu(FALSE);pMenu->ModifyMenu(SC_CLOSE,MF_BYCOMMAND | MF_GRAYED );第2の方法は、CMenu*pMenu=this->GetSystemMenu(FALSE);pMenu->EnableMenuItem( SC_CLOSE, MF_BYCOMMAND|MF_GRAYED);2、フローティングツールバーのシステムメニューを禁止します.CToolBarの派生クラスCxxToolBarを新規作成し、新しいクラスで左クリックでダブルクリック(CxxToolBar::OnLbuttonDblClk(...))と左クリック(CxToolBar::OnLbuttonDown(...)内容にはif(IsFloating()/ツールバーがフローティング状態にある{CWnd*pMiniFrame;CWnd*pDockBar;pDockBar=GetParent();pMiniFrame=pDockBar->GetParent();//上系統メニューpMiniFrame->ModifyStyle(WS_SYSMENULL);//ツールバー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_SYSMENNUの属性を外せばよい.[プログラム実装]int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct){.......long style=GetWindowLong(m_hWnd,GWL_STYLE);style&=~WS_SYSMEnuU;SetWindowLong(m_hWnd,GWL_STYLE,style);return 0; }
5.タイトルバーの高さを変更する
SystemParametersInfo(SPI_SETONCLIENTMETRICS,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_BUTTON 1とする):GetDlgItem(IDC_BUTTON 1)->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->GetMenu ItemCount(); 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)Wzd 2というコマンドIDをIDC_として追加NAME_NEW 1のメニューコマンドは、pSubMenu->AppendMenu(0,IDC_NAME_NEW 1,"New&1");2)New 1の前にNew 2を挿入し、pSubMenu->InsertMenu(IDC_NAME_NEW 1,MF_BYCOMMAND,IDC_NAME_NEW 2,"New&2");3)New 1をNew 3に変更するには、pSubMenu->ModifyMenu(IDC_NAME_NEW 1,MF_BYCOMMAND,IDC_NAME_NEW 3,"New&3");4)このメニューの第2項を削除し、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();
①プログラム開始時に最大化するにはどうすればいいですか?
②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; }
2つ目の方法:
CMenu *pMenu=AfxGetApp()->m_pMainWnd->GetSystemMenu(FALSE); int x=pMenu->GetMenuItemCount( ); UINT pID=pMenu->GetMenuItemID(x-1); pMenu->EnableMenuItem(pID, MF_DISABLED);
3つ目の方法:
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、ダイアログボックスの閉じるボタンを禁止するには2つの方法があります.第1の方法は、CMenu*pMenu=this->GetSystemMenu(FALSE);pMenu->ModifyMenu(SC_CLOSE,MF_BYCOMMAND | MF_GRAYED );第2の方法は、CMenu*pMenu=this->GetSystemMenu(FALSE);pMenu->EnableMenuItem( SC_CLOSE, MF_BYCOMMAND|MF_GRAYED);2、フローティングツールバーのシステムメニューを禁止します.CToolBarの派生クラスCxxToolBarを新規作成し、新しいクラスで左クリックでダブルクリック(CxxToolBar::OnLbuttonDblClk(...))と左クリック(CxToolBar::OnLbuttonDown(...)内容にはif(IsFloating()/ツールバーがフローティング状態にある{CWnd*pMiniFrame;CWnd*pDockBar;pDockBar=GetParent();pMiniFrame=pDockBar->GetParent();//上系統メニューpMiniFrame->ModifyStyle(WS_SYSMENULL);//ツールバー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_SYSMENNUの属性を外せばよい.[プログラム実装]int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct){.......long style=GetWindowLong(m_hWnd,GWL_STYLE);style&=~WS_SYSMEnuU;SetWindowLong(m_hWnd,GWL_STYLE,style);return 0; }
5.タイトルバーの高さを変更する
NONCLIENTMETRICS nm
SystemParametersInfo(SPI_GETNONCLIENTMETRICS,sizeof(nm),&nm,0)
SystemParametersInfo(SPI_SETONCLIENTMETRICS,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_BUTTON 1とする):GetDlgItem(IDC_BUTTON 1)->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->GetMenu ItemCount(); 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)Wzd 2というコマンドIDをIDC_として追加NAME_NEW 1のメニューコマンドは、pSubMenu->AppendMenu(0,IDC_NAME_NEW 1,"New&1");2)New 1の前にNew 2を挿入し、pSubMenu->InsertMenu(IDC_NAME_NEW 1,MF_BYCOMMAND,IDC_NAME_NEW 2,"New&2");3)New 1をNew 3に変更するには、pSubMenu->ModifyMenu(IDC_NAME_NEW 1,MF_BYCOMMAND,IDC_NAME_NEW 3,"New&3");4)このメニューの第2項を削除し、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();