//-------------------------------------------------------------------------------- // //【ToolBar】 // //(SDK) ///////////////////////////////////////////////////////////////////////////// static TBBUTTON g_tbbutton[] = { { 0, IDM_NEW, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0 }, { 1, IDM_OPEN, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0 }, { 2, IDM_SAVE, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0 }, { 0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0 }, { 3, IDM_ABOUT, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0 }, } ; ///////////////////////////////////////////////////////////////////////////// // メインウィンドウプロシージャ内のWM_CREATEハンドラ部分 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch(message) { case WM_CREATE : RECT rcToolBar ; LONG lStyle ; // ツールバーの作成 // g_hwndToolBarはHWND型のグローバル変数 g_hwndToolBar = CreateToolbarEx(hWnd, 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)) ; // ToolBarCtrlの現在のウィンドウスタイルを取得 lStyle = GetWindowLong(g_hwndToolBar, GWL_STYLE) ; // TBSTYLE_FLATスタイルを指定 lStyle |= TBSTYLE_FLAT ; // 新しいウィンドウスタイルを設定 SetWindowLong(g_hwndToolBar, GWL_STYLE, lStyle) ; // ホット状態のイメージリストを作成 // g_imlはHIMAGELIST型のグローバル変数 // g_hInstanceはイメージリストを保持するインスタンスハンドル g_iml = ImageList_LoadBitmap(g_hInstance, MAKEINTRESOURCE(IDB_TOOLHOT), 16, 8, 0xc0c0c0) ; // ホットイメージリストをツールバーに割り当てる SendMessage(g_hwndToolBar, TB_SETHOTIMAGELIST, 0, (LPARAM)g_iml) ; return 0 ; } return 0 ; } //(MFC) ///////////////////////////////////////////////////////////////////////////// // WM_CREATEハンドラ関数 int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { if(CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1 ; if(!m_wndToolBar.Create(this) || !m_wndToolBar.LoadToolBar(IDR_MAINFRAME)){ TRACE0("Failed to create toolbar\n") ; return -1 ; // fail to create } // ツールバーからToolBarCtrlのウィンドウハンドルを取得 HWND hwndToolBarCtrl = m_wndToolBar.GetToolBarCtrl().m_hWnd ; // ToolBarCtrlの現在のウィンドウスタイルを取得 LONG lStyle = GetWindowLong(hwndToolBarCtrl, GWL_STYLE) ; // TBSTYLE_FLATスタイルを指定 lStyle |= TBSTYLE_FLAT ; // 新しいウィンドウスタイルを設定 SetWindowLong(hwndToolBarCtrl, GWL_STYLE, lStyle) ; // ホット状態のイメージリストを作成 // m_imlはCImageList型のメンバ変数 m_iml.Create(IDB_TOOLHOT, 16, 8, 0xc0c0c0) ; // ホットイメージリストをツールバーに割り当てる m_wndToolBar.GetToolBarCtrl().SendMessage(TB_SETHOTIMAGELIST, 0, (LPARAM)m_iml.m_hImageList) ; : : }
//-------------------------------------------------------------------------------- // //【StatusBar】 // //(SDK) ///////////////////////////////////////////////////////////////////////////// // メインウィンドウプロシージャ内のWM_CREATEハンドラ部分 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch(message){ case WM_CREATE : HICON hIcon ; // ステータスバーの作成 g_hwndStatusBar = CreateStatusWindow(WS_CHILD | WS_VISIBLE, "", hWnd, IDC_STATUSBAR) ; // ステータスバー用のスモールアイコンの取得 hIcon = (HICON)LoadImage(g_hInstance, MAKEINTRESOURCE(IDI_MAIN), IMAGE_ICON, 16, 16, 0) ; // ステータスバーにアイコンを設定 SendMessage(g_hwndStatusBar, SB_SETICON, 0, (LPARAM)hIcon) ; // ステータスバーの背景色を設定 SendMessage(g_hwndStatusBar, SB_SETBKCOLOR, 0, RGB(255, 0, 0)) ; return 0 ; } return 0 ; } //(MFC) ///////////////////////////////////////////////////////////////////////////// // WM_CREATEハンドラ関数 int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { : : if(!m_wndStatusBar.Create(this) || !m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT))){ TRACE0("Failed to create status bar\n") ; return -1 ; // fail to create } // ステータスバー用のスモールアイコンの取得 HICON hIcon = (HICON)LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_MAINFRAME), IMAGE_ICON, 16, 16, 0) ; // ステータスバーにアイコンを設定 m_wndStatusBar.SendMessage(SB_SETICON, 0, (LPARAM)hIcon) ; // ステータスバーの背景色を設定 m_wndStatusBar.SendMessage(SB_SETBKCOLOR, 0, RGB(255,0,0)) ; : : }
//-------------------------------------------------------------------------------- // //【List View Control】 // //(MFC) ///////////////////////////////////////////////////////////////////////////// // WM_INITDIALOGハンドラ BOOL CTestDialog::OnInitDialog() { : : // m_wndListCtrlはCListCtrlのオブジェクト // リストビューコントロールの現在のスタイルを取得 DWORD dwExStyle = ListView_GetExtendedListViewStyle(m_wndListCtrl.m_hWnd) ; // 拡張スタイルのセット dwExStyle |= LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_CHECKBOXES | LVS_EX_HEADERDRAGDROP ; // 新しい拡張スタイルを設定 ListView_SetExtendedListViewStyle(m_wndListCtrl.m_hWnd, dwExStyle) ; // イメージリストを作成 // m_imlはCImageList型のメンバ変数 m_iml.Create(IDB_BITMAP1, 16, 8, RGB(192, 192, 192)) ; // リストビューコントロールにイメージリストを設定 m_wndListCtrl.SetImageList(&m_iml, LVSIL_SMALL) ; // カラムの設定 char szText[256] ; LV_COLUMN lvclm ; lvclm.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH | LVCF_IMAGE ; lvclm.fmt = LVCFMT_LEFT | LVCFMT_IMAGE ; lvclm.cx = 100 ; lvclm.iSubItem = 0 ; //lvclm.cchTextMax; //lvclm.iOrder; for(int nCol=0 ; nCol<3 ; nCol++){ wsprintf(szText, "カラム%d", nCol) ; lvclm.pszText = szText ; lvclm.iImage = nCol ; m_wndListCtrl.InsertColumn(nCol, &lvclm) ; } // アイテムの設定 LV_ITEM lvi; lvi.mask = LVIF_TEXT | LVIF_IMAGE ; //lvi.state; //lvi.stateMask; //lvi.cchTextMax; //lvi.lParam; //lvi.iIndent; for(nCol=0 ; nCol<3 ; nCol++){ wsprintf(szText, "アイテム%d", nCol) ; lvi.pszText = szText ; lvi.iItem = 0 ; lvi.iSubItem = nCol ; lvi.iImage = nCol + 3 ; if(lvi.iSubItem == 0) m_wndListCtrl.InsertItem(&lvi) ; else m_wndListCtrl.SetItem(&lvi) ; } : : }
//-------------------------------------------------------------------------------- // //【Tree View Control】 // //(SDK) ///////////////////////////////////////////////////////////////////////////// // ダイアログプロシージャ内のWM_INITDIALOGハンドラ部分 LRESULT CALLBACK TestDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { switch(message){ case WM_INITDIALOG : HWND hwndTreeCtrl ; LONG lStyle ; char szText[256] ; TV_INSERTSTRUCT tvis ; HTREEITEM hTreeItem ; int nIndex ; // IDC_TREE1はツリーコントロールのリソースID hwndTreeCtrl = GetDlgItem(hDlg, IDC_TREE1) ; // ツリービューコントロールの現在のウィンドウスタイルを取得 lStyle = GetWindowLong(hwndTreeCtrl, GWL_STYLE) ; // 新しいスタイルを指定 lStyle |= TVS_CHECKBOXES | TVS_FULLROWSELECT | TVS_SINGLEEXPAND ; // 新しいウィンドウスタイルを設定 SetWindowLong(hwndTreeCtrl, GWL_STYLE, lStyle) ; tvis.hInsertAfter = TVI_FIRST ; tvis.item.mask = TVIF_TEXT ; //tvis.item.hItem = ; //tvis.item.state; //tvis.item.stateMask; //tvis.item.cchTextMax; //tvis.item.iImage; //tvis.item.iSelectedImage; //tvis.item.cChildren; //tvis.item.lParam; hTreeItem = TVI_ROOT ; for(nIndex = 0 ; nIndex < 3 ; nIndex++){ tvis.hParent = hTreeItem ; wsprintf(szText, "わざと長い名前にしてみる:アイテム%d", nIndex) ; tvis.item.pszText = szText ; hTreeItem = TreeView_InsertItem(hwndTreeCtrl, &tvis) ; } return TRUE ; } return FALSE ; } //(MFC) ///////////////////////////////////////////////////////////////////////////// // WM_INITDIALOGハンドラ BOOL CTestDialog::OnInitDialog() { CDialog::OnInitDialog(); : : // ツリービューコントロールの現在のウィンドウスタイルを取得 // m_wndTreeCtrlはCTreeCtrlのオブジェクト LONG lStyle = GetWindowLong(m_wndTreeCtrl.m_hWnd, GWL_STYLE) ; // 新しいスタイルを指定 lStyle |= TVS_CHECKBOXES | TVS_FULLROWSELECT | TVS_SINGLEEXPAND ; // 新しいウィンドウスタイルを設定 SetWindowLong(m_wndTreeCtrl.m_hWnd, GWL_STYLE, lStyle) ; char szText[256] ; TV_INSERTSTRUCT tvis ; tvis.hInsertAfter = TVI_FIRST ; tvis.item.mask = TVIF_TEXT ; //tvis.item.hItem = ; //tvis.item.state; //tvis.item.stateMask; //tvis.item.cchTextMax; //tvis.item.iImage; //tvis.item.iSelectedImage; //tvis.item.cChildren; //tvis.item.lParam; HTREEITEM hTreeItem = TVI_ROOT ; for(int nIndex = 0 ; nIndex < 3 ; nIndex++){ tvis.hParent = hTreeItem ; wsprintf(szText, "わざと長い名前にしてみる:アイテム%d", nIndex) ; tvis.item.pszText = szText ; hTreeItem = m_wndTreeCtrl.InsertItem(&tvis) ; } return TRUE; // TRUE を返すとコントロールに設定したフォーカスは失われません。 }
//-------------------------------------------------------------------------------- // //【Progress Bar Control】 // ///////////////////////////////////////////////////////////////////////////// // ダイアログプロシージャ内のWM_INITDIALOGハンドラ部分 LRESULT CALLBACK TestDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { switch(message){ case WM_INITDIALOG : HWND hwndProgressCtrl ; // ダイアログ上には貼り付けた場合、ウィンドウスタイルを変更しても // 思うように動かなかったので、ここでプログレスバーコントロールを作成 hwndProgressCtrl = CreateWindowEx( 0, PROGRESS_CLASS, "", WS_VISIBLE | WS_CHILD | PBS_VERTICAL | PBS_SMOOTH, 10, 50, 20, 80, hDlg, (HMENU)IDC_PROGRESSBAR, g_hInstance, NULL) ; // 範囲の設定 SendMessage(hwndProgressCtrl, PBM_SETRANGE , 0, MAKELPARAM(0, 100)) ; // 増減数の設定 SendMessage(hwndProgressCtrl, PBM_SETSTEP, 1, 0) ; return TRUE ; case WM_COMMAND: // プログレスバーコントロールの動作テスト if(LOWORD(wParam) == IDC_BT_TEST){ HWND hwndProgressCtrl ; int nCount ; hwndProgressCtrl = GetDlgItem(hDlg, IDC_PROGRESSBAR) ; SendMessage(hwndProgressCtrl, PBM_SETPOS, 0, 0) ; for(nCount = 0 ; nCount < 100 ; nCount++){ SendMessage(hwndProgressCtrl, PBM_STEPIT, 0, 0) ; Sleep(1) ; } return TRUE ; } break ; } return FALSE ; } //(MFC) ///////////////////////////////////////////////////////////////////////////// // WM_INITDIALOGハンドラ BOOL CTestDialog::OnInitDialog() { CDialog::OnInitDialog(); : : // ダイアログ上には貼り付けた場合、ウィンドウスタイルを変更しても // 思うように動かなかったので、ここでプログレスバーコントロールを作成 // m_wndProgressCtrl2はCWnd型のメンバ変数 m_wndProgressCtrl2.CreateEx( 0, PROGRESS_CLASS, "", WS_VISIBLE | WS_CHILD | PBS_VERTICAL | PBS_SMOOTH, 10, 50, 20, 80, m_hWnd, NULL) ; // 範囲の設定 m_wndProgressCtrl2.SetRange(0, 100) ; // 増減数の設定 m_wndProgressCtrl2.SetStep(1) ; return TRUE; // TRUE を返すとコントロールに設定したフォーカスは失われません。 } ///////////////////////////////////////////////////////////////////////////// // プログレスバーコントロールの動作テスト void CTestDialog::OnTest() { m_wndProgressCtrl2.SetPos(0) ; for(int nCount=0 ; nCount < 100 ; nCount++){ m_wndProgressCtrl2.StepIt() ; Sleep(1) ; } }
//-------------------------------------------------------------------------------- // //【Tab Controls】 // //(SDK) ///////////////////////////////////////////////////////////////////////////// static WNDPROC g_WndProc = NULL ; static BOOL g_bTabLeft = TRU ; #define PAGEMAX 2 static char g_szTabCaption[PAGEMAX][256] ; ///////////////////////////////////////////////////////////////////////////// // プロパティシートの作成 void OnTest(HWND hWnd) { HPROPSHEETPAGE hPropSheetPage[PAGEMAX] ; PROPSHEETPAGE psp ; PROPSHEETHEADER psh ; HWND hwndPropSheet ; psp.dwSize = sizeof(PROPSHEETPAGE) ; psp.dwFlags = PSP_DEFAULT ; psp.hInstance = g_hInstance ; psp.pszTemplate = MAKEINTRESOURCE(IDD_PAGE1) ; hPropSheetPage[0] = CreatePropertySheetPage(&psp) ; psp.pszTemplate = MAKEINTRESOURCE(IDD_PAGE2) ; hPropSheetPage[1] = CreatePropertySheetPage(&psp) ; ZeroMemory((void*)&psh, sizeof(PROPSHEETHEADER)) ; psh.dwSize = sizeof(PROPSHEETHEADER) ; psh.dwFlags = PSH_MODELESS ; psh.hwndParent = hWnd ; psh.hInstance = g_hInstance ; psh.pszCaption = "907" ; psh.nPages = PAGEMAX ; psh.phpage = hPropSheetPage ; hwndPropSheet = (HWND)PropertySheet(&psh) ; if(hwndPropSheet > 0){ // サプクラス化 g_WndProc = (WNDPROC)SetWindowLong(hwndPropSheet, GWL_WNDPROC, (LONG)PropSheetMainProc) ; // 無理矢理WM_INITDIALOGメッセージを発行 SendMessage(hwndPropSheet, WM_INITDIALOG, 0, 0) ; } } ///////////////////////////////////////////////////////////////////////////// // プロパティシート用ウィンドウプロシージャ LRESULT CALLBACK PropSheetMainProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch(message){ case WM_COMMAND : if(LOWORD(wParam) == IDOK){ //EndDialog(hWnd, IDOK); DestroyWindow(hWnd) ; return TRUE ; } if(LOWORD(wParam) == IDCANCEL){ //EndDialog(hWnd, IDCANCEL); DestroyWindow(hWnd) ; return TRUE ; } case WM_INITDIALOG : int nIndex ; HWND hwndTab ; HWND hwndPage ; LONG lStyle ; //RECT rcTabClient; // タブコントロールの取得 hwndTab = PropSheet_GetTabControl(hWnd) ; // タブコントロールの現在のウィンドウスタイルを取得 lStyle = GetWindowLong(hwndTab, GWL_STYLE) ; // 新しいスタイルを指定 lStyle |= TCS_VERTICAL | TCS_OWNERDRAWFIXED ; // 新しいウィンドウスタイルを設定 SetWindowLong(hwndTab, GWL_STYLE, lStyle) ; // g_bTabLeftはBOOL型のグローバル変数 g_bTabLeft = TRUE ; for(nIndex = 0 ; nIndex < TabCtrl_GetItemCount(hwndTab) ; nIndex++){ // ページにアクセスするためにアクティブ化 PropSheet_SetCurSel(hWnd, -1, nIndex) ; // ページウィンドウハンドルの取得 hwndPage = PropSheet_GetCurrentPageHwnd(hWnd) ; // ページのキャプションを取得 GetWindowText(hwndPage, g_szTabCaption[nIndex], 256) ; } // 最初のページをアクティブにする PropSheet_SetCurSel(hWnd, -1, 0) ; break ; case WM_DRAWITEM : UINT idCtl ; LPDRAWITEMSTRUCT lpDrawItemStruct ; RECT rectTab ; RECT rectBorder ; HBRUSH hbrBtnFace ; int nMaxPage ; int nIndex ; int nActivePageIndex ; HWND hwndTab ; idCtl = (UINT)wParam ; lpDrawItemStruct = (LPDRAWITEMSTRUCT)lParam ; hbrBtnFace = CreateSolidBrush(GetSysColor(COLOR_BTNFACE)) ; // タブコントロールの取得 hwndTab = PropSheet_GetTabControl(hWnd) ; // ページ数を取得 nMaxPage = TabCtrl_GetItemCount(hwndTab) ; // アクティブなページを取得 nActivePageIndex = TabCtrl_GetCurSel(hwndTab) ; for(nIndex = 0 ; nIndex < nMaxPage ; nIndex++){ HDC hdcTab ; HFONT hfontPrev ; HFONT hfontNew ; HFONT hfontOld ; LOGFONT logFont ; hdcTab = lpDrawItemStruct->hDC ; // タブの座標取得 TabCtrl_GetItemRect(hwndTab, nIndex, &rectTab) ; // タブで使われているフォントを取得 hfontPrev = (HFONT)SendMessage(hwndTab, WM_GETFONT, 0, 0) ; // 縦書用フォントを作成 GetObject(hfontPrev, sizeof(LOGFONT), &logFont) ; logFont.lfEscapement = (g_bTabLeft ? 900 : 2700) ; hfontNew = CreateFontIndirect(&logFont) ; // フォントを選択 hfontOld = SelectObject(hdcTab, hfontNew) ; // キャプションの背景色を指定 SetBkColor(hdcTab, GetSysColor(COLOR_BTNFACE)) ; // キャプション表示 if(g_bTabLeft) TextOut(hdcTab, rectTab.left+2, rectTab.bottom-5, (LPCTSTR)g_szTabCaption[nIndex], lstrlen(g_szTabCaption[nIndex])) ; else TextOut(hdcTab, rectTab.right-2, rectTab.top+5, (LPCTSTR)g_szTabCaption[nIndex], lstrlen(g_szTabCaption[nIndex])) ; // アクティブなページならタブの縁を塗りつぶす if(nIndex == nActivePageIndex){ if(g_bTabLeft){ rectBorder.left = rectTab.right ; rectBorder.top = rectTab.top ; rectBorder.right = rectTab.right + 3 ; rectBorder.bottom = rectTab.bottom ; } else{ rectBorder.left = rectTab.left - 3 ; rectBorder.top = rectTab.top ; rectBorder.right = rectTab.left ; rectBorder.bottom = rectTab.bottom ; } FillRect(hdcTab, &rectBorder, hbrBtnFace) ; } SelectObject(hdcTab, hfontOld) ; } return TRUE ; default: if(g_WndProc) return g_WndProc(hWnd, message, wParam, lParam) ; return DefWindowProc(hWnd, message, wParam, lParam) ; } return TRUE ; } //(MFC) ///////////////////////////////////////////////////////////////////////////// // WM_INITDIALOGハンドラ BOOL CTestPropertySheet::OnInitDialog() { BOOL bResult = CPropertySheet::OnInitDialog(); // タブコントロールの取得 CTabCtrl* pTab = GetTabControl() ; // タブコントロールの現在のウィンドウスタイルを取得 LONG lStyle = GetWindowLong(pTab->m_hWnd, GWL_STYLE) ; // 新しいスタイルを指定 lStyle |= TCS_VERTICAL | TCS_OWNERDRAWFIXED ; // 新しいウィンドウスタイルを設定 SetWindowLong(pTab->m_hWnd, GWL_STYLE, lStyle) ; // m_bTabLeftはBOOL型のメンバ変数 m_bTabLeft = TRUE ; // タブコントロール上の有効表示領域を取得 CRect rcTabClient ; pTab->AdjustRect(FALSE, &rcTabClient) ; for(int nIndex = 0 ; nIndex < GetPageCount() ; nIndex++){ // ページにアクセスするためにアクティブ化 SetActivePage(nIndex) ; // ページオブジェクトの取得 CPropertyPage* pPage = GetActivePage() ; // ページの位置補正 pPage->SetWindowPos(NULL, rcTabClient.left, rcTabClient.top, 0, 0, SWP_NOSIZE) ; } // 最初のページをアクティブにする SetActivePage(0) ; return bResult ; } ///////////////////////////////////////////////////////////////////////////// // クラスウィザードで追加されたWM_DRAWITEMハンドラ void CTestPropertySheet::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct) { CRect rectTab ; CRect rectBorder ; CRect rectText ; CBrush brBtnFace ; brBtnFace.CreateSolidBrush(GetSysColor(COLOR_BTNFACE)) ; CTabCtrl* pTab = GetTabControl() ; // ページ数を取得 int nMaxPage = GetPageCount() ; // アクティブなページを取得 int nActivePageIndex = pTab->GetCurSel() ; for(int nIndex = 0 ; nIndex < nMaxPage ; nIndex++){ CPropertyPage* pPage = GetPage(nIndex) ; CDC tabDC ; tabDC.Attach(lpDrawItemStruct->hDC) ; // タブの座標取得 pTab->GetItemRect(nIndex, &rectTab) ; // タブで使われているフォントを取得 CFont* pfontNow = pPage->GetFont() ; // 縦書用フォントを作成 LOGFONT logFont ; pfontNow->GetLogFont(&logFont) ; logFont.lfEscapement = (m_bTabLeft ? 900 : 2700) ; CFont fontNew; fontNew.CreateFontIndirect(&logFont) ; // フォントを選択 CFont *oldFont = tabDC.SelectObject(&fontNew) ; // タブのキャプション取得 CString strCaption ; pPage->GetWindowText(strCaption) ; // キャプションの背景色を指定 tabDC.SetBkColor(GetSysColor(COLOR_BTNFACE)) ; // キャプション表示 if(m_bTabLeft) tabDC.TextOut(rectTab.left + 2, rectTab.bottom - 5, strCaption) ; else tabDC.TextOut(rectTab.right - 2, rectTab.top + 5, strCaption) ; // アクティブなページならタブの縁を塗りつぶす if(nIndex == nActivePageIndex){ if(m_bTabLeft) rectBorder.SetRect(rectTab.right, rectTab.top, rectTab.right+3, rectTab.bottom) ; else rectBorder.SetRect(rectTab.left - 3, rectTab.top, rectTab.left, rectTab.bottom) ; tabDC.FillRect(rectBorder, &brBtnFace) ; } tabDC.SelectObject(oldFont) ; tabDC.Detach() ; } CPropertySheet::OnDrawItem(nIDCtl, lpDrawItemStruct) ; }
//-------------------------------------------------------------------------------- // //【Rebar Control】 // //(SDK) ///////////////////////////////////////////////////////////////////////////// // メインウィンドウプロシージャ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch(message){ case WM_CREATE : REBARINFO rbi ; REBARBANDINFO rbBand ; RECT rcToolBar ; RECT rcButton ; LONG lStyle ; HICON hIcon ; // 新しいコントロールを使用するための宣言 INITCOMMONCONTROLSEX icex ; icex.dwSize = sizeof(INITCOMMONCONTROLSEX) ; // レバーコントロールを使用する icex.dwICC = ICC_WIN95_CLASSES | ICC_COOL_CLASSES | ICC_BAR_CLASSES ; InitCommonControlsEx(&icex) ; // レバーコントロールの作成 g_hwndReber = CreateWindowEx( WS_EX_CLIENTEDGE, REBARCLASSNAME, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_BORDER | WS_CLIPCHILDREN | RBS_VARHEIGHT | CCS_NODIVIDER, 0, 0, 0, 0, hWnd, NULL, g_hInstance, NULL) ; rbi.cbSize = sizeof(REBARINFO) ; rbi.fMask = 0 ; rbi.himl = (HIMAGELIST)NULL ; SendMessage(g_hwndReber, RB_SETBARINFO, 0, (LPARAM)&rbi) ; rbBand.cbSize = sizeof(REBARBANDINFO) ; rbBand.fMask = RBBIM_TEXT | RBBIM_STYLE | RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_SIZE ; rbBand.fStyle = RBBS_CHILDEDGE ; // ボタンの作成 // g_hwndButtonはHWND型のグローバル変数 g_hwndButton = CreateWindow( "BUTTON", "ボタン", WS_CHILD | WS_VISIBLE, 0, 0, 50, 24, hWnd, 0, g_hInstance, 0) ; // ボタンの大きさ取得 GetWindowRect(g_hwndButton, &rcButton) ; // バンドデータの設定 rbBand.lpText = "Button" ; rbBand.hwndChild = g_hwndButton ; rbBand.cxMinChild = 0 ; rbBand.cyMinChild = rcButton.bottom - rcButton.top ; rbBand.cx = rcButton.right - rcButton.left ; // バンドの設定 SendMessage(g_hwndReber, RB_INSERTBAND, (WPARAM) - 1, (LPARAM)&rbBand) ; // ツールバーの作成 // g_hwndToolBarはHWND型のグローバル変数 g_hwndToolBar = CreateToolbarEx( hWnd, 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)) ; // ツールバーの大きさ取得(実際は使えない) GetWindowRect(g_hwndToolBar, &rcToolBar) ; // バンドデータの設定 rbBand.lpText = "" ; rbBand.hwndChild = g_hwndToolBar ; rbBand.cxMinChild = 0 ; rbBand.cyMinChild = 24 ; // rcToolBar.bottom - rcToolBar.top; rbBand.cx = rcToolBar.right - rcToolBar.left ; // バンドの設定 SendMessage(g_hwndReber, RB_INSERTBAND, (WPARAM)-1, (LPARAM)&rbBand) ; return 0 ; case WM_SIZE : // レバーコントロールのサイズをメインウィンドウに連動させる if(IsWindow(g_hwndReber)) SendMessage(g_hwndReber, message, wParam, lParam) ; break ; default : return (DefWindowProc(hWnd, message, wParam, lParam)) ; } return (0) ; } //(MFC) ///////////////////////////////////////////////////////////////////////////// // WM_INITDIALOGハンドラ BOOL CTestDialog::OnInitDialog() { CDialog::OnInitDialog(); REBARINFO rbi ; REBARBANDINFO rbBand ; // 新しいコントロールを使用するための宣言 INITCOMMONCONTROLSEX icex ; icex.dwSize = sizeof(INITCOMMONCONTROLSEX) ; // レバーコントロールを使用する icex.dwICC = ICC_COOL_CLASSES | ICC_BAR_CLASSES ; InitCommonControlsEx(&icex) ; // レバーコントロールの作成 // m_wndReberはCWnd型のメンバ変数 m_wndReber.CreateEx( 0 , REBARCLASSNAME, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_BORDER | WS_CLIPCHILDREN | RBS_VARHEIGHT | CCS_NODIVIDER, 0, 0, 0, 0, m_hWnd, NULL) ; rbi.cbSize = sizeof(REBARINFO) ; rbi.fMask = 0 ; rbi.himl = (HIMAGELIST)NULL ; m_wndReber.SendMessage(RB_SETBARINFO, 0, (LPARAM)&rbi) ; rbBand.cbSize = sizeof(REBARBANDINFO) ; rbBand.fMask = RBBIM_TEXT | RBBIM_STYLE | RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_SIZE ; rbBand.fStyle = RBBS_CHILDEDGE ; // ボタンの作成 m_wndBtn.Create("ボタン", WS_CHILD | WS_VISIBLE, CRect(0,0,50,24), &m_wndReber, 0) ; // ボタンの大きさ取得 CRect rcButton ; m_wndBtn.GetWindowRect(&rcButton) ; // バンドデータの設定 rbBand.lpText = "Button" ; rbBand.hwndChild = m_wndBtn.m_hWnd ; rbBand.cxMinChild = 0 ; rbBand.cyMinChild = rcButton.Height() ; rbBand.cx = rcButton.Width() ; // バンドの設定 m_wndReber.SendMessage(RB_INSERTBAND, (WPARAM)-1, (LPARAM)&rbBand) ; // ツールバーの作成 // m_wndToolBarはCToolBar型のメンバ変数 m_wndToolBar.Create(&m_wndReber) ; // IDR_MAINFRAMEはツールバーのリソースID m_wndToolBar.LoadToolBar(IDR_MAINFRAME) ; // ツールバーの大きさ取得 CSize sizeToolBar ; sizeToolBar = m_wndToolBar.CalcFixedLayout(FALSE, TRUE) ; // バンドデータの設定 rbBand.lpText = "Tool Bar" ; rbBand.hwndChild = m_wndToolBar.m_hWnd ; rbBand.cxMinChild = 0 ; rbBand.cyMinChild = sizeToolBar.cy ; rbBand.cx = sizeToolBar.cx ; // バンドの設定 m_wndReber.SendMessage(RB_INSERTBAND, (WPARAM)-1, (LPARAM)&rbBand) ; return TRUE ; // コントロールにフォーカスを設定しないとき、戻り値は TRUE となります }
//-------------------------------------------------------------------------------- // //【ComboBoxEx】 // //(SDK) ///////////////////////////////////////////////////////////////////////////// // ダイアログプロシージャ内のWM_INITDIALOGハンドラ部分 LRESULT CALLBACK TestDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { switch(message){ case WM_INITDIALOG : char szText[256] ; COMBOBOXEXITEM cbei ; int nIndex ; // 新しいコントロールを使用するための宣言 INITCOMMONCONTROLSEX icex ; icex.dwSize = sizeof(INITCOMMONCONTROLSEX) ; // 拡張コンボボックスコントロールを使用する icex.dwICC = ICC_USEREX_CLASSES ; InitCommonControlsEx(&icex) ; // 拡張コンボボックスコントロールの作成 // g_hwndComboBocExはHWND型のグローバル変数 g_hwndComboBocEx = CreateWindowEx( 0, WC_COMBOBOXEX, NULL, WS_BORDER | WS_VISIBLE | WS_CHILD | CBS_DROPDOWNLIST, 5, 5, 200, 200, hDlg, NULL, g_hInstance, NULL) ; // イメージリストを作成 // g_imlはCImageList型のグローバル変数 g_iml = ImageList_LoadBitmap( g_hInstance, MAKEINTRESOURCE(IDB_BITMAP1), 16, 8, RGB(192, 192, 192)); // 拡張コンボボックスにイメージリストを設定 SendMessage(g_hwndComboBocEx, CBEM_SETIMAGELIST, 0, (LPARAM)g_iml) ; // 拡張コンボボックスにアイテムを設定 cbei.mask = CBEIF_TEXT | CBEIF_INDENT | CBEIF_IMAGE | CBEIF_SELECTEDIMAGE ; //cbei.iOverlay; //cbei.lParam; for(nIndex = 0 ; nIndex < 8 ; nIndex++){ wsprintf(szText, "アイテム%d", nIndex) ; cbei.pszText = szText ; cbei.cchTextMax = lstrlen(szText) ; cbei.iItem = nIndex ; cbei.iIndent = nIndex % 3 ; cbei.iImage = nIndex ; cbei.iSelectedImage = nIndex ; SendMessage(g_hwndComboBocEx, CBEM_INSERTITEM, 0, (LPARAM)&cbei) ; } return TRUE ; } return FALSE ; } //(MFC) ///////////////////////////////////////////////////////////////////////////// BOOL CTestDialog::OnInitDialog() { CDialog::OnInitDialog(); : : // 新しいコントロールを使用するための宣言 INITCOMMONCONTROLSEX icex ; icex.dwSize = sizeof(INITCOMMONCONTROLSEX) ; // 拡張コンボボックスコントロールを使用する icex.dwICC = ICC_USEREX_CLASSES ; InitCommonControlsEx(&icex) ; // 拡張コンボボックスコントロールの作成 // m_wndComboBocExはCWnd型のオブジェクト m_wndComboBocEx.CreateEx( 0, WC_COMBOBOXEX, NULL, WS_BORDER | WS_VISIBLE | WS_CHILD | CBS_DROPDOWNLIST , 5, 5, 200, 200, m_hWnd, NULL) ; // イメージリストを作成 // m_imlはCImageList型のメンバ変数 m_iml.Create(IDB_BITMAP1, 16, 8, RGB(192,192,192)) ; // 拡張コンボボックスにイメージリストを設定 m_wndComboBocEx.SendMessage(CBEM_SETIMAGELIST, 0, (LPARAM)m_iml.m_hImageList) ; // 拡張コンボボックスにアイテムを設定 char szText[256] ; COMBOBOXEXITEM cbei ; cbei.mask = CBEIF_TEXT | CBEIF_INDENT | CBEIF_IMAGE | CBEIF_SELECTEDIMAGE ; //cbei.iOverlay; //cbei.lParam; for(int nIndex = 0 ; nIndex < 8 ; nIndex++){ wsprintf(szText, "アイテム%d", nIndex) ; cbei.pszText = szText ; cbei.cchTextMax = lstrlen(szText) ; cbei.iItem = nIndex ; cbei.iIndent = nIndex % 3 ; cbei.iImage = nIndex ; cbei.iSelectedImage = nIndex ; m_wndComboBocEx.SendMessage(CBEM_INSERTITEM, 0, (LPARAM)&cbei) ; } return TRUE ; // TRUE を返すとコントロールに設定したフォーカスは失われません。 }
//-------------------------------------------------------------------------------- // //【Date and Time Picker Control】 // //(SDK) ///////////////////////////////////////////////////////////////////////////// // ダイアログプロシージャ内のWM_INITDIALOGハンドラ部分 LRESULT CALLBACK TestDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { switch(message){ case WM_INITDIALOG : HWND hwndDate ; HWND hwndTime ; // 新しいコントロールを使用するための宣言 INITCOMMONCONTROLSEX icex; icex.dwSize = sizeof(INITCOMMONCONTROLSEX) ; // Date and Time Pickerコントロールを使用する icex.dwICC = ICC_DATE_CLASSES ; InitCommonControlsEx(&icex) ; // Date and Time Pickerコントロールの作成(日付) hwndDate = CreateWindowEx( 0, DATETIMEPICK_CLASS , NULL, WS_BORDER | WS_VISIBLE | WS_CHILD | DTS_LONGDATEFORMAT, 5, 10, 180, 24, hDlg, NULL, g_hInstance, NULL) ; // Date and Time Pickerコントロールの作成(時間) hwndTime = CreateWindowEx( 0, DATETIMEPICK_CLASS, NULL, WS_BORDER | WS_VISIBLE | WS_CHILD | DTS_TIMEFORMAT , 200, 10, 120, 24, hDlg, NULL, g_hInstance, NULL) ; return TRUE ; } return FALSE ; } //(MFC) ///////////////////////////////////////////////////////////////////////////// // WM_INITDIALOGハンドラ BOOL CTestDialog::OnInitDialog() { CDialog::OnInitDialog(); : : // 新しいコントロールを使用するための宣言 INITCOMMONCONTROLSEX icex ; icex.dwSize = sizeof(INITCOMMONCONTROLSEX) ; // Date and Time Pickerコントロールを使用する icex.dwICC = ICC_DATE_CLASSES ; InitCommonControlsEx(&icex) ; // Date and Time Pickerコントロールの作成(日付) // m_wndDateはCWnd型のメンバ変数 m_wndDate.CreateEx( 0, DATETIMEPICK_CLASS, NULL, WS_BORDER | WS_VISIBLE | WS_CHILD | DTS_LONGDATEFORMAT, 5, 10, 180, 24, m_hWnd, NULL) ; // Date and Time Pickerコントロールの作成(時間) m_wndTime.CreateEx( 0, DATETIMEPICK_CLASS, NULL, WS_BORDER | WS_VISIBLE | WS_CHILD | DTS_TIMEFORMAT , 200, 10, 120, 24, m_hWnd, NULL) ; return TRUE ; // return TRUE unless you set the focus to a control }
//-------------------------------------------------------------------------------- // //【Month Calender Control】 // //(SDK) ///////////////////////////////////////////////////////////////////////////// // ダイアログプロシージャ内のWM_INITDIALOGハンドラ部分 LRESULT CALLBACK TestDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { switch(message){ case WM_INITDIALOG : HWND hwndMonthCalender ; RECT rcMonthCal ; // 新しいコントロールを使用するための宣言 INITCOMMONCONTROLSEX icex ; icex.dwSize = sizeof(icex) ; // カレンダーコントロールを使用する icex.dwICC = ICC_DATE_CLASSES ; InitCommonControlsEx(&icex) ; // カレンダーコントロールの作成 // ここで指定したウィンドウサイズは意味がない hwndMonthCalender = CreateWindowEx( WS_EX_CLIENTEDGE, MONTHCAL_CLASS, "", WS_VISIBLE | WS_CHILD | WS_BORDER | MCS_DAYSTATE , 5, 5, 150, 150, hDlg, NULL, g_hInstance, NULL) ; // カレンダーコントロールの大きさを取得 MonthCal_GetMinReqRect(hwndMonthCalender, &rcMonthCal) ; // 大きさを設定 SetWindowPos( hwndMonthCalender, NULL, 0, 0, 10 + rcMonthCal.right - rcMonthCal.left, 10 + rcMonthCal.bottom - rcMonthCal.top, SWP_NOMOVE) ; return TRUE ; break ; } return FALSE ; } //(MFC) ///////////////////////////////////////////////////////////////////////////// // WM_INITDIALOGハンドラ BOOL CTestDialog::OnInitDialog() { CDialog::OnInitDialog(); : : // 新しいコントロールを使用するための宣言 INITCOMMONCONTROLSEX icex ; icex.dwSize = sizeof(icex) ; // カレンダーコントロールを使用する icex.dwICC = ICC_DATE_CLASSES ; InitCommonControlsEx(&icex) ; // m_wndMonthCalenderはCWnd型のオブジェクト // カレンダーコントロールの作成 // ここで指定したウィンドウサイズは意味がない m_wndMonthCalender.CreateEx( WS_EX_CLIENTEDGE, MONTHCAL_CLASS, "", WS_VISIBLE | WS_CHILD | WS_BORDER | MCS_DAYSTATE, 5, 5, 150, 150, m_hWnd, NULL) ; // カレンダーコントロールの大きさを取得 CRect rcMonthCal ; MonthCal_GetMinReqRect(m_wndMonthCalender.m_hWnd, &rcMonthCal) ; // 大きさを設定 m_wndMonthCalender.SetWindowPos( NULL, 0, 0, 10 + rcMonthCal.Width(), 10 + rcMonthCal.Height(), SWP_NOMOVE) ; return TRUE ; // TRUE を返すとコントロールに設定したフォーカスは失われません。 }
//-------------------------------------------------------------------------------- // //【IP Address Control】 // //(SDK) ///////////////////////////////////////////////////////////////////////////// // ダイアログプロシージャ内のWM_INITDIALOGハンドラ部分 LRESULT CALLBACK TestDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { switch(message){ case WM_INITDIALOG : HWND hwndIPAddress ; // 新しいコントロールを使用するための宣言 INITCOMMONCONTROLSEX icex ; icex.dwSize = sizeof(icex) ; // IPアドレスコントロールを使用する icex.dwICC = ICC_INTERNET_CLASSES ; InitCommonControlsEx(&icex) ; // m_wndIPAddressはCWnd型のオブジェクト // IPアドレスコントロールの作成 hwndIPAddress = CreateWindowEx( 0, WC_IPADDRESS, "", WS_VISIBLE | WS_CHILD | WS_BORDER, 5, 5, 150, 26, hDlg, NULL, g_hInstance, NULL) ; // IPアドレスをセット(テスト用) SendMessage(hwndIPAddress, IPM_SETADDRESS, 0, MAKEIPADDRESS(1, 2, 3, 4)) ; SetWindowText(hDlg, "918IPAddress Control") ; return TRUE ; } return FALSE ; } //(MFC) ///////////////////////////////////////////////////////////////////////////// // WM_INITDIALOGハンドラ BOOL CMy918Dlg::OnInitDialog() { CDialog::OnInitDialog(); : : // 新しいコントロールを使用するための宣言 INITCOMMONCONTROLSEX icex ; icex.dwSize = sizeof(icex) ; // IPアドレスコントロールを使用する icex.dwICC = ICC_INTERNET_CLASSES ; InitCommonControlsEx(&icex) ; // m_wndIPAddressはCWnd型のオブジェクト // IPアドレスコントロールの作成 m_wndIPAddress.CreateEx( 0, WC_IPADDRESS, "", WS_VISIBLE | WS_CHILD | WS_BORDER, 5, 5, 150, 26, m_hWnd, NULL) ; // IPアドレスをセット(テスト用) m_wndIPAddress.SendMessage(IPM_SETADDRESS, 0, MAKEIPADDRESS(1, 2, 3, 4)) ; return TRUE ; // TRUE を返すとコントロールに設定したフォーカスは失われません。 }
//-------------------------------------------------------------------------------- // //【Flat Scroll Bars】 // //(SDK) ///////////////////////////////////////////////////////////////////////////// // ダイアログプロシージャ内のWM_INITDIALOGハンドラ部分 LRESULT CALLBACK TestDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { switch(message){ case WM_INITDIALOG : // フラットスクロールバーにするための初期化 // このダイアログにはウィンドウスタイルでスクロールバーが付いている InitializeFlatSB(hDlg) ; // スクロールバーをフラットモードにする FlatSB_SetScrollProp(hDlg, WSB_PROP_VSTYLE , FSB_FLAT_MODE, TRUE) ; SetWindowText(hDlg, "919Flat Scroll Bars") ; return TRUE ; } return FALSE ; } //(MFC) ///////////////////////////////////////////////////////////////////////////// // WM_INITDIALOGハンドラ BOOL CTestDialog::OnInitDialog() { CDialog::OnInitDialog(); : : // フラットスクロールバーにするための初期化 // このダイアログにはウィンドウスタイルでスクロールバーが付いている InitializeFlatSB(m_hWnd) ; // スクロールバーをフラットモードにする FlatSB_SetScrollProp(m_hWnd, WSB_PROP_VSTYLE , FSB_FLAT_MODE, TRUE) ; return TRUE ; // TRUE を返すとコントロールに設定したフォーカスは失われません。 }
//-------------------------------------------------------------------------------- // //【Pager Control】 // //(SDK) ///////////////////////////////////////////////////////////////////////////// // ダイアログプロシージャ内のWM_INITDIALOGハンドラ部分 LRESULT CALLBACK TestDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { switch(message){ case WM_INITDIALOG : HWND hwndPager ; // 新しいコントロールを使用するための宣言 INITCOMMONCONTROLSEX icex ; icex.dwSize = sizeof(INITCOMMONCONTROLSEX) ; // ページャーコントロールを使用する icex.dwICC = ICC_PAGESCROLLER_CLASS ; InitCommonControlsEx(&icex) ; // ページャーコントロールの作成 hwndPager = CreateWindowEx( 0, WC_PAGESCROLLER, NULL, WS_CHILD | WS_VISIBLE | PGS_HORZ | PGS_AUTOSCROLL, 0, 0, 100, 30, hDlg, NULL, g_hInstance, NULL) ; // ツールバーの作成 // g_hwndToolBarはHWND型のグローバル変数 g_hwndToolBar = CreateToolbarEx( hwndPager, 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 * 6, 15, sizeof(TBBUTTON)) ; // ツールバーをページャーコントロールの子ウィンドウとして設定 SendMessage(hwndPager, PGM_SETCHILD, 0, (LPARAM)g_hwndToolBar) ; SetWindowText(hDlg, "920Pager Control") ; return TRUE ; case WM_NOTIFY: NMHDR* lpnmh = (NMHDR*)lParam ; switch(lpnmh->code){ case PGN_CALCSIZE : { // このメッセージを処理しないと、ページャーコントロールのボタンが表示されない NMPGCALCSIZE* pCalcSize = (NMPGCALCSIZE*)lParam ; switch(pCalcSize->dwFlag){ case PGF_CALCWIDTH : { // ツールバーの幅を返す pCalcSize->iWidth = 180 ; break ; } } return TRUE ; } case PGN_SCROLL: { // ボタンを押した時に、ここで指定した数だけスクロールする NMPGSCROLL* pScroll = (LPNMPGSCROLL)lParam ; switch(pScroll->iDir){ case PGF_SCROLLLEFT : case PGF_SCROLLRIGHT : case PGF_SCROLLUP : case PGF_SCROLLDOWN : pScroll->iScroll = 5 ; break ; } return TRUE ; } } } return FALSE ; } //(MFC) ///////////////////////////////////////////////////////////////////////////// // WM_INITDIALOGハンドラ BOOL CTestDialog::OnInitDialog() { CDialog::OnInitDialog(); : : // 新しいコントロールを使用するための宣言 INITCOMMONCONTROLSEX icex ; icex.dwSize = sizeof(INITCOMMONCONTROLSEX) ; // ページャーコントロールを使用する icex.dwICC = ICC_PAGESCROLLER_CLASS ; InitCommonControlsEx(&icex) ; // ページャーコントロールの作成 // m_wndPagerはCWnd型のメンバ変数 m_wndPager.CreateEx( 0, WC_PAGESCROLLER, NULL, WS_CHILD | WS_VISIBLE | PGS_HORZ | PGS_AUTOSCROLL, 0, 0, 200, 50, m_hWnd, NULL) ; // ツールバーの作成 // m_wndToolBarはCToolBar型のメンバ変数 m_wndToolBar.Create(&m_wndPager) ; // IDR_TOOLBAR1はツールバーのリソースID m_wndToolBar.LoadToolBar(IDR_TOOLBAR1) ; // ツールバーの大きさ取得 CSize sizeToolBar ; sizeToolBar = m_wndToolBar.CalcFixedLayout(FALSE, TRUE) ; // ページャーコントロールの大きさを補正 m_wndPager.SetWindowPos(NULL, 0, 0, 200, sizeToolBar.cy, SWP_NOMOVE) ; // ツールバーをページャーコントロールの子ウィンドウとして設定 m_wndPager.SendMessage(PGM_SETCHILD, 0, (LPARAM)m_wndToolBar.m_hWnd) ; return TRUE ; // TRUE を返すとコントロールに設定したフォーカスは失われません。 } ///////////////////////////////////////////////////////////////////////////// // クラスウィザードで追加したWM_NOTFYメッセージハンドラ BOOL CMy920Dlg::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult) { NMHDR* lpnmh = (NMHDR*)lParam ; switch(lpnmh->code){ case PGN_CALCSIZE : // このメッセージを処理しないと、ページャーコントロールのボタンが表示されない NMPGCALCSIZE* pCalcSize = (NMPGCALCSIZE*)lParam ; switch(pCalcSize->dwFlag){ case PGF_CALCWIDTH : { // ツールバーの大きさ取得 CSize sizeToolBar ; sizeToolBar = m_wndToolBar.CalcFixedLayout(FALSE, TRUE) ; pCalcSize->iWidth = sizeToolBar.cx ; break ; } } return TRUE ; case PGN_SCROLL : // ボタンを押した時に、ここで指定した数だけスクロールする NMPGSCROLL* pScroll = (LPNMPGSCROLL)lParam ; switch(pScroll->iDir){ case PGF_SCROLLLEFT : case PGF_SCROLLRIGHT : case PGF_SCROLLUP : case PGF_SCROLLDOWN : pScroll->iScroll = 5 ; break ; } return TRUE ; } return CDialog::OnNotify(wParam, lParam, pResult) ; }