Sample4

[メニュー・ツールバー関係]


//--------------------------------------------------------------------------------
//
//【メニューを消す】
//
//(SDK)
/////////////////////////////////////////////////////////////////////////////
{
	// hWndはメインウィンドウのウィンドウハンドル
	SetMenu(hWnd, NULL) ;
}

//(MFC)
/////////////////////////////////////////////////////////////////////////////
// WM_CREATEハンドラ
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if(CFrameWnd::OnCreate(lpCreateStruct) == -1)
		return -1 ;

		:
		:

	// メニューを消す(破棄)
	SetMenu(NULL) ;
	return 0 ;
}

//--------------------------------------------------------------------------------
//
//【ポップアップメニューを表示させる】
//
//(SDK)
/////////////////////////////////////////////////////////////////////////////
// メインウィンドウプロシージャ

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	switch(message){
		case WM_RBUTTONUP:
			POINT pt ;
			HMENU hMenu ;
			HMENU hSubMenu ;
			//HWND hwnd = (HWND)wParam;

			pt.x = LOWORD(lParam) ;
			pt.y = HIWORD(lParam) ;
			// マウスのポインタをスクリーン座標に変換
			ClientToScreen(hWnd, &pt) ;
			// メニューリソースの読み込み
			hMenu = LoadMenu(g_hInstance, MAKEINTRESOURCE(IDR_MENU)) ;
			hSubMenu = GetSubMenu(hMenu, 0) ;
			// ポップアップメニュー表示
			TrackPopupMenu(hSubMenu, 
							TPM_LEFTALIGN | TPM_RIGHTBUTTON, 
							pt.x,
							pt.y,
							0,
							hWnd,
							NULL) ;
			return 0 ;
		default :
			break ;
	}
	return (DefWindowProc(hWnd, message, wParam, lParam)) ;
}

//(MFC)
/////////////////////////////////////////////////////////////////////////////
// WM_RBUTTONDOWNハンドラ

void CTestWnd::OnRButtonDown(UINT nFlags, CPoint point) 
{
	// マウスのポインタをスクリーン座標に変換
	ClientToScreen(&point) ;
	// 自分自身にフォーカスを設定
	SetForegroundWindow() ;
	// ポップアップメニューの作成
	CMenu menu ;
	// IDR_MENU1はメニューのリソースID
	menu.LoadMenu(IDR_MENU1) ;
	CMenu* pPopup = menu.GetSubMenu(0) ;
	// ポップアップメニュー表示
	pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this) ;
	
	CWnd::OnRButtonDown(nFlags, point) ;
}

//--------------------------------------------------------------------------------
//
//【右クリックでシステムメニューポップアップ】
//
//(SDK)
/////////////////////////////////////////////////////////////////////////////
// メインウィンドウプロシージャ

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	switch(message){
		case WM_RBUTTONUP :
			POINT pt ;

			pt.x = LOWORD(lParam) ;
			pt.y = HIWORD(lParam) ;
			// マウスのポインタをスクリーン座標に変換
			ClientToScreen(hWnd, &pt) ;
			// システムメニューポップアップの表示
			PostMessage(hWnd, 0x0313, 0, MAKELPARAM(pt.x, pt.y)) ;
			return 0 ;
		default :
			break;
	}
	return (DefWindowProc(hWnd, message, wParam, lParam)) ;
}

//(MFC)
/////////////////////////////////////////////////////////////////////////////
// システムメニューポップアップの表示

void CTestWnd::OnRButtonDown(UINT nFlags, CPoint point) 
{
	// マウスのポインタをスクリーン座標に変換
	ClientToScreen(&point) ;
	// システムメニューポップアップの表示
	PostMessage(0x0313, 0, MAKELPARAM(point.x, point.y)) ;
	
	CWnd::OnRButtonDown(nFlags, point) ;
}
//--------------------------------------------------------------------------------
//
//【メニューを動的に切り替える】
//
// メニューを動的に切り替えるプログラムサンプルです
{
	CMenu newMenu ;

	// IDを指定してメニューリソースを読み込みます
	newMenu.LoadMenu(IDR_MENU1) ;

	// 新しいメニューを設定します
	AfxGetMainWnd()->SetMenu(&newMenu) ;

	// メニューを再描画します
	AfxGetMainWnd()->DrawMenuBar() ;

	// Windows のメニューを CMenu オブジェクトから切り離します
	newMenu.Detach() ;  
}
//--------------------------------------------------------------------------------
//
//【ダイアログにツールバーを作成】
//
//(SDK)
/////////////////////////////////////////////////////////////////////////////
static TBBUTTON g_tbbutton[] = 
{
	{ 0, IDM_EXIT,  TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0 },
	{ 1, IDM_NEW,   TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0 },
	{ 2, IDM_OPEN,  TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0 },
	{ 0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0 },
	{ 3, IDM_ABOUT, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0 },
} ;
/////////////////////////////////////////////////////////////////////////////
// ダイアログプロシージャ内のWM_INITDIALOGハンドラ部分

LRESULT CALLBACK TestDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
	switch(message){
		case WM_INITDIALOG :
			// ツールバーの作成
			// g_hwndToolBar2はHWND型のグローバル変数
			g_hwndToolBar2 = CreateToolbarEx(hDlg, 
				WS_CHILD | WS_VISIBLE | CCS_NOPARENTALIGN |CCS_NOMOVEY | CCS_NODIVIDER|CCS_NORESIZE, 
				IDC_TOOLBAR,
				8,
				g_hInstance,
				IDB_TOOLBAR,
				g_tbbutton, 
				sizeof(g_tbbutton)/sizeof(TBBUTTON), 
				16,
				15,
				16*3,
				15,
				sizeof(TBBUTTON)) ;

			return TRUE ;
		default :
			break ;
	}
	return FALSE ;
}

//(MFC)
/////////////////////////////////////////////////////////////////////////////
//[TestDialog.h]

class CTestDialog : public CDialog
{
		:
		:
	// CTestDialogのメンバにツールバーを追加
	CToolBar	m_wndToolBar ;
		:
		:
}
/////////////////////////////////////////////////////////////////////////////
//[TestDialog.cpp]

// WM_INITDIALOGハンドラ
CTestDialog::OnInitDialog() 
{
	CDialog::OnInitDialog() ;

	if(!m_wndToolBar.Create(this) ||
		!m_wndToolBar.LoadToolBar(IDR_TOOLBAR)){
		// 作成に失敗した時の処理
	}
	CRect rcClient ;
	GetClientRect(rcClient) ;
	// ツールバーの高さ取得
	CSize	sizeToolBar ;
	sizeToolBar = m_wndToolBar.CalcFixedLayout(FALSE, TRUE) ;
	// 作成時は大きさが0なので設定する
	m_wndToolBar.MoveWindow(0, 0, rcClient.Width(), sizeToolBar.cy) ;

	return TRUE ;
}

//--------------------------------------------------------------------------------
//
//【ツールバー/ステータスバーを非表示で起動】
//
//(MFC)
/////////////////////////////////////////////////////////////////////////////
// WM_CREATEハンドラ
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if(CFrameWnd::OnCreate(lpCreateStruct) == -1)
		return -1;

		:
		:

	// ツールバーを消したい場合
	ShowControlBar(&m_wndToolBar, FALSE, FALSE) ;
	// ステータスバーを消したい場合
	ShowControlBar(&m_wndStatusBar, FALSE, FALSE) ;

	return 0 ;
}

//--------------------------------------------------------------------------------
//
//【フローティングツールバーのクローズボタンを消す】
//(MFC)
/////////////////////////////////////////////////////////////////////////////
/*
1.クラスウィザードでgeneric CWndの派生クラスCTestToolBarを作成
2.作成したCTestToolBarのCWndをCToolBarに全て置換
3.MainFrm.hのCToolBarをCTestToolBarに変更
4.クラスウィザードでCTestToolBarにWM_CHILDACTIVATEのハンドラOnChildActivate()を追加
5.追加したOnChildActivate()を以下のようにする
*/
/////////////////////////////////////////////////////////////////////////////
// クラスウィザードで追加されたWM_CHILDACTIVATEハンドラ
void CTestToolBar::OnChildActivate() 
{
	CToolBar::OnChildActivate() ;

	CWnd* pWnd = GetParent()->GetParent() ;
	if(pWnd->GetSafeHwnd() != GetOwner()->GetSafeHwnd()){
		pWnd->ModifyStyle(WS_SYSMENU, 0) ;
	}
}

//--------------------------------------------------------------------------------
//
//【フローティングツールバーの移動方法】
//(MFC)
/////////////////////////////////////////////////////////////////////////////
void CMainFrame::OnTest() 
{
	CWnd* pWnd = m_wndToolBar.GetParent()->GetParent() ;
	if (pWnd->GetSafeHwnd() != GetSafeHwnd()){
		// ここで必要な処理をする
		CRect rcFrame(0, 0, 0, 0) ;
		ClientToScreen(rcFrame) ;
		pWnd->SetWindowPos(NULL, rcFrame.left, rcFrame.top, -1, -1, SWP_NOSIZE) ;
	}
}

//--------------------------------------------------------------------------------
//
//【フローティングツールバーの幅指定】
/////////////////////////////////////////////////////////////////////////////
// フローティングツールバーの幅を設定

void CMainFrame::OnTest() 
{
	m_wndToolBar.m_nMRUWidth = 100 ;
	ShowControlBar(&m_wndToolBar, TRUE, FALSE) ;
}