listcttrlにeditコントロールとcombo boxコントロールを追加する方法

5761 ワード

1.メンバー変数の定義:CComboBox m_Cmb;、、コンボボックスコントロールに関連付ける、
CEdit m_Edit;、、編集ボックスコントロールに関連付けるint m_row,m_col;//ユーザーがクリックしたセルの行と列番号を記録する.listcttrlを追加するクリック応答メッセージは、主にクリックが完了したらコントロールを表示します.追加コードは次のとおりです.
void CControllerDialogAdd::OnClickListDoor(NMHDR*pNMHDR,LRESULT* pResult){///TODO:Add your control notification handler code here LPNMLISTVIEW pNMTreeView=reinterpret_cast(pNMHDR);///TODO:ここにコントロール通知ハンドプログラムコードPOINT PT; GetCursorPos(&PT);m_DoorList.ScreenToClient(&PTPTPTPTPTPT);m_DoorList.ScreenToClient(&PTPTPTPTPTPTPTPTPTPTPTPTPTPTPTPT);&PTPTPTPTPTPTPTPTPT);    LVHITTESTINFO hitInfo;    hitInfo.pt=PT;   //hitem=m_Tree.GetSelectedItem(); m_DoorList.SubItemHitTest(&hitInfo);if(hitInfo.flags&LVHT_ONITEMLABEL)//テキスト上で{CRect rect;//m_DoorList.GetSubItemRect(hitInfo.iItem,hitInfo.iSubItem,LVIR_BOUNDS,rect);m_DoorList.GetSubItemRect(hitInfo.iItem,hitInfo.iSubItem,LVIR_BOUNDS,rect);if(hitInfo.iSubItem==0)        {            rect.right=rect.left+m_DoorList.GetColumnWidth(0);}else if(hitInfo.iSubItem==1)//列を判断ここで私は1、2はedit、3,4はcombo box{CString mes=m_DoorList.GetItemText(hitInfo.iItem,hitInfo.iSubItem);//rect.InflateRect(0,0,0);//組合せボックスの高さを大きくしてテキスト全体を収容できるようにする.m_col=hitInfo.iSubItem;m_row=hitInfo.iItem;m_Edit.MoveWindow(&rect,TRUE);m_Edit.ShowWindow(SW_NORMAL);        m_Edit.SetWindowText(mes);  m_Edit.BringWindowToTop();        m_Edit.SetFocus();//コンボボックスをフォーカス
}else if(hitInfo.iSubItem==2){CString mes=m_DoorList.GetItemText(hitInfo.iItem,hitInfo.iSubItem);//rect.InflateRect(0,0,0);//コンボボックスの高さを大きくしてテキスト全体を収容できるようにする.m_col=hitInfo.iSubItem;m_row=hitInfo.iItem;m_Edit.MoveWindow(&rect,TRUE);  m_Edit.ShowWindow(SW_NORMAL);        m_Edit.SetWindowText(mes);  m_Edit.BringWindowToTop();        m_Edit.SetFocus();//コンボボックスをフォーカス
}else if(hitInfo.iSubItem=3){CString mes=m_DoorList.GetItemText(hitInfo.iItem,hitInfo.iSubItem);//rect.InflateRect(0,0,0);//コンボボックスの高さを大きくしてテキスト全体を収容できるようにします.m_col=hitInfo.iSubItem;m_row=hitInfo.iItem;m_Act.MoveWindow(&rect,TRUE);  m_ComAct.ShowWindow(SW_NORMAL);        m_ComAct.SetWindowText(mes);  m_ComAct.BringWindowToTop();        m_ComAct.SetFocus();//コンボボックスフォーカス}else if(hitInfo.iSubItem=4){CString mes=m_DoorList.GetItemText(hitInfo.iItem,hitInfo.iSubItem);//rect.InflateRect(0,0,0,0);//コンボボックスの高さを大きくして、テキスト全体を収容できます.        m_col=hitInfo.iSubItem;        m_row=hitInfo.iItem;          m_ControlType.MoveWindow(&rect,TRUE);  m_ControlType.ShowWindow(SW_NORMAL);        m_ControlType.SetWindowText(mes);     m_ControlType.BringWindowToTop();        m_ControlType.SetFocus();//コンボボックスをフォーカス}*pResult=0にします. } }
 
3.ダイアログの初期化時に、次のコードを追加します:m_Cmb.SetParent(&m_List);//CComboBoxの座標がリストコントロールに対してあることを確認します.
m_Edit.SetParent(&m_List);//Editコントロールの座標がリストコントロールに対してあることを確認します.
4.ユーザーマウスがCComboBoxコントロールから離れる時、セルテキストを設定し、CComboBoxコントロールを隠す
ユーザーがマウスで編集コントロールを離れると、セルのテキストを設定し、編集コントロールを非表示にします.
まず、CComboBoxコントロールのCBN_を追加します.KILLFOCUSメッセージとEditコントロールのEN_KILLFOCUSメッセージ
追加コードは次のとおりです.
void CControllerDialogAdd::OnKillfocusComboActive()/TODO:ここにコントロール通知ハンドラコードPOINT pt;//int i,j;GetCursorPos(&pt);
    m_DoorList.ScreenToClient(&pt);
    CRect rect;    m_DoorList.GetSubItemRect(m_row,m_col,LVIR_BOUNDS,rect);if(!rect.PtInRect(pt)//ノードテキスト領域内{CString text;m_ComAct.GetWindowText(text);m_DoorList.SetItemText(m_row,m_col,text);m_ComAct.ShowWindow(SW_HIDE)//コンボボックスを非表示
    }
}
 
 
void CControllerDialogAdd::OnKillfocusEdit1() {   POINT pt;      GetCursorPos(&pt);
    m_DoorList.ScreenToClient(&pt);
    CRect rect;    m_DoorList.GetSubItemRect(m_row,m_col,LVIR_BOUNDS,rect);if(!rect.PtInRect(pt)//ノードテキスト領域内{CString text;m_Edit.GetWindowText(text);m_DoorList.SetItemText(m_row,m_col,text);m_Edit.ShowWindow(SW_HIDE)//コンボボックスを非表示
    } }
 
5.ユーザーがCComboboxで[Enter]キーを押すと、セルテキストを設定し、CComboBoxコントロールを非表示にする

    
    
    
    
BOOL CListDlg1Dlg::PreTranslateMessage(MSG * pMsg) { if (pMsg -> wParam == VK_RETURN) { int i,j; CString text; m_Cmb.GetWindowText(text); m_List.SetItemText(m_row,m_col,text); m_Cmb.ShowWindow(SW_HIDE); // return TRUE; // , , } return CDialog::PreTranslateMessage(pMsg); }