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


RightFormVew.cpp 現在の全ソ-ス

// RightFormVew.cpp : RightFormVew クラスの実装
//

include “stdafx.h”

include “ControlPractice.h”

include “ControlPracticeDoc.h”

include “RightFormVew.h”

ifdef _DEBUG

define new DEBUG_NEW

endif

// RightFormVew

IMPLEMENT_DYNCREATE(RightFormVew, CFormView)

//これらのハンドラ-は必ず必要になります
BEGIN_MESSAGE_MAP(RightFormVew, CFormView)
ON_WM_SIZE()
ON_WM_DRAWITEM()
ON_WM_MEASUREITEM()
ON_BN_CLICKED(IDOK, &RightFormVew::OnBnClickedOk)
ON_BN_CLICKED(IDCANCEL, &RightFormVew::OnBnClickedCancel)
ON_BN_CLICKED(IDC_PRINT, &RightFormVew::OnBnClickedPrint)
ON_BN_CLICKED(IDC_BUTTON1, &RightFormVew::OnBnClickedButton1)
ON_BN_CLICKED(IDC_BUTTON2, &RightFormVew::OnBnClickedButton2)
ON_NOTIFY(MCN_SELECT, IDC_MONTHCALENDAR1, &RightFormVew::OnMcnSelectMonthcalendar1)
ON_NOTIFY(MCN_SELCHANGE, IDC_MONTHCALENDAR1, &RightFormVew::OnMcnSelchangeMonthcalendar1)
ON_NOTIFY(MCN_GETDAYSTATE, IDC_MONTHCALENDAR1, &RightFormVew::OnMcnGetdaystateMonthcalendar1)
ON_NOTIFY(NM_RCLICK, IDC_LIST1, &RightFormVew::OnNMRclickList1)
ON_NOTIFY(NM_CLICK, IDC_LIST1, &RightFormVew::OnNMClickList1)
ON_NOTIFY(NM_RETURN, IDC_LIST1, &RightFormVew::OnNMReturnList1)
ON_NOTIFY(NM_DBLCLK, IDC_LIST1, &RightFormVew::OnNMDblclkList1)
ON_WM_PAINT()
ON_NOTIFY(LVN_ENDSCROLL, IDC_LIST1, &RightFormVew::OnLvnEndScrollList1)
END_MESSAGE_MAP()

// RightFormVew コンストラクション/デストラクション

RightFormVew::RightFormVew()
: CFormView(RightFormVew::IDD)
{
// TODO: 構築コードをここに追加します。

}

RightFormVew::~RightFormVew()
{
}

void RightFormVew::DoDataExchange(CDataExchange* pDX)
{
CFormView::DoDataExchange(pDX);
DDX_Control(pDX, IDC_LIST1, CtlistControl1);
DDX_Control(pDX, IDCANCEL, cfITCANCEL);
DDX_Control(pDX, IDOK, ctITOK);
DDX_Control(pDX, IDC_MONTHCALENDAR1, ctCalender);
}

BOOL RightFormVew::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: この位置で CREATESTRUCT cs を修正して Window クラスまたはスタイルを
// 修正してください。

return CFormView::PreCreateWindow(cs);

}

//============================================================
//=================初期化が行われます=========================
//============================================================
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) ;

}

// RightFormVew 診断

ifdef _DEBUG

void RightFormVew::AssertValid() const
{
CFormView::AssertValid();
}

void RightFormVew::Dump(CDumpContext& dc) const
{
CFormView::Dump(dc);
}

CControlPracticeDoc* RightFormVew::GetDocument() const // デバッグ以外のバージョンはインラインです。
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CControlPracticeDoc)));
return (CControlPracticeDoc*)m_pDocument;
}

endif //_DEBUG

// RightFormVew メッセージ ハンドラ
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
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);

}
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// MeikingDish メッセージ ハンドラ
void RightFormVew::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
{
int test=0;
CControlPracticeDoc* pDoc = GetDocument();
//========================================================
switch(lHint){
case ID_FORM_RIGHT_UPDATE_ID_OK_DIS:
test=0;//メインフレ-から呼び出されます
break;
case ID_FORM_RIGHTUPDATE_ID_CANCSL_DIS:
test=0;//メインフレ-から呼び出されます
break;
//==================ビューが切り替わりが強要されました====================
case 0:
test=0;//このフレ-ムが作成された時この位置が呼び出されます
break;
}
}
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
void RightFormVew::CStringDataMoveToStaticEriyaReset()
{
CString vs=_T(” “);
try{
for(int item=0;item<100;item++){
for(int isub=0;isub<8;isub++){
_tcsncpy_s(RightFormVew_buffDim[item][isub],MAX_PATH,(LPCTSTR)vs,_TRUNCATE);
}
}
}catch(CMemoryException e){
e.ReportError();
e.Delete() ;
}
}
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
void RightFormVew::CStringDataMoveToStaticEriya(CString vs,int item,int isub)
{
try{
_tcsncpy_s(RightFormVew_buffDim[item][isub],MAX_PATH,(LPCTSTR)vs,_TRUNCATE);
}catch(CMemoryException e){
e.ReportError();
e.Delete() ;
}
}

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

//========================================================

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 ; //準備が完了したのでデ-タを表示します
                        lvi.iSubItem =0;
                        //=========================================
                        lvi.iItem    =nItem;
                        lvi.pszText =LeftFormVew_buffDim[nItem][0];
                        CtlistControl1.SetItem(&lvi);
                        for(int sub=0;sub<7;sub++){
                                    CString sb=CtlistControl1.GetItemText(nItem,sub);
                                    if(sb!=(CString)RightFormVew_buffDim[nItem][sub]){
                                                CtlistControl1.SetItemText(nItem,sub,RightFormVew_buffDim[nItem][sub]);
                                                }
                                    }
                        //=========================================
                        List1RowListControl(pDC,nItem);
                        break;
        }

}
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
void RightFormVew::List1RowListControl(CDC* pDC,int nItem)
{
CControlPracticeDoc* pDoc = GetDocument();

//=========================================================
COLORREF clrTextSave =pDC->SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT));
COLORREF clrBkSave = pDC->SetBkColor(::GetSysColor(COLOR_HIGHLIGHT));
//==================ブラシの初期化=========================    
CBrush cbrA,cbrB;
//RGB(255,241,0)  RGB(243,152,0) RGB(233,83,131) 
//RGB(143,195,31) RGB(0,153,217) RGB(237,109,70) 
cbrA.CreateSolidBrush(RGB(233, 83,131));
cbrB.CreateSolidBrush(RGB(255,255,255));
//=========================================================
CPen      pen;
CPen* pOldPen;
pen.CreatePen(PS_SOLID,1,LINE_COLOR);
pOldPen=pDC->SelectObject(&pen);
//=========================================================
CRect rcAllLabels;
CtlistControl1.GetItemRect(nItem, rcAllLabels, LVIR_BOUNDS);
//=========================================================
CRect lRect,rc;
pDC->SetTextColor(RGB(0,0,0));
//=========================================================
int topIndex=CtlistControl1.GetTopIndex();            //表示の先頭nItem
int nLast = topIndex+CtlistControl1.GetCountPerPage();//表示の後端nItem

//======================列幅は3個です======================
for(int i=0; i<3; i++){
        //=====================================
        pDC->SelectObject(&pen);    
        //=====================================
        CtlistControl1.GetSubItemRect(nItem,i,LVIR_BOUNDS,lRect);
        //================縦線===============
        pDC->MoveTo(lRect.left,lRect.top)    ;
        pDC->LineTo(lRect.left,lRect.bottom) ;
        //================横線===============
        pDC->MoveTo(lRect.left ,lRect.bottom);
        pDC->LineTo(lRect.right,lRect.bottom);
        //================文字を表示します==========
        lRect.right=CtlistControl1.GetColumnWidth(i);
        lRect.top+=1; lRect.bottom-=1;
        pDC->SetTextColor(RGB(0,0,0));
        //==========================================
        CString vt=_T("");
        vt.Format(_T("文字列=%s"),CtlistControl1.GetItemText(nItem,i));    
        pDC->DrawText(vt,-1,lRect,DT_LEFT | DT_SINGLELINE | DT_VCENTER);
        }

}
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
void RightFormVew::OnBnClickedOk()
{
CControlPracticeDoc* pDoc = GetDocument();
pDoc->FormVewNmcer |=0x21 ;//ID OK を設定
CWnd* pWnd=AfxGetMainWnd() ;
pWnd->SendMessage(ID_VEW_CHENGER);//メインフレ-ムへ指示を発信
}
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
void RightFormVew::OnBnClickedCancel()
{
CControlPracticeDoc* pDoc = GetDocument();
pDoc->FormVewNmcer |=0x22 ;//ID CANCEL を設定
CWnd* pWnd=AfxGetMainWnd() ;
pWnd->SendMessage(ID_VEW_CHENGER);//メインフレ-ムへ指示を発信
}
/////////////////////////////////////////////////////////////////////////////
///////////////////////// 印刷の実行 ///////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
void RightFormVew::OnBnClickedPrint()
{
CControlPracticeDoc* pDoc = GetDocument();
pDoc->FormVewNmcer |=0x44 ;//ID CANCEL を設定
CWnd* pWnd=AfxGetMainWnd() ;
pWnd->SendMessage(ID_VEW_CHENGER);//メインフレ-ムへ指示を発信
}
/////////////////////////////////////////////////////////////////////////////
////////////////////////ハ-ドコピ-読み出し/////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
void RightFormVew::OnBnClickedButton1()
{
CControlPracticeDoc* pDoc = GetDocument();

HANDLE hText     ;
HBITMAP hBitmap  ;
//=============================================================
CString val=_T(""),valC=_T("");
//=============================================================
OpenClipboard();
//=============================================================
if (IsClipboardFormatAvailable(CF_BITMAP)) {
                  hBitmap = (HBITMAP)GetClipboardData(CF_BITMAP);
                  m_pStatic->SetBitmap(hBitmap);
                  EmptyClipboard()             ;
                  }
else {
            hText = GetClipboardData(CF_UNICODETEXT);
            if(hText == NULL) ;
            else    {
                    val.Format(_T("%s"), GlobalLock(hText));
                    GlobalUnlock(hText) ;
                    EmptyClipboard()    ;
                    }
            }
//=============================================================
CloseClipboard();

}
/////////////////////////////////////////////////////////////////////////////
////////////////////////  ビットマップ保存ボタン  ///////////////////////
/////////////////////////////////////////////////////////////////////////////
void RightFormVew::OnBnClickedButton2()
{
BitmapToFilaeSave(_T(“TEST_BMP_FILE”));

}
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
void RightFormVew::BitmapToFilaeSave(CString FileName)
{
CControlPracticeDoc* pDoc = GetDocument();

//==============================================================
HBITMAP hBitmap,hBitmapPrev;
BITMAPINFO   *pbmi;
void        *pbits;
HANDLE       hfile;
//==============================================================
HDC      hDC ;
HDC hDCCompat;
//==============================================================
DWORD temp;
BITMAPFILEHEADER bmfh;
HWND hWnd=RightFormVew::m_hWnd;
hDC=::GetDC(hWnd);
//==============================================================
CString fNam=FileName+_T("bmp");
hBitmap=m_pStatic->GetBitmap() ;

//==============================================================
CRect rect,rectB;
GetWindowRect(rectB)           ;
m_pStaticB->GetWindowRect(rect);
//==============================================================
int ty=rect.top-rectB.top  ;
int tx=rect.left-rectB.left;
rect.top=ty ;rect.bottom=rect.top+128;
rect.left=tx;rect.right=rect.left+128;
int wih=rect.Width();
//==============================================================
pbmi=(BITMAPINFO*)new BYTE[sizeof(BITMAPINFO)]      ;
ZeroMemory(&pbmi->bmiHeader,sizeof(pbmi->bmiHeader));
pbmi->bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
pbmi->bmiHeader.biWidth =rect.Width() ;
pbmi->bmiHeader.biHeight=rect.Height();
pbmi->bmiHeader.biBitCount=GetDeviceCaps(hDC,BITSPIXEL);
pbmi->bmiHeader.biPlanes=1;
pbmi->bmiHeader.biSizeImage=(((pbmi->bmiHeader.biWidth*pbmi->bmiHeader.biBitCount+31)>>3)
                                                & 0xfffffffc)*pbmi->bmiHeader.biHeight;
//==============================================================
hBitmap=CreateDIBSection(hDC,pbmi,DIB_RGB_COLORS,&pbits,NULL,0);
hDCCompat=CreateCompatibleDC(hDC);
hBitmapPrev=(HBITMAP)SelectObject(hDCCompat,hBitmap);
BitBlt(hDCCompat,0,0,pbmi->bmiHeader.biWidth,pbmi->bmiHeader.biHeight,hDC,rect.left,rect.top,SRCCOPY);
//==============================================================
bmfh.bfType=0x4d42;
bmfh.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
bmfh.bfSize=bmfh.bfOffBits+pbmi->bmiHeader.biSizeImage;
//==============================================================
hfile=CreateFile(fNam,GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,0,NULL);
//==============================================================
WriteFile(hfile,&bmfh,sizeof(bmfh),&temp,NULL);
WriteFile(hfile,&pbmi->bmiHeader,sizeof(pbmi->bmiHeader),&temp,NULL);
SetFilePointer(hfile,bmfh.bfOffBits,NULL,FILE_BEGIN);
WriteFile(hfile,pbits,pbmi->bmiHeader.biSizeImage,&temp,NULL);
//==============================================================
CloseHandle(hfile)  ;
delete[] (BYTE*)pbmi;
//==============================================================

}

/////////////////////////////////////////////////////////////////////////////
/////////////////////// カレンダ-コントロ-ル /////////////////////////////
/////////////////////////////////////////////////////////////////////////////
void RightFormVew::OnMcnSelectMonthcalendar1(NMHDR *pNMHDR, LRESULT *pResult)
{
CString time ;
CControlPracticeDoc* pDoc = GetDocument();

LPNMSELCHANGE pSelChange = reinterpret_cast<LPNMSELCHANGE>(pNMHDR);
SYSTEMTIME st    ;
GetLocalTime(&st);
//==============================================================================
time.Format(_T("%d/%d/%d/%d:%d"),st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute);

*pResult = 0;

}

/////////////////////////////////////////////////////////////////////////////
/////////////////////// カレンダ-コントロ-ル /////////////////////////////
/////////////////////////////////////////////////////////////////////////////
void RightFormVew::OnMcnSelchangeMonthcalendar1(NMHDR *pNMHDR, LRESULT *pResult)
{
CString time ;
CControlPracticeDoc* pDoc = GetDocument();

LPNMSELCHANGE pSelChange = reinterpret_cast<LPNMSELCHANGE>(pNMHDR);
SYSTEMTIME st    ;
GetLocalTime(&st);
//==============================================================================
time.Format(_T("%d/%d/%d/%d:%d"),st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute);

*pResult = 0;

}

/////////////////////////////////////////////////////////////////////////////
/////////////////////// カレンダ-コントロ-ル /////////////////////////////
/////////////////////////////////////////////////////////////////////////////
void RightFormVew::OnMcnGetdaystateMonthcalendar1(NMHDR *pNMHDR, LRESULT *pResult)
{
CString time ;
CControlPracticeDoc* pDoc = GetDocument();

LPNMSELCHANGE pSelChange = reinterpret_cast<LPNMSELCHANGE>(pNMHDR);
SYSTEMTIME st    ;
GetLocalTime(&st);
//==============================================================================
time.Format(_T("%d/%d/%d/%d:%d"),st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute);

*pResult = 0;

}
/////////////////////////////////////////////////////////////////////////////
////////////////////リストボックスコントロ-ル///////////////////////////////
/////////////////////// 右 クリック //////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
void RightFormVew::OnNMRclickList1(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::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;

}
/////////////////////////////////////////////////////////////////////////////
////////////////////リストボックスコントロ-ル///////////////////////////////
/////////////////////// Return クリック ///////////////////////////////
/////////////////////////////////////////////////////////////////////////////
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;

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

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;

}


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