リストコントロ-ル・セルに文字列を設定

選択されたセルに文字列を入力できるようにします。さて!どの様に入れるのかをお見せします、貴方のアプリケ-ションに応用される事を期待しています。

リソ-スでedit controlを追加します

セル入力用EditeControlを配置

下記のコ-ドが操作されたキ-を一括に取得します、この中でEdito Box内に入力して改行キ-でEdito Boxから文字列を取得してセルにそのまま移動しEdito Boxは非表示に設定します。

EditeControlは選択されたセルの位置情報を読み取りEditeControlをそこへ移動して大きさを変更します、又この中にユザ-が操作した文字列を入れます、改行が入力されるまで自由に文字列を挿入してもらいます。改行された場合にはEditeControlの内容を取得して非表示にして入力は完了です。選択されたセルの情報からセルの大きさにEditeControlの大きさを合わせます。

文字入力検出部


/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
BOOL RightFormVew::PreTranslateMessage(MSG* pMsg)
{
CControlPracticeDoc* pDoc = GetDocument();

//=========================================================
CString sval=_T("");
//=========================================================
if(pMsg->message==WM_KEYDOWN){
        //===============================
        switch(pMsg->wParam){
               case VK_RETURN  :break;
               case VK_CONTROL :break;
               case VK_ESCAPE  :break;
               case VK_F1      :break;
               case VK_F2      :break;
               case VK_F3      :break;
               case VK_F4      :break;
               case VK_F5      :break;
               case VK_F6      :break;
               case VK_F7      :break;
               case VK_F8      :break;
               case VK_F9      :break;
               case VK_F10     :break;
               case VK_UP      :break;
               case VK_LEFT    :break;
               case VK_DOWN    :break;
               case VK_RIGHT   :break;
               case VK_DELETE  :break;
               case VK_INSERT  :break; 
               }
        }
return CFormView::PreTranslateMessage(pMsg);

}


ダブルクリックで編集開始です

セルがダブルクリックされた時にctFlotingEditBoxを選択されたセルの位置に重ねて大きさを等しく変更してから表示します。

/////////////////////////////////////////////////////////////////////////////
////////////////////リストボックスコントロ-ル///////////////////////////////
/////////////////////// ダブルクリック //////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
void RightFormVew::OnNMDblclkList1(NMHDR *pNMHDR, LRESULT *pResult)
{
CControlPracticeDoc* pDoc = GetDocument();

//=======================================-
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
NMLVDISPINFO *pdi=(NMLVDISPINFO*)pNMHDR;

if (pNMLV->iItem<0) return; *pResult = 0;
//=======================================-
CString sval=_T("");
sval.Format(_T("%s"),CtlistControl1.GetItemText(pNMLV->iItem,0));
pDoc->ms_ClickAfter.Oldnitem  =pDoc->ms_ClickAfter.nitem  ;//セル番号を過去へ移動
pDoc->ms_ClickAfter.OldsubItem=pDoc->ms_ClickAfter.subItem;//セル番号を過去へ移動
pDoc->ms_ClickAfter.OldnmId   =pDoc->ms_ClickAfter.nmId   ;//過去のLIST_ID番号を過去へ
//=======================================-
pDoc->ms_ClickAfter.DbleClick=true;
pDoc->ms_ClickAfter.RightClick=pDoc->ms_ClickAfter.Click=false;
pDoc->ms_ClickAfter.nmId=IDC_LIST1;
pDoc->ms_ClickAfter.nitem=pNMLV->iItem     ;//選択されたセル番号
pDoc->ms_ClickAfter.subItem=pNMLV->iSubItem;//選択されたセル番号
//=======================================
CRect EdirRect,rect,clientRect,rectB;
//=========================================================================================
GetWindowRect(rectB)  ;
//=========================================================================================
int scrolV=26,scrolX=0;
//=========================================================================================
int scPos  =CtlistControl1.GetScrollPos(SB_HORZ)  ;
int scLimit=CtlistControl1.GetScrollLimit(SB_HORZ); 
//============================= セルの大きさを取得します ==================================
CtlistControl1.GetWindowRect(clientRect);
CtlistControl1.GetSubItemRect(pNMLV->iItem,pNMLV->iSubItem,LVIR_BOUNDS,rect);
sval=CtlistControl1.GetItemText(pNMLV->iItem,pNMLV->iSubItem);
//=========================================================================================
int offset=(rect.right-rect.left)-scLimit;  
//=========================================================================================
int ty=clientRect.top-rectB.top  ;
int tx=clientRect.left-rectB.left;  
//===============================大きさと表示位置を計算します==============================
ctFlotingEditBox.MoveWindow(rect.left+tx+2,rect.top+ty+2,rect.Width()+1,rect.Height())    ;
EdirRect=CRect(rect.left+17,rect.top+scrolV,ctList1_ControlWidthCrm1.cx+2,rect.Height()+1);
//=============================== Edite Controlを表示します ===============================
ctFlotingEditBox.ShowWindow(SW_SHOW) ;
ctFlotingEditBox.SetFocus()          ;
ctFlotingEditBox.SetRect(&EdirRect)  ;
ctFlotingEditBox.SetWindowTextW(sval);
//=========================================================================================
CtlistControl1.Invalidate(FALSE)     ;//再表示を行います

}


セル内に数字が入りました


OnDrawItem変更

/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
void RightFormVew::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
CControlPracticeDoc* pDoc = GetDocument();

CString val;
//========================================================

CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
CRect rcItem(lpDrawItemStruct->rcItem);
int nItem = lpDrawItemStruct->itemID  ;

//=============================================
LV_ITEM     lvi;
switch(lpDrawItemStruct->CtlID) {
        case IDC_LIST1:
                        lvi.mask = LVIF_TEXT | LVIF_IMAGE |LVIF_PARAM ; //準備が完了したのでデ-タを表示します
                        //=========================================
                        for(int sub=0;sub<4;sub++){
                                    lvi.iItem   =nItem;
                                    lvi.iSubItem=sub  ;
                                    lvi.pszText =RightFormVew_buffDim[nItem][sub];
                                    val.Format(_T("%s"),lvi.pszText);
                  //現在のリストデ-タと異なるか判定し,異なる場合だけ更新します
                                    if(val !=CtlistControl1.GetItemText(nItem,sub)){
                                                CtlistControl1.SetItem(&lvi);
                                                }
                                    }
                        //=========================================
                        List1RowListControl(pDC,nItem);
                        break;
        }

}


操作sw情報取得

/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
BOOL RightFormVew::PreTranslateMessage(MSG* pMsg)
{
CControlPracticeDoc* pDoc = GetDocument();

//=========================================================
CString sval=_T("");
//=========================================================
if(pMsg->message==WM_KEYDOWN){
        //===============================
        switch(pMsg->wParam){
               case VK_RETURN  ://現在は改行だけ判定します
                            ctFlotingEditBox.GetWindowTextW(sval);//挿入されたデ-タを取り出します
                                if(sval!=_T("")){
                                       CStringDataMoveToStaticEriya(sval,pDoc->ms_ClickAfter.nitem,pDoc->ms_ClickAfter.subItem);
                                       pDoc->ms_ClickAfter.DbleClick=FALSE ;
                                       ctFlotingEditBox.ShowWindow(SW_HIDE);//編集が終了 EditeControlを非表示にします
                                       }                       
                                break;
               case VK_CONTROL :break;
               case VK_ESCAPE  :break;
               case VK_F1      :break;
               case VK_F2      :break;
               case VK_F3      :break;
               case VK_F4      :break;
               case VK_F5      :break;
               case VK_F6      :break;
               case VK_F7      :break;
               case VK_F8      :break;
               case VK_F9      :break;
               case VK_F10     :break;
               case VK_UP      :break;
               case VK_LEFT    :break;
               case VK_DOWN    :break;
               case VK_RIGHT   :break;
               case VK_DELETE  :break;
               case VK_INSERT  :break; 
               }
        }
return CFormView::PreTranslateMessage(pMsg);

}


リストコントロ-ルのセル選択を実装(3)


追加中