//-------------------------------------------------------------------------------- // //【コントロールの背景色を変える】 // //(SDK) ///////////////////////////////////////////////////////////////////////////// // Windows 3.1時代はWM_CTLCOLORの中で、コントロールの種類を判別して処理する必要があったが、Win32からWM_CTLCOLORSTATICやWM_CTLCOLOREDITといったように、各コントロールごとのメッセージに変更された。 ///////////////////////////////////////////////////////////////////////////// // ダイアログプロシージャ LRESULT CALLBACK TestDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { switch(message){ case WM_INITDIALOG : // スタティック用のブラシを作成 g_hbrStatic = CreateSolidBrush(RGB(0, 255, 0)) ; return TRUE ; case WM_CTLCOLORSTATIC : // スタティックコントロールの場合 // 目的のスタティックコントロールのディスプレイコンテキスト HDC hdcStatic = (HDC)wParam ; // 目的のスタティックコントロールのウィンドウハンドル HWND hwndStatic = (HWND)lParam ; // ここでは全てのスタティックコントロールについて同じ背景色を // 指定するのでhwndStaticの区別をしない return (LRESULT)g_hbrStatic ; // g_hbrStaticはあらかじめ作成されたブラシハンドル case WM_DESTROY : // 作成したブラシの破棄 DeleteObject(g_hbrStatic) ; return 0 ; default: break ; } return FALSE ; } //(MFC) ///////////////////////////////////////////////////////////////////////////// // MFCの場合は、過去のソースコード共有のために、Windows 3.1時代の書き方をするのでOnCtlColor()を処理する。 ///////////////////////////////////////////////////////////////////////////// // ダイアログクラスのコンストラクタ CTestDialog::CTestDialog(CWnd* pParent /*=NULL*/) : CDialog(CTestDialog::IDD, pParent) { // スタティック用のブラシを作成 m_brStatic.CreateSolidBrush(RGB(0,255,0)) ; } ///////////////////////////////////////////////////////////////////////////// // クラスウィザードより追加されたWM_CTLCOLORハンドラ HBRUSH CTestDialog::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { if(nCtlColor==CTLCOLOR_STATIC){ // スタティックコントロールの場合 // ここでは全てのスタティックコントロールについて同じ背景色を // 指定するのでpWndの区別をしない return m_brStatic ; // m_brStaticはあらかじめ作成されたCBrushオブジェクト } return CDialog::OnCtlColor(pDC, pWnd, nCtlColor) ; }
//-------------------------------------------------------------------------------- // //【コンボボックス上のエディットコントロールの制御】 // //(SDK) ///////////////////////////////////////////////////////////////////////////// { // ダイアログ上に目的のコンボボックスが張り付いているものとする // IDC_COMBOOXはコンボボックスのリソースID HWND hwndComboBox = GetDlgItem(hDlg,IDC_COMBOOX) ; HWND hwndEdit = GetTopWindow(hwndComboBox) ; } //(MFC) ///////////////////////////////////////////////////////////////////////////// { // ダイアログ上に目的のコンボボックスが張り付いているものとする // IDC_COMBOOXはコンボボックスのリソースID CWnd* pwndComboBox = GetDlgItem(IDC_COMBOOX) ; CWnd* pwndEdit = pwndComboBox->GetTopWindow() ; }
//-------------------------------------------------------------------------------- // //【ListViewコントロールで目的のアイテムを表示】 // //(SDK) ///////////////////////////////////////////////////////////////////////////// { // hwndListCtrlはリストコントロールのウィンドウハンドル // nItemは目的のアイテム番号 ListView_EnsureVisible(hwndListCtrl, nItem, FALSE) ; } //(MFC) ///////////////////////////////////////////////////////////////////////////// { // m_wndListCtrlはリストコントロールオブジェクト // nItemは目的のアイテム番号 m_wndListCtrl.EnsureVisible(nItem, FALSE) ; }
//-------------------------------------------------------------------------------- // //【ListViewコントロールの項目の高さ変更】 // //(SDK) ///////////////////////////////////////////////////////////////////////////// { // g_himlはHIMAGELIST型のグローバル変数 // IDB_BITMAPはダミービットマップのリソースID g_himl = ImageList_LoadBitmap(g_hInstance, MAKEINTRESOURCE(IDB_BITMAP), 1, 1, 0xc0c0c0) ; // hwndListCtrlはListViewコントロールのウィンドウハンドル ListView_SetImageList(hwndListCtrl, g_himl, LVSIL_SMALL) ; } //(MFC) ///////////////////////////////////////////////////////////////////////////// { // m_imagelistはCImageListのオブジェクト m_imagelist.Create(1, 32, TRUE, 1, 1) ; // IDI_ICONはダミーアイコンのリソースID m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_ICON)) ; // m_wndListCtrlはCListCtrlのオブジェクト m_wndListCtrl.SetImageList(&m_imagelist, LVSIL_SMALL) ; }
//-------------------------------------------------------------------------------- // //【ListViewコントロールの複数選択取得】 // //(SDK) ///////////////////////////////////////////////////////////////////////////// void OnTest(HWND hWnd) { int nItem = -1 ; HWND hwndListCtrl = GetDlgItem(hWnd, IDC_LIST) ; while((nItem = ListView_GetNextItem(hwndListCtrl, nItem, LVNI_SELECTED)) != -1){ // 必要な処理 char szText[256] ; wsprintf(szText, "選択されたのは%d", nItem) ; MessageBox(hWnd, szText, "", MB_OK) ; } } //(MFC) ///////////////////////////////////////////////////////////////////////////// void CTestDialog::OnTest() { int nItem = -1 ; // m_wndListCtrlはListViewコントロールのオブジェクト while((nItem = m_wndListCtrl.GetNextItem(nItem, LVNI_SELECTED)) != -1){ // 必要な処理 CString strText ; strText.Format("選択されたのは%d", nItem) ; MessageBox(strText) ; } }
//-------------------------------------------------------------------------------- // //【ListViewコントロールの列幅をテキストに合わせる】 // //(SDK) ///////////////////////////////////////////////////////////////////////////// { HWND hwndListCtrl = GetDlgItem(hWnd, IDC_LIST) ; // nColは幅を合わせたい列のインデックス int nCol = 0 ; ListView_SetColumnWidth(hwndListCtrl, nCol, LVSCW_AUTOSIZE) ; } //(MFC) ///////////////////////////////////////////////////////////////////////////// { // m_wndListCtrlはListViewコントロールのオブジェクト // nColは幅を合わせたい列のインデックス m_wndListCtrl.SetColumnWidth(nCol, LVSCW_AUTOSIZE) ; }
//-------------------------------------------------------------------------------- // //【タブコントロールの表示領域の取得】 // //(SDK) ///////////////////////////////////////////////////////////////////////////// { RECT rcTabClient ; // hwndTabCtrlタブコントロールのウィンドウハンドル GetClientRect(hwndTabCtrl, &rcTabClient) ; TabCtrl_AdjustRect(hwndTabCtrl, FALSE, &rcTabClient) ; } //(MFC) ///////////////////////////////////////////////////////////////////////////// { CRect rcTabClient ; // m_wndTabCtrlはCTabCtrlのオブジェクト m_wndTabCtrl.GetClientRect(&rcTabClient) ; m_wndTabCtrl.AdjustRect(FALSE, &rcTabClient) ; }
//-------------------------------------------------------------------------------- // //【TreeViewコントロールの背景色を変える・その1】 // //(SDK) ///////////////////////////////////////////////////////////////////////////// // ダイアログプロシージャ内のWM_INITDIALOGハンドラ部分 LRESULT CALLBACK TestDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { switch(message){ case WM_INITDIALOG : HWND hwndTreeCtrl = GetDlgItem(hDlg, IDC_TREE) ; LONG lStyle ; // テキスト色設定(comctrl32.dll v4.70〜) TreeView_SetTextColor(hwndTreeCtrl, RGB(255, 255, 255)) ; // 背景色設定(comctrl32.dll v4.70〜) TreeView_SetBkColor(hwndTreeCtrl, RGB(0, 0, 0)) ; // 単に上記のようにやっただけでは+-ボタンや点線などには反映されないので // 下記のようにウィンドウスタイルの付け直しをやると完璧になる // ツリービューコントロールの現在のウィンドウスタイルを取得 lStyle = GetWindowLong(hwndTreeCtrl, GWL_STYLE) ; lStyle &= ~(TVS_HASBUTTONS|TVS_HASLINES|TVS_LINESATROOT) ; // 一度ウィンドウスタイルを外す SetWindowLong(hwndTreeCtrl, GWL_STYLE, lStyle) ; // ウィンドウスタイルを指定 lStyle |= (TVS_HASBUTTONS|TVS_HASLINES|TVS_LINESATROOT) ; // もう一度ウィンドウスタイルを設定 SetWindowLong(hwndTreeCtrl, GWL_STYLE, lStyle) ; return TRUE ; default : break ; } return FALSE; } //(MFC) ///////////////////////////////////////////////////////////////////////////// // WM_INITDIALOGハンドラ BOOL CTreeTestDlg::OnInitDialog() { CDialog::OnInitDialog(); : : // m_wndTree1はCTreeCtrl型のオブジェクト // テキスト色設定(comctrl32.dll v4.70〜) TreeView_SetTextColor(m_wndTree1.m_hWnd, RGB(255, 255, 255)) ; // 背景色設定(comctrl32.dll v4.70〜) TreeView_SetBkColor(m_wndTree1.m_hWnd, RGB(0, 0, 0)) ; // 単に上記のようにやっただけでは+-ボタンや点線などには反映されないので // 下記のようにウィンドウスタイルの付け直しをやると完璧になる // ツリービューコントロールの現在のウィンドウスタイルを取得 LONG lStyle = GetWindowLong(m_wndTree1.m_hWnd, GWL_STYLE) ; lStyle &= ~(TVS_HASBUTTONS|TVS_HASLINES|TVS_LINESATROOT) ; // 一度ウィンドウスタイルを外す SetWindowLong(m_wndTree1.m_hWnd, GWL_STYLE, lStyle) ; // ウィンドウスタイルを指定 lStyle |= (TVS_HASBUTTONS|TVS_HASLINES|TVS_LINESATROOT) ; // もう一度ウィンドウスタイルを設定 SetWindowLong(m_wndTree1.m_hWnd, GWL_STYLE, lStyle) ; return TRUE ; // TRUE を返すとコントロールに設定したフォーカスは失われません。 }
//-------------------------------------------------------------------------------- // //【TreeViewコントロールの背景色を変える・その2】 // //(MFC) ///////////////////////////////////////////////////////////////////////////// [TestDialog.h] class CTreeTestDlg : public CDialog { : : // 生成されたメッセージ マップ関数 //{{AFX_MSG(CTreeTestDlg) virtual BOOL OnInitDialog(); afx_msg void OnSysCommand(UINT nID, LPARAM lParam); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor); // カスタム描画用のハンドラ関数を追加 afx_msg void OnCustomDrawTree2(NMHDR* pNMHDR, LRESULT* pResult); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; ///////////////////////////////////////////////////////////////////////////// [TestDialog.cpp] BEGIN_MESSAGE_MAP(CTreeTestDlg, CDialog) //{{AFX_MSG_MAP(CTreeTestDlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_WM_CTLCOLOR() // カスタム描画用のメッセージマップを追加 ON_NOTIFY(NM_CUSTOMDRAW, IDC_TREE2, OnCustomDrawTree2) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // カスタム描画用関数 void CTreeTestDlg::OnCustomDrawTree2(NMHDR* pNMHDR, LRESULT* pResult) { // NMTVCUSTOMDRAWの部分がコントロールによって違う NMTVCUSTOMDRAW* lpCustomDraw = (NMTVCUSTOMDRAW*)pNMHDR ; if(lpCustomDraw->nmcd.dwDrawStage == CDDS_PREPAINT){ // アイテムの描画できるようにする *pResult = CDRF_NOTIFYITEMDRAW ; return ; } // アイテムが描画される時にここにくる if(lpCustomDraw->nmcd.dwDrawStage == CDDS_ITEMPREPAINT){ // テキスト色設定 lpCustomDraw->clrText = RGB(255, 255, 255) ; // 背景色設定 lpCustomDraw->clrTextBk = RGB(0, 0, 0) ; *pResult = 0 ; return ; } *pResult = 0 ; } ///////////////////////////////////////////////////////////////////////////// // クラスウィザードで追加したWM_CTLCOLORハンドラ //※カスタム描画はアイテムのみの描画なので、コントロールの背景を変更するために //WM_CTLCOLORメッセージを処理する必要がある HBRUSH CTreeTestDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor) ; // TODO: この位置で DC のアトリビュートを変更してください // ツリービューコントロールだったら専用のブラシを返す if(pWnd == &m_wndTree2) { // m_brhはコンストラクタなどであらかじめ作成しておいたブラシ hbr = m_brh ; } // TODO: デフォルトのブラシが望みのものでない場合には、違うブラシを返してください return hbr ; }
//-------------------------------------------------------------------------------- // //【選択されている項目のインデックスを取得する】 // { int nSelectedIndex = ListCtrl.GetNextItem(-1, LVIS_SELECTED) ; } //複数選択されている場合 GetNextItemの第一引数を変えながらループさせることによって取得可能。 { int index = -1 ; while((index = ListCtrl.GetNextItem(index, LVNI_ALL |LVNI_SELECTED)) != -1){ // index番目のアイテムが選択されている } }
//-------------------------------------------------------------------------------- // //【プログラムで特定行を選択状態にする】 // { ListCtrl.SetItemState( <選択したい行のインデックス>, LVIS_SELECTED | LVIS_FOCUSED , LVIS_SELECTED | LVIS_FOCUSED); }
//-------------------------------------------------------------------------------- // //【レポート形式のリストコントロールへのデータ挿入】 // { // レポート形式のリストコントロール(listControl)へカラムヘッダーとデータを挿入するサンプル TCHAR work[128] ; // カラム挿入処理 LV_COLUMN listcol ; listcol.mask = LVCF_TEXT | LVCF_WIDTH ; int line,column; for(column = 1 ; column <= 5 ; column++){ _stprintf(work, _T("Column-%d"), column) ; listcol.pszText = work ; listcol.cx = 75 ; listControl.InsertColumn(column, &listcol) ; } // データの挿入 LV_ITEM lvitem ; for(line = 1 ; line <= 10 ; line++){ // 行の挿入 lvitem.mask = LVIF_TEXT ; lvitem.iItem = line - 1 ; lvitem.iSubItem = 0 ; _stprintf(work, _T("%d-1"), line) ; lvitem.pszText = work ; listControl.InsertItem(&lvitem) ; // 列データの設定 for(column = 2 ; column <= 5 ; column++){ lvitem.iSubItem = column - 1 ; _stprintf(work, _T("%d-%d"), line, column) ; lvitem.pszText = work ; listControl.SetItem(&lvitem) ; } } }
//-------------------------------------------------------------------------------- // //【リッチエディットコントロールの特定部分の文字の属性を変更する】 // //(リッチエディットビューを使ったサンプルなので リッチエディットコントロールの参照を取得するのに GetRichEditCtrl()を使っている) { CHARFORMAT cfm ; cfm.cbSize = sizeof(cfm) ; // エディットコントロールに "This is Richedit control"の文字を設定 GetRichEditCtrl().SetWindowText(_T("This is Richedit control")) ; // "Richedit"の部分を選択 GetRichEditCtrl().SetSel(8, 16) ; // 選択部分の属性を取得 GetRichEditCtrl().GetSelectionCharFormat(cfm) ; // 選択した文字を赤色の太字斜体文字に変更します cfm.dwEffects = CFE_ITALIC | CFE_BOLD ; cfm.crTextColor = RGB(255, 0, 0) ; cfm.dwMask = CFM_COLOR | CFM_ITALIC | CFM_BOLD ; GetRichEditCtrl().SetSelectionCharFormat(cfm) ; }
//-------------------------------------------------------------------------------- // //【実行時に動的にコントロールを作成する】 // //(ダイアログクラスのOnInitDialog()での処理を想定したサンプルなので this は CDialogオブジェクトのポインタ) #define idBase 1000 #define left 20 #define top 20 #define height 20 #define width 120 #define hSpace 20 #define RECT(N) CRect(left, top + (height + hSpace) * N, left + width, top + (height + hSpace) * N + height) { int cnt = 0 ; // スタティックコントロールの作成 CStatic* pStatic = new CStatic() ; pStatic->Create("static", WS_VISIBLE | WS_CHILD, RECT(cnt), this, idBase + cnt) ; // エディットコントロールの作成 cnt++ ; CEdit* pEdit = new CEdit() ; pEdit->Create(WS_VISIBLE | WS_CHILD | WS_TABSTOP, RECT(cnt), this, idBase + cnt) ; pEdit->ModifyStyleEx(0,WS_EX_CLIENTEDGE, SWP_DRAWFRAME) ; // コンボボックスの作成 cnt++ ; CComboBox* pCombo = new CComboBox() ; // (注) 実際はCRectの高さは ドロップダウンしたときの高さを指定します pCombo->Create(WS_VISIBLE | WS_CHILD | WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST | CBS_HASSTRINGS, RECT(cnt), this, idBase + cnt) ; // オプションボタン1の作成 cnt++ ; CButton *pButton = new CButton ; pButton->Create("Button 1", WS_VISIBLE | WS_CHILD | BS_AUTORADIOBUTTON, RECT(cnt), this, idBase + cnt) ; // オプションボタン2の作成 cnt++ ; CButton* pButton2 = new CButton ; pButton2->Create("Button 2", WS_VISIBLE | WS_CHILD | BS_AUTORADIOBUTTON, RECT(cnt), this, idBase + cnt) ; }