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

現在のリストコントロールのセルを選択した場合に反転させる機能を組み込みます、この場合は選択項目が現在と過去を制御してセルが外れた場合(過去)とセルが新しく(現在)選択された事を知り切り替える事が必要になります。そこで管理用の構造体を追加します。


ドキュメン・ヘッダへこの構造体を登録します

この関数は過去・現在のセル情報を保持して選択セルの反転及び非反転を制御します。

/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
typedef struct CLICK_AFTER{
int nmId;
int nitem;
int subItem;
int OldnmId;
int Oldnitem;
int OldsubItem;
BOOL Click;
BOOL Delate;
BOOL DbleClick;
BOOL RightClick;
}s_ClickAfter;


イベントハンドラ-を追加

/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
void RightFormVew::OnNMClickList1(NMHDR *pNMHDR, LRESULT *pResult)
{
CControlPracticeDoc* pDoc = GetDocument();

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

if (pNMLV->iItem<0) return; *pResult = 0;

}

/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
void RightFormVew::OnNMReturnList1(NMHDR *pNMHDR, LRESULT *pResult)
{
CControlPracticeDoc* pDoc = GetDocument();

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

if (pNMLV->iItem<0) return; *pResult = 0;

}

/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
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;

}


右側画面、現在の初期化状況

RightFormVew.hの内容です

穴が開くほど注意深く眺めて下さいフォ-ムビュ-の基本パタ-ンです。

// RightFormVew.h : RightFormVew クラスのインターフェイス
//

pragma once

include “afxcmn.h”

include “afxwin.h”

include “afxdtctl.h”

class RightFormVew : public CFormView
{
protected: // シリアル化からのみ作成します。
RightFormVew();
DECLARE_DYNCREATE(RightFormVew)

public:
enum{ IDD = IDD_RIGHT_Vew };
////////////////////////////////////////////////////////////////
CStatic* m_pStatic,m_pStaticB; CMonthCalCtrl ctCalender;//カレンダーコントロール // 属性 public: CControlPracticeDoc GetDocument() const;
////////////////////////////////////////////////////////////////
void CStringDataMoveToStaticEriyaReset();
void CStringDataMoveToStaticEriya(CString vs,int item,int isub);
////////////////////////////////////////////////////////////////
void BitmapToFilaeSave(CString FileName);

// 操作
public:

// オーバーライド
public:
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV サポート
virtual void OnInitialUpdate(); // 構築後に初めて呼び出されます。

// 実装
public:
virtual ~RightFormVew();
void List1RowListControl(CDC* pDC,int nItem);

ifdef _DEBUG

virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;

endif

protected:
virtual void OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint);
virtual BOOL PreTranslateMessage(MSG* pMsg);

    // 生成された、メッセージ割り当て関数

protected:
DECLARE_MESSAGE_MAP()
public:
CListCtrl CtlistControl1;
afx_msg void OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct);
afx_msg void OnBnClickedOk();
afx_msg void OnBnClickedCancel();
CButton ctITOK;
CButton cfITCANCEL;
afx_msg void OnBnClickedPrint();
afx_msg void OnBnClickedButton1();
afx_msg void OnBnClickedButton2();
afx_msg void OnMcnSelectMonthcalendar1(NMHDR *pNMHDR, LRESULT *pResult);
afx_msg void OnMcnSelchangeMonthcalendar1(NMHDR *pNMHDR, LRESULT *pResult);
afx_msg void OnMcnGetdaystateMonthcalendar1(NMHDR *pNMHDR, LRESULT *pResult);
afx_msg void OnNMRclickList1(NMHDR *pNMHDR, LRESULT *pResult);
afx_msg void OnNMClickList1(NMHDR *pNMHDR, LRESULT *pResult);
afx_msg void OnNMReturnList1(NMHDR *pNMHDR, LRESULT *pResult);
afx_msg void OnNMDblclkList1(NMHDR *pNMHDR, LRESULT *pResult);
afx_msg void OnPaint();
afx_msg void OnLvnEndScrollList1(NMHDR *pNMHDR, LRESULT *pResult);
};

ifndef _DEBUG // RightFormVew.cpp のデバッグ バージョン

inline CControlPracticeDoc* RightFormVew::GetDocument() const
{ return reinterpret_cast(m_pDocument); }

endif


//============================================================
//=================初期化が行われます=========================
//============================================================
void RightFormVew::OnInitialUpdate()
{
CFormView::OnInitialUpdate(); //これらの関数は必ず必要になります
GetParentFrame()->RecalcLayout(); //これらの関数は必ず必要になります
ResizeParentToFit(); //これらの関数は必ず必要になります

//============================================================
//============================================================
//============================================================
HBITMAP hBitmap ;
m_pStatic =new CStatic();
hBitmap = ::LoadBitmap(AfxGetResourceHandle(), MAKEINTRESOURCE(IDB_BMPIMG));
m_pStatic->Create(TEXT(“BMP”),WS_CHILD | WS_VISIBLE | SS_BITMAP | SS_CENTERIMAGE,CRect(0,0,574,30),this);
m_pStatic->ShowWindow(SW_HIDE);
m_pStatic->SetBitmap(hBitmap) ;

//============================================================
//================   移動と大きさ設定       ==================
//============================================================
CtlistControl1.MoveWindow(50,10,295,100); //大きさと配置を調整  

//============================================================
//============================================================
LV_COLUMN  lvc;
lvc.mask = LVCF_FMT  | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
//============================================================
for (int i=0;i<3;i++){
        lvc.iSubItem= i;
        lvc.pszText=RightFormColumnLabel[i];
        lvc.cx     =(int)(RightFormWidth[i]);
        lvc.fmt    =RightFormFmt[i];
        CtlistControl1.InsertColumn(i,&lvc);
        }

//============================================================
//============================================================
//============================================================
LV_ITEM     lvi;
lvi.mask = LVIF_TEXT | LVIF_IMAGE |LVIF_PARAM ; 
lvi.iSubItem =0;

for(int i=0;i<10;i++){//行数を増やしました
       lvi.iItem    =i;
       lvi.pszText =RightFormVew_buffDim[i][0];
       CtlistControl1.InsertItem(&lvi);
       }
//初期化が終了しましたた
CtlistControl1.ShowWindow(SW_SHOW) ;

}

/////////////////////////////////////////////////////////////////////////////
//////////////////////// 再表示が必要です ///////////////////////////////
/////////////////////////////////////////////////////////////////////////////

void RightFormVew::OnPaint()
{
CPaintDC dc(this); // device context for painting
}

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

//=======================================-
LPNMLVSCROLL pStateChanged = reinterpret_cast<LPNMLVSCROLL>(pNMHDR);

CtlistControl1.Invalidate(FALSE);//リスト・コントロ-ルがスクロルされて-再表示が必要です

*pResult = 0;

}


セル選択時の反転処理を追加して行きます

これからドンドンコ-ドと処理が追加されて行きます、しかしながらこれらの処理は基本中の基本です必ず身に着けて下さい。さてそこでセルを選択すると選択箇所が反転されるのですがこの操作が一番始めならば問題は有りませんしかし2番目に操作されたのであれば前回の選択された箇所も反転されています、と!言う事は2か所のセルが反転されて残っています。ですからこれでは問題があるのです。

更にビュ-が切り替わり又このフォ-ムが表示されたら何もデータが無くなってしまうのではエンドユザ-が怒るでしょうね、なんだこれは!と、なのでこのビュ-の情報は全てドキュメントクラスが保持しなくては行けないのです、又このビュ-が再開された時には当然ながら前回の状態が再現されて表示されなくては行けません、勿論このフォ-ムビュ-内の全てです。ですから構造体にこのフォ-ムビュ-の情報を保持する必要が有ります。この場合ファイルとして保存する事も有りですが!まだ小さいですからドキュメントクラスに直に保持させても良いでしょう。


MFC BMPイメージを保存するには   MFC ハードコピ-を取り込むには    BMPファイルのアクセス


追加中