// CellCtrl.cpp : Defines the initialization routines for the DLL. // #include "stdafx.h" #include "CellCtrl.h" #include "LogCtrl.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CCellCtrl #define CHECKRGB(c) (c > 255 ? 255 : c) #define DIVCLR(c) RGB(CHECKRGB(GetRValue(c)*1.5),\ CHECKRGB(GetGValue(c)*1.5),\ CHECKRGB(GetBValue(c)*1.5)) class CListSort { public: // The sort depend on the EnumDataType. We can extent the type ... enum SortDataType { dtNULL = 0, dtINT, dtDEC, dtSTRING, dtSTRINGNOCASE, dtDATETIME }; CListSort(CCellCtrl *pList, const int nCol) { m_pList = pList; ASSERT(m_pList); int totItems = m_pList->GetItemCount(); // Replace All Item Data with pointer to CSortItem class for (int i = 0; i < totItems; i++) { DWORD dw = static_cast(m_pList->GetItemData(i)); CString txt = m_pList->GetItemText(i, nCol); m_pList->SetItemData(i, (DWORD) new CSortItem(dw, txt)); } } virtual ~CListSort() { ASSERT(m_pList); int totItems = m_pList->GetItemCount(); for (int i = 0; i < totItems; i++) { CSortItem *pItem = (CSortItem*)(m_pList->GetItemData(i)); ASSERT(pItem); m_pList->SetItemData(i, pItem->m_dw); if (pItem) { delete pItem; pItem = NULL; } } } void Sort(BOOL bAsc, SortDataType dtType) { long lParamSort = bAsc ? dtType : -dtType; m_pList->SortItems(Compare, lParamSort); } protected: CCellCtrl *m_pList; static int CALLBACK Compare(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) { CSortItem *pItem1 = (CSortItem*)lParam1; CSortItem *pItem2 = (CSortItem*)lParam2; ASSERT(pItem1 && pItem2); int nOrder = (lParamSort < 0) ? -1 : 1; SortDataType dtType = (SortDataType) (lParamSort * nOrder); // get rid of sign switch (dtType) { case /*SortDataType::*/dtINT: return (_ttoi(pItem1->m_txt) - _ttoi(pItem2->m_txt)) * nOrder; case /*SortDataType::*/dtDEC: return (int) ((_tcstod(pItem1->m_txt,NULL) - _tcstod(pItem2->m_txt,NULL)) * nOrder); case /*SortDataType::*/dtSTRING: return pItem1->m_txt.Compare(pItem2->m_txt) * nOrder; case /*SortDataType::*/dtSTRINGNOCASE: return pItem1->m_txt.CompareNoCase(pItem2->m_txt) * nOrder; case /*SortDataType::*/dtDATETIME: { COleDateTime time1, time2; if (time1.ParseDateTime(pItem1->m_txt) && time2.ParseDateTime(pItem2->m_txt)) return ((time1 == time2) ? 0 : (time1 < time2 ? -1 : 1)) * nOrder; } default: ASSERT("Error: attempt to sort a column without type."); return 0; } } class CSortItem { public: CSortItem(const DWORD dw, const CString &txt) : m_txt(txt),m_dw(dw){;} virtual ~CSortItem() {;} DWORD m_dw; CString m_txt; }; }; CCellCtrl::CCellCtrl() { m_bSort=TRUE;//Sort Flag m_bTime=FALSE;//SetTimer Flag m_bTurnDraw=FALSE;//Item Color Convert m_pFont=NULL;//¸®½ºÆ® ÆùÆ® m_pUmenu=NULL;//»ç¿ëÀÚ ¸Þ´º m_edLct.nItem=0;//¿¡µðÆ®¹Ú½º À§Ä¡ m_edLct.nSubItem=0; m_mcLct.nItem=0;//¸¶¿ì½º Ŭ¸¯ À§Ä¡ m_mcLct.nSubItem=0; m_bCanEdit = FALSE; m_pInfo=new CELLINFO;//¸®½ºÆ® ¸Þ½ÃÁö Á¤º¸ m_nClipOptin=CCellCtrl::clipNO;//Ŭ¸³º¸µå state } CCellCtrl::~CCellCtrl() { m_menu.DestroyMenu(); m_edit.DestroyWindow(); if(m_pFont) { m_pFont->DeleteObject(); delete m_pFont; m_pFont = NULL; } if(m_pInfo) delete m_pInfo; m_pInfo = NULL; } BEGIN_MESSAGE_MAP(CCellCtrl, CListCtrl) //{{AFX_MSG_MAP(CCellCtrl) // ON_WM_CONTEXTMENU() ON_NOTIFY_REFLECT(NM_RCLICK, OnRclick) ON_WM_HSCROLL() ON_NOTIFY_REFLECT(LVN_COLUMNCLICK, OnColumnclick) ON_WM_VSCROLL() ON_WM_MOUSEWHEEL() ON_NOTIFY_REFLECT(LVN_INSERTITEM, OnInsertitem) ON_NOTIFY_REFLECT(LVN_DELETEITEM, OnDeleteitem) ON_NOTIFY_REFLECT(LVN_DELETEALLITEMS, OnDeleteallitems) ON_WM_TIMER() ON_WM_DESTROY() ON_WM_MEASUREITEM() ON_WM_CTLCOLOR() ON_WM_LBUTTONDOWN() //}}AFX_MSG_MAP ON_NOTIFY_REFLECT ( NM_CUSTOMDRAW, OnCustomdrawList ) ON_COMMAND(CCMSG_OPEN_EXCEL, OnOpenExcel) ON_COMMAND(CCMSG_OPEN_LIST, OnOpenList) ON_COMMAND(CCMSG_SAVE_FILE, OnSaveFile) ON_COMMAND(CCMSG_USE_EDIT, OnUseEdit) ON_COMMAND(CCMSG_MOVE_EDIT, OnMoveEdit) ON_COMMAND(CCMSG_RECT_CHANGE, OnRectchange) ON_COMMAND(CCMSG_LIST_PRINT, OnListPrint) ON_COMMAND(CCMSG_FONT_CHANGE, OnFontChange) ON_COMMAND(CCMSG_COPY_CLIPBOARD, OnCopyClipboard) ON_COMMAND(CCMSG_PASTE_CLIPBOARD, OnPasteClipboard) ON_COMMAND(CCMSG_CUT_CLIPBOARD, OnCutClipboard) ON_COMMAND(CCMSG_SELITEM_DELETE, OnSelItemDelete) ON_COMMAND(CCMSG_BACK_COLOR, OnBackColor) ON_COMMAND(CCMSG_TEXT_COLOR, OnTextColor) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CCellCtrl message handlers /* void CCellCtrl::OnContextMenu(CWnd* pWnd, CPoint point) { if(point.x==-1 && point.y==-1) { // ScreenToClient(&point); point=CPoint(0,0); ClientToScreen(&point); } if(m_pUmenu) { CWnd* pParWnd = GetParent(); m_pUmenu->TrackPopupMenu( TPM_CENTERALIGN | TPM_RIGHTBUTTON, point.x, point.y, pWnd, 0); } else if(m_menu.GetSafeHmenu()) { m_menu.TrackPopupMenu( TPM_CENTERALIGN | TPM_RIGHTBUTTON, point.x, point.y, pWnd, 0); } } */ void CCellCtrl::UseMenu(UINT nOption) { m_pUmenu=NULL; //¸Þ´º¸¦ »ç¿ëÇÏÁö ¾ÊÀ» °æ¿ì if(nOption==CCellCtrl::menuNO) { if(m_menu.GetSafeHmenu()) m_menu.DestroyMenu(); return; } if(m_menu.GetSafeHmenu()) m_menu.DestroyMenu(); m_menu.CreatePopupMenu( ); //clipboard Option // if(nOption & CCellCtrl::menuCOPY) // m_menu.AppendMenu(MF_STRING, CCMSG_COPY_CLIPBOARD, "º¹»ç Ctrl+C"); // if(nOption & CCellCtrl::menuPASTE) // m_menu.AppendMenu(MF_STRING, CCMSG_PASTE_CLIPBOARD,"ºÙ¿©³Ö±â Ctrl+V"); // if(nOption & CCellCtrl::menuCUT) // m_menu.AppendMenu(MF_STRING, CCMSG_CUT_CLIPBOARD, "Àß¶ó³»±â Ctrl+X"); // if(nOption & CCellCtrl::menuDELETE) // m_menu.AppendMenu(MF_STRING, CCMSG_SELITEM_DELETE, "»èÁ¦ Ctrl+Del"); // if(nOption & CCellCtrl::menuBACKCOLOR) // m_menu.AppendMenu(MF_STRING, CCMSG_BACK_COLOR, "¹è°æ»ö ¼³Á¤"); // if(nOption & CCellCtrl::menuTEXTCOLOR) // m_menu.AppendMenu(MF_STRING, CCMSG_TEXT_COLOR, "±Û»ö ¼³Á¤"); // if(nOption & 0xFFFF0000) // m_menu.AppendMenu(MF_SEPARATOR); //menu Option // if(nOption & CCellCtrl::menuINPUT) // m_menu.AppendMenu(MF_STRING, CCMSG_USE_EDIT,"ÀÔ·Â"); if(nOption & CCellCtrl::menuSAVE) m_menu.AppendMenu(MF_STRING, CCMSG_SAVE_FILE,_T("Àüȯ(Excel)")); if(nOption & CCellCtrl::menuEXCEL) m_menu.AppendMenu(MF_STRING, CCMSG_OPEN_EXCEL,_T("ÆÄÀÏ¿­±â(Excel)")); // if(nOption & CCellCtrl::menuLIST) // m_menu.AppendMenu(MF_STRING, CCMSG_OPEN_LIST,"ÆÄÀÏ¿­±â(List)"); // if(nOption & CCellCtrl::menuPRINT) // m_menu.AppendMenu(MF_STRING, CCMSG_LIST_PRINT,"ÇÁ¸°Æ®"); // if(nOption & CCellCtrl::menuFONT) // m_menu.AppendMenu(MF_STRING, CCMSG_FONT_CHANGE,"ÆùÆ® ¼³Á¤"); } void CCellCtrl::SerializeAllInfo(CArchive& ar) { if (ar.IsStoring()) { // storing code } else { } } void CCellCtrl::Serialize(CArchive& ar) { if (ar.IsStoring()) { // storing code CString strText=""; TCHAR szText[256]; int i=0, j=0, nCol=0, nRow=0; LVCOLUMN lvcol; memset(&lvcol, NULL, sizeof(lvcol)); lvcol.mask = LVCF_TEXT; lvcol.pszText=szText; lvcol.cchTextMax=256; while(GetColumn(nCol, &lvcol)) { strText += lvcol.pszText; strText += ","; lvcol.iSubItem=nCol++; } strText.TrimRight(_T(",")); strText+=_T("\n"); ar.WriteString(strText); //¸®½ºÆ® ¾ÆÀÌÅÛÀÇ ¹®ÀÚ¿­À» °¡Á®¿Â´Ù. nRow=GetItemCount(); for( i=0; i=0) // { // str=strText.Mid(nStart, nEnd-nStart); // InsertColumn(++nCol, str, LVCFMT_LEFT, 100); // nStart=nEnd+1; // } // str=strText.Mid(nStart, nStart+256); // InsertColumn(nCol, str, LVCFMT_LEFT, 100); // } // LIST while(ar.ReadString(strText)) { if(strText.IsEmpty()) break; nStart=0; nCol=0; InsertItem(nRow,_T("")); while((nEnd=strText.Find(_T(","), nStart))>=0) { str=strText.Mid(nStart, nEnd-nStart); SetItemText(nRow, nCol++, str); nStart=nEnd+1; } str=strText.Mid(nStart, nStart+256); SetItemText(nRow, nCol, str); nRow++; } } } int CCellCtrl::GetSubItemCount() { LV_COLUMN lvcol; lvcol.mask = LVCF_FMT; int iColCnt=0; while(GetColumn( ++iColCnt, &lvcol) ){}; return iColCnt; } void CCellCtrl::OnRectchange() { CRect rectLC; CRect rectED; rectLC.SetRectEmpty(); rectED.SetRectEmpty(); m_edit.GetWindowRect(rectED); if(m_edLct.nSubItem) GetSubItemRect( m_edLct.nItem, m_edLct.nSubItem,LVIR_BOUNDS,rectLC); else GetSubItemRect( m_edLct.nItem, m_edLct.nSubItem,LVIR_LABEL,rectLC); ClientToScreen(rectLC); if(rectED.IsRectEmpty() || rectLC.IsRectEmpty()) return; if( rectED.left==rectLC.left && rectED.Width()==rectLC.Width()) return; PostMessage(WM_COMMAND,CCMSG_MOVE_EDIT); } void CCellCtrl::OnUseEdit() { UseEdit( m_mcLct.nItem, m_mcLct.nSubItem); } void CCellCtrl::OnMoveEdit() { CRect rect; CString strLCtxt=_T(""); if(m_edLct.nSubItem) GetSubItemRect( m_edLct.nItem, m_edLct.nSubItem,LVIR_BOUNDS,rect); else GetSubItemRect( m_edLct.nItem, m_edLct.nSubItem,LVIR_LABEL,rect); if(GetStyle()&LVS_REPORT && rect.topnId =GetDlgCtrlID(); m_pInfo->nItem =m_edLct.nItem; m_pInfo->nSubItem=m_edLct.nSubItem; m_pInfo->lpstrNew=(LPWSTR)(LPCTSTR)strLCtxt; m_pInfo->lpstrOld=(LPWSTR)(LPCTSTR)strLCtxt; CWnd* pWnd=GetParent(); ::SendMessage(pWnd->m_hWnd, CCMSG_LIST, (WPARAM)CCMSG_MOVE_EDIT, (LPARAM)m_pInfo); } BOOL CCellCtrl::UseEdit( int nItem, int nSubItem) { if(nItem<0 || nSubItem<0) return 0; m_edLct.nItem=nItem; m_edLct.nSubItem=nSubItem; CRect rect; if(!m_edit.GetSafeHwnd()) { CFont* pFont=GetFont(); m_edit.Create(ES_LEFT | ES_AUTOHSCROLL | WS_BORDER | WS_CHILD ,rect,this,0); m_edit.SetFont(pFont); } PostMessage(WM_COMMAND,CCMSG_MOVE_EDIT); return 1; } void CCellCtrl::UpdateEdit(int nItem, int nSubItem) { if(m_mcLct.nItem==nItem && m_mcLct.nSubItem==nSubItem) { if(m_edit.GetSafeHwnd() && m_edit.IsWindowVisible()) PostMessage(WM_COMMAND,CCMSG_RECT_CHANGE); } } BOOL CCellCtrl::IsModifyEdit(int nItem, int nSubItem) { CString strEDtxt=""; CString strLCtxt=""; m_edit.GetWindowText(strEDtxt); strLCtxt = GetItemText(nItem, nSubItem); SetItemText(nItem,nSubItem,strEDtxt); if(strEDtxt==strLCtxt) return 0; memset(m_pInfo, NULL, sizeof(CELLINFO)); m_pInfo->nId = GetDlgCtrlID(); m_pInfo->nItem = nItem; m_pInfo->nSubItem= nSubItem; m_pInfo->lpstrNew= (LPWSTR)(LPCTSTR)strEDtxt; m_pInfo->lpstrOld= (LPWSTR)(LPCTSTR)strLCtxt; CWnd* pWnd=GetParent(); ::SendMessage(pWnd->m_hWnd, CCMSG_LIST, (WPARAM)CCMSG_MODIFY_EDIT, (LPARAM)m_pInfo); int nn=CCMSG_LIST; return 1; } void CCellCtrl::EditCtrl(MSG msg) { TCHAR szKey[128]=_T(""); int nSChar=0,nEChar=0; CString string=""; int nICnt=GetItemCount()-1; int nSCnt=GetSubItemCount()-1; int nItem=m_edLct.nItem; int nSubItem=m_edLct.nSubItem; if((CWnd*)&m_edit != GetFocus()) { m_edit.SetFocus(); GetKeyNameText( static_cast(msg.lParam), szKey, sizeof(szKey)); if(wcslen(szKey)==1) m_edit.SetWindowText(szKey); m_edit.SetSel(1,1); } switch(msg.wParam) { case VK_UP: if(m_edLct.nItem<1) return; m_edLct.nItem--; SetItemState(m_edLct.nItem,LVIS_FOCUSED ,LVIS_FOCUSED ); EnsureVisible(m_edLct.nItem, TRUE); break; case VK_DOWN: if(nICnt<=m_edLct.nItem)return; m_edLct.nItem++; SetItemState(m_edLct.nItem,LVIS_FOCUSED ,LVIS_FOCUSED ); EnsureVisible(m_edLct.nItem, TRUE); break; case VK_LEFT: if(m_edLct.nSubItem<1)return; // m_edit.GetSel(nSChar, nEChar); // if(nSChar!=nEChar) // { // m_edit.SetSel(nSChar, nSChar); // return; // } m_edLct.nSubItem--; break; case VK_RIGHT: if(nSCnt<=m_edLct.nSubItem)return; // m_edit.GetSel(nSChar, nEChar); // if(nSChar!=nEChar) // { // m_edit.SetSel(nEChar, nEChar); // return; // } m_edLct.nSubItem++; break; case VK_HOME: m_edLct.nSubItem=0; break; case VK_END: m_edLct.nSubItem=nSCnt; break; case VK_PRIOR: return; case VK_NEXT: return; case VK_RETURN: msg.wParam=VK_DOWN; EditCtrl(msg); return; case VK_ESCAPE: m_edit.ShowWindow(FALSE); return; default: return; } //¿¡µðÆ® ¹Ú½ºÀÇ ¹®ÀÚ¿­°ú ¸®½ºÆ®¿¡ ÀÖ´Â ¹®ÀÚ¿­°ú ºñ±³ÇÏ¿© //´Ù¸¦ °æ¿ì ¿¡µðÆ® ¹Ú½ºÀÇ ¹®ÀÚ¿­À» ¸®½ºÆ®¿¡ ÀÔ·ÂÇÑ´Ù. IsModifyEdit(nItem, nSubItem); UpdateCell(m_edLct.nItem, m_edLct.nSubItem); PostMessage(WM_COMMAND,CCMSG_MOVE_EDIT);//¿¡µðÆ®¹Ú½º À̵¿ } void CCellCtrl::UpdateCell(int nItem, int nSubItem) { CRect rect; if(nSubItem==0) GetSubItemRect(nItem,nSubItem,LVIR_LABEL,rect); else GetSubItemRect(nItem,nSubItem,LVIR_BOUNDS,rect); InvalidateRect(&rect); } void CCellCtrl::OnRclick(NMHDR* pNMHDR, LRESULT* pResult) { NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; m_mcLct.nItem=pNMListView->iItem; m_mcLct.nSubItem=pNMListView->iSubItem; *pResult = 0; } void CCellCtrl::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { if(m_edit.GetSafeHwnd() && m_edit.IsWindowVisible()) PostMessage(WM_COMMAND,CCMSG_MOVE_EDIT); CListCtrl::OnVScroll(nSBCode, nPos, pScrollBar); } void CCellCtrl::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { // TODO: Add your message handler code here and/or call default if(m_edit.GetSafeHwnd() && m_edit.IsWindowVisible()) PostMessage(WM_COMMAND,CCMSG_MOVE_EDIT); CListCtrl::OnHScroll(nSBCode, nPos, pScrollBar); } void CCellCtrl::OnColumnclick(NMHDR* pNMHDR, LRESULT* pResult) { NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; if(!m_bSort) return; static BOOL bAsc=TRUE; CString strText=GetItemText(0,pNMListView->iSubItem); COleDateTime oleTime; CListSort listSort(this,pNMListView->iSubItem); if(bAsc)bAsc=FALSE; else bAsc=TRUE; if(strText.IsEmpty()) listSort.Sort(bAsc,CListSort/*::SortDataType*/::dtSTRING); else if(oleTime.ParseDateTime(strText)) listSort.Sort(bAsc,CListSort/*::SortDataType*/::dtDATETIME); else if(_ttoi(strText) || strText.GetAt(0)=='0') listSort.Sort(bAsc,CListSort/*::SortDataType*/::dtINT); else listSort.Sort(bAsc,CListSort/*::SortDataType*/::dtSTRING); *pResult = 0; } BOOL CCellCtrl::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt) { // TODO: Add your message handler code here and/or call default if(m_edit.GetSafeHwnd() && m_edit.IsWindowVisible()) PostMessage(WM_COMMAND,CCMSG_MOVE_EDIT); return CListCtrl::OnMouseWheel(nFlags, zDelta, pt); } HBRUSH CCellCtrl::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CListCtrl::OnCtlColor(pDC, pWnd, nCtlColor); // TODO: Change any attributes of the DC here CELLCOLOR cellcolor; if(GetItemColor(m_edLct.nItem, m_edLct.nSubItem, &cellcolor)) { if(m_edit.IsWindowVisible()) { m_brush.DeleteObject(); pDC->SetBkMode(TRANSPARENT); pDC->SetTextColor(cellcolor.txtclr); m_brush.CreateSolidBrush(cellcolor.bkgclr); return (HBRUSH)m_brush; } } return hbr; } BOOL CCellCtrl::PreTranslateMessage(MSG* pMsg) { switch(pMsg->message) { case WM_LBUTTONDBLCLK: break; case WM_LBUTTONDOWN: break; case WM_RBUTTONDOWN: break; case WM_LBUTTONUP: HitTest(CPoint(static_cast(pMsg->wParam), static_cast(pMsg->lParam))); break; case WM_MOUSEMOVE: break; case WM_KEYDOWN: if(m_edit.GetSafeHwnd() && m_edit.IsWindowVisible()) { if(!IsMultiKey()) EditCtrl(*pMsg); } if(GetKeyState(VK_CONTROL) & 128) { if((CWnd*)&m_edit == GetFocus()) break; switch(pMsg->wParam) { case 'C': CopyClipboard(); break; case 'V': PasteClipboard(); break; case 'X': CutClipboard(); break; case VK_DELETE: SelectItemDelete(); break; } } } return CListCtrl::PreTranslateMessage(pMsg); } void CCellCtrl::OnSaveFile() { CFileDialog fileDlg( FALSE, NULL, NULL, OFN_CREATEPROMPT | OFN_OVERWRITEPROMPT, _T("Excel Data Files (*.csv)|*.csv||"), this ); if(fileDlg.DoModal()!=IDOK) return; //ÆÄÀÏ À̸§À» °¡Á®¿Â´Ù. CString filename = fileDlg.GetFileName(); CString extname = fileDlg.GetFileExt(); extname.MakeLower(); //ÆÄÀÏÀÇ È®Àå¸íÀÌ ÀÖ´ÂÁö üũ if(extname.IsEmpty() || extname!="csv") filename+=".csv"; CFile wfile(filename, CFile::modeCreate | // CFile::modeNoTruncate | CFile::modeWrite | CFile::typeBinary); CArchive ar(&wfile, CArchive::store); Serialize(ar); } void CCellCtrl::OnOpenExcel() { CFileDialog fileDlg( TRUE, NULL, NULL, OFN_CREATEPROMPT | OFN_OVERWRITEPROMPT, _T("Data Files (*.xlc;*.xls;*.csv)|*.xlc; *.xls ; *.csv|All Files (*.*)|*.*||")); if(fileDlg.DoModal()!=IDOK) return; //ÆÄÀÏ À̸§À» °¡Á®¿Â´Ù. CString filename = fileDlg.GetPathName(); ShellExecute(m_hWnd, _T("open"), filename,NULL, NULL, SW_SHOW); } void CCellCtrl::OnOpenList() { CFileDialog fileDlg( TRUE, NULL, NULL, OFN_CREATEPROMPT | OFN_OVERWRITEPROMPT, _T("Excel Data Files (*.csv)|*.csv||"), this ); if(fileDlg.DoModal()!=IDOK) return; //ÆÄÀÏ À̸§À» °¡Á®¿Â´Ù. CString filename = fileDlg.GetFileName(); CString extname = fileDlg.GetFileExt(); extname.MakeLower(); //ÆÄÀÏÀÇ È®Àå¸íÀÌ ÀÖ´ÂÁö üũ if(extname.IsEmpty() || extname!="csv") filename+=".csv"; CFile rfile(filename, CFile::modeCreate | CFile::modeNoTruncate | CFile::modeRead | CFile::typeBinary); DeleteAllItems(); CArchive ar(&rfile, CArchive::load); Serialize(ar); } void CCellCtrl::OnListPrint() { ListPrinting(TRUE); } void CCellCtrl::OnFontChange() { LOGFONT logfont; CFont *pFont=GetFont(); pFont->GetLogFont(&logfont); CFontDialog fontDlg( &logfont, CF_EFFECTS | CF_BOTH, NULL, this ); if(fontDlg.DoModal()!=IDOK) return; fontDlg.GetCurrentFont( &logfont); SetListFont(&logfont); } void CCellCtrl::OnBackColor() { CELLCOLOR cellClr; COLORREF newBkgclr; CColorDialog clrDlg; CWnd* pWnd=GetParent(); int nID = GetDlgCtrlID(); int nSubItemCnt=GetSubItemCount(); if(clrDlg.DoModal()!=IDOK) return; newBkgclr = clrDlg.GetColor(); POSITION pos=GetFirstSelectedItemPosition(); while(1) { if(!pos) break; int nItem=GetNextSelectedItem(pos); for( int nSubItem=0; nSubItemnId = nID; m_pInfo->nItem = nItem; m_pInfo->nSubItem=nSubItem; m_pInfo->oldClr.bkgclr = cellClr.bkgclr; m_pInfo->newClr.bkgclr = newBkgclr; SetItemBkColor(nItem, nSubItem, newBkgclr, IsTurning(nItem, nSubItem)); UpdateCell(nItem,nSubItem); ::SendMessage(pWnd->m_hWnd, CCMSG_LIST, (WPARAM)CCMSG_BACK_COLOR, (LPARAM)m_pInfo); } } } void CCellCtrl::OnTextColor() { CELLCOLOR cellClr; COLORREF newTxtclr; CColorDialog clrDlg; CWnd* pWnd=GetParent(); int nID = GetDlgCtrlID(); int nSubItemCnt=GetSubItemCount(); if(clrDlg.DoModal()!=IDOK) return; newTxtclr = clrDlg.GetColor(); POSITION pos=GetFirstSelectedItemPosition(); while(1) { if(!pos) break; int nItem=GetNextSelectedItem(pos); for( int nSubItem=0; nSubItemnId = nID; m_pInfo->nItem=nItem; m_pInfo->nItem=nSubItem; m_pInfo->oldClr.txtclr=cellClr.txtclr; m_pInfo->newClr.txtclr=newTxtclr; SetItemTextColor( nItem, nSubItem, newTxtclr); ::SendMessage(pWnd->m_hWnd, CCMSG_LIST, (WPARAM)CCMSG_TEXT_COLOR, (LPARAM)m_pInfo); } Update(nItem); } } BOOL CCellCtrl::ListPrinting(BOOL bDialog, int Orientation) { CPrintDC printDC; CDC* pDC; pDC= printDC.GetPrintDC(Orientation, bDialog); if(!pDC)return 0; Printing(pDC); return 1; } void CCellCtrl::SetListFont(LOGFONT* plogfont) { if(m_pFont) { delete m_pFont; m_pFont=NULL; } EnsureVisible( 0, TRUE); m_pFont=new CFont; m_pFont->CreateFontIndirect(plogfont); SetFont(m_pFont); if(m_edit.GetSafeHwnd()) { m_edit.SetFont(m_pFont); PostMessage(WM_COMMAND,CCMSG_MOVE_EDIT); } if(GetSafeHead()) { m_head.FontChange(*plogfont); Update(0); } } BOOL CCellCtrl::GetSafeHead() { if((GetStyle() & LVS_TYPEMASK)==LVS_REPORT) { if(!m_head.GetSafeHwnd()) m_head.SubclassWindow(GetHeaderCtrl()->m_hWnd); return 1; } return 0; } BOOL CCellCtrl::IsMultiKey() { int vKey=0; UCHAR kBuf[256]; GetKeyboardState(kBuf); if(kBuf[VK_CONTROL] & 128) return 1; if (kBuf[VK_SHIFT] & 128) return 1; return 0; } void CCellCtrl::Printing(CDC* pDC) { DOCINFO di; CLogCtrl logctrl; int nHeadCnt =m_head.GetCount(); int nItemCnt =GetItemCount(); int nSubItemCnt=GetSubItemCount(); int nMode = pDC->SetMapMode(MM_ISOTROPIC); int nVertres=pDC->GetDeviceCaps(VERTRES); int nVertSize=pDC->GetDeviceCaps(VERTSIZE); int nHorzres=pDC->GetDeviceCaps(HORZRES); int nHorzSize=pDC->GetDeviceCaps(HORZSIZE); SetCrtToPrintRate(pDC); int nHeight = GetLogRect(pDC, 0, 0).Height(); if (nHeight==0) return ; int nPageItemCnt = (nVertres-(nVertSize*3))/nHeight; memset(&di,NULL,sizeof(di)); di.cbSize = sizeof(DOCINFO); di.lpszDocName = _T("¸®½ºÆ® Ãâ·Â"); int i=0,j=0; int nTopIndex=0; while(1) { CRect rect; CString strText; CLogPage logpage; logpage.RemoveRow(10); logpage.SetColCount(nSubItemCnt); logpage.SetRowCount(nPageItemCnt); for( i=0; i=GetItemCount()) break; for( j=0; j=GetItemCount()) break; nTopIndex+=(nPageItemCnt-nHeadCnt); } pDC->SetMapMode(MM_TEXT); logctrl.Draw(pDC,&di); pDC->SetMapMode(nMode); return; } CRect CCellCtrl::GetLogRect(CDC* pDC, int nItem, int nSubItem) { CRect rect; if(nSubItem) { GetSubItemRect(nItem,nSubItem,LVIR_BOUNDS,rect); } else { GetSubItemRect(nItem,nSubItem,LVIR_LABEL,rect); rect.left=0; } pDC->LPtoDP(&rect); return rect; } int CCellCtrl::GetColumnFmt(int nSubItem) { LV_COLUMN lvcol; lvcol.mask = LVCF_FMT; GetColumn( nSubItem, &lvcol); lvcol.fmt &=0x0f; switch(lvcol.fmt) { case LVCFMT_LEFT: lvcol.fmt=DT_LEFT; break; case LVCFMT_RIGHT: lvcol.fmt=DT_RIGHT; break; case LVCFMT_CENTER: lvcol.fmt=DT_CENTER;break; default: lvcol.fmt=DT_CENTER;break; } return lvcol.fmt; } void CCellCtrl::SetCrtToPrintRate(CDC* pPntDC) { int iWidth=GetCrtWidth(); float fPntWidth=(float)pPntDC->GetDeviceCaps(HORZRES); float fPntHeight=(float)pPntDC->GetDeviceCaps(VERTRES); int iHeight= (int)((float)iWidth * (fPntHeight/fPntWidth)); pPntDC->SetWindowExt(iWidth, iHeight); pPntDC->SetViewportOrg( pPntDC->GetDeviceCaps(HORZSIZE), pPntDC->GetDeviceCaps(VERTSIZE)*3); pPntDC->SetViewportExt( (int)fPntWidth-(pPntDC->GetDeviceCaps(HORZSIZE)), (int)fPntHeight-(pPntDC->GetDeviceCaps(VERTSIZE)*2)); } //¸®½ºÆ®ÀÇ SubItem°ú À©µµ¿ìÀÇ Å©±âÁß Å«°ªÀ» ¸®ÅÏÇÑ´Ù. int CCellCtrl::GetCrtWidth() { CRect rect; CRect rectClient; GetSubItemRect(0,0,LVIR_BOUNDS,rect); GetClientRect(rectClient); rect|=rectClient; return rect.Width(); } void CCellCtrl::OnInsertitem(NMHDR* pNMHDR, LRESULT* pResult) { NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; *pResult = 0; } void CCellCtrl::OnDeleteitem(NMHDR* pNMHDR, LRESULT* pResult) { NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; DeleteItemData(pNMListView->iItem); *pResult = 0; } void CCellCtrl::OnDeleteallitems(NMHDR* pNMHDR, LRESULT* pResult) { NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; DeleteAllItemData(); *pResult = 0; } void CCellCtrl::DeleteItemData(int nItem) { CCSArray* pcsAry= (CCSArray*)GetItemData(nItem); if(!pcsAry) return; pcsAry->RemoveAll(); if (pcsAry) { delete pcsAry; pcsAry = NULL; } SetItemData(nItem, 0); } void CCellCtrl::DeleteAllItemData() { int count = GetItemCount(); for( int i=0; iGetSize()<=nSubItem) return 0; pCellClr->txtclr=(*pcsAry)[nSubItem].txtclr; pCellClr->bkgclr=(*pcsAry)[nSubItem].bkgclr; return 1; } BOOL CCellCtrl::SetItemBkColor(int nItem, int nSubItem, COLORREF color, bool bTurn) { if(!m_bTime) { m_bTime=true; SetTimer(GetDlgCtrlID(),500, NULL); } int nSubItemCount = GetSubItemCount(); int nItemCount = GetItemCount(); if(nItemCount<=nItem || nSubItemCount<=nSubItem) return 0; //¾ÆÀÌÅÛ¿¡ µ¥ÀÌÅͰ¡ Á¸ÀçÇÏÁö ¾ÊÀ» °æ¿ì »ý¼ºÇÑ´Ù. CCSArray* pcsAry = (CCSArray*)GetItemData(nItem); if(!pcsAry) { pcsAry = new CCSArray; pcsAry->SetSize(nSubItemCount); SetItemData(nItem, (DWORD)pcsAry); } if(pcsAry->GetSize()<=nSubItem) { pcsAry->SetAtGrow(nSubItem, CCellData(clrTEXT, color, bTurn)); } else { (*pcsAry)[nSubItem].bkgclr=color; (*pcsAry)[nSubItem].bTurn=bTurn; } return 1; } bool CCellCtrl::IsTurning(int nItem, int nSubItem) { CCSArray* pcsAry = (CCSArray*)GetItemData(nItem); if(!pcsAry) return 0; return (*pcsAry)[nSubItem].bTurn; } BOOL CCellCtrl::SetCellData(int nItem, int nSubItem, DWORD dwUserData) { int nSubItemCount = GetSubItemCount(); int nItemCount = GetItemCount(); if(nItemCount<=nItem || nSubItemCount<=nSubItem) return 0; //¾ÆÀÌÅÛ¿¡ µ¥ÀÌÅͰ¡ Á¸ÀçÇÏÁö ¾ÊÀ» °æ¿ì »ý¼ºÇÑ´Ù. CCSArray* pcsAry = (CCSArray*)GetItemData(nItem); if(!pcsAry) { pcsAry = new CCSArray; pcsAry->SetSize(nSubItemCount); SetItemData(nItem, (DWORD)pcsAry); } if(pcsAry->GetSize()<=nSubItem) pcsAry->SetAtGrow(nSubItem, CCellData(clrTEXT, clrBACK, false, dwUserData)); else (*pcsAry)[nSubItem].dwData=dwUserData; return 1; } DWORD CCellCtrl::GetCellData(int nItem, int nSubItem) { CCSArray* pcsAry = (CCSArray*)GetItemData(nItem); if(!pcsAry) return 0; if(pcsAry->GetSize()<=nSubItem) return 0; return (*pcsAry)[nSubItem].dwData; } BOOL CCellCtrl::SetItemTextColor(int nItem, int nSubItem, COLORREF color) { int nSubItemCount = GetSubItemCount(); int nItemCount = GetItemCount(); if(nItemCount<=nItem || nSubItemCount<=nSubItem) return 0; //¾ÆÀÌÅÛ¿¡ µ¥ÀÌÅͰ¡ Á¸ÀçÇÏÁö ¾ÊÀ» °æ¿ì »ý¼ºÇÑ´Ù. CCSArray* pcsAry = (CCSArray*)GetItemData(nItem); if(!pcsAry) { pcsAry = new CCSArray; pcsAry->SetSize(nSubItemCount); SetItemData(nItem, (DWORD)pcsAry); } if(pcsAry->GetSize()<=nSubItem) pcsAry->SetAtGrow(nSubItem, CCellData(color, clrBACK, false)); else (*pcsAry)[nSubItem].txtclr=color; return 1; } BOOL CCellCtrl::SetItemBkColor(int nItem, COLORREF color, bool bTurn) { int nSubItemCount=GetSubItemCount(); for(int i=0; i( pNMHDR ); // Take the default processing unless we set this to something else below. *pResult = CDRF_DODEFAULT; // First thing - check the draw stage. If it's the control's prepaint // stage, then tell Windows we want messages for every item. if ( CDDS_PREPAINT == pLVCD->nmcd.dwDrawStage ) { *pResult = CDRF_NOTIFYITEMDRAW; } else if ( CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage ) { // This is the notification message for an item. We'll request // notifications before each subitem's prepaint stage. *pResult = CDRF_NOTIFYSUBITEMDRAW; } else if ( (CDDS_ITEMPREPAINT | CDDS_SUBITEM) == pLVCD->nmcd.dwDrawStage ) { CELLCOLOR cellclr; int nItem= static_cast( pLVCD->nmcd.dwItemSpec ); BOOL bRtn = GetItemColor(nItem, pLVCD->iSubItem, &cellclr); pLVCD->clrTextBk= clrBACK; if(bRtn) { pLVCD->clrText = cellclr.txtclr; pLVCD->clrTextBk= cellclr.bkgclr; } else { pLVCD->clrText = GetTextColor(); pLVCD->clrTextBk= GetTextBkColor(); } if( m_bTurnDraw && IsTurning(nItem, pLVCD->iSubItem)) { pLVCD->clrText = DIVCLR(cellclr.txtclr); pLVCD->clrTextBk= DIVCLR(cellclr.bkgclr); } UpdateEdit(nItem, pLVCD->iSubItem); } } void CCellCtrl::CopyClipboard() { if(!(m_nClipOptin & clipCOPY)) return; if(!OpenClipboard()) return; EmptyClipboard(); int nSubItemCount=GetSubItemCount(); TCHAR* pBuff; TCHAR* szDivide=_T(" ");//TAB KEY CString strCopyData=""; HGLOBAL hGlobal; POSITION pos=GetFirstSelectedItemPosition(); while(1) { if(!pos) break; int nItem=GetNextSelectedItem(pos); CString strText=""; for( int i=0; i=0) { SetItemText(nItem, nCol++, strText.Mid(nStart, nEnd-nStart)); nStart=nEnd+1; } SetItemText(nItem, nCol, strText.Mid(nStart, nStart+256)); nItem++; } GlobalUnlock(hData); CloseClipboard(); } void CCellCtrl::CutClipboard() { CopyClipboard(); SelectItemDelete(); } void CCellCtrl::SelectItemDelete() { if(!(m_nClipOptin & clipDELETE)) return; ShowWindow(FALSE); int nItem=GetItemCount()-1; while(1) { if(nItem==-1) break; nItem = GetNextItem(nItem, LVNI_ABOVE|LVNI_SELECTED); DeleteItem(nItem); } ShowWindow(TRUE); } int CCellCtrl::GetHeadHeight() { if(GetSafeHead()) return m_head.GetHeadHeight(); return 0; } int CCellCtrl::GetHeadItemCount() { if(GetSafeHead()) return m_head.GetCount(); return 0; } void CCellCtrl::SetHeadItemCount(int nCount) { if(GetSafeHead()) { m_head.SetCount(nCount,GetFont()); Update(0); Invalidate(); } } BOOL CCellCtrl::DeleteColumn( int nCol ) { if(GetSafeHead()) m_head.DeleteColumn(nCol); return CListCtrl::DeleteColumn( nCol ); } int CCellCtrl::InsertColumn(int nCol, LPCTSTR lpstTxt ,int nFormat, int nWidth, int nSubItem) { int nRtn=CListCtrl::InsertColumn(nCol,lpstTxt,nFormat,nWidth,nSubItem); if(GetSafeHead()) { m_head.InsertColumn(nCol); m_head.SetItemText(0, nCol, CT2A(lpstTxt)); } return nRtn; } void CCellCtrl::SetHeadItemText(int nItem, int nSubItem, LPCTSTR lpstTxt) { if(!GetSafeHead()) return; m_head.SetItemText(nItem, nSubItem, CT2A(lpstTxt)); } CString CCellCtrl::GetHeadItemText(int nItem, int nSubItem) { if(!GetSafeHead()) return ""; return m_head.GetItemText(nItem, nSubItem); } void CCellCtrl::SetHeadItemMerge(int nsItem, int nsSubItem, int neItem, int neSubItem) { if(!GetSafeHead()) return; m_head.SetItemMerge(nsItem, nsSubItem, neItem, neSubItem); } int CCellCtrl::GetLeftSubItem() { CRect rect; int nSubItemCount = GetSubItemCount(); for( int i=0; i0) return i; } return -1; } int CCellCtrl::GetRightSubItem() { CRect rect,vRect; GetClientRect(vRect); int nSubItemCount = GetSubItemCount(); for( int i=GetLeftSubItem(); ivRect.right) return i; } return nSubItemCount; } void CCellCtrl::OnTimer(UINT_PTR nIDEvent) { if(GetDlgCtrlID()!=(int)nIDEvent) return; if(m_bTurnDraw) m_bTurnDraw=FALSE; else m_bTurnDraw=TRUE; int nItemCnt = GetItemCount(); int nsItem=GetTopIndex(); int neItem=GetCountPerPage()+nsItem+1; int nsSubI=GetLeftSubItem(); int neSubI=GetRightSubItem(); neItem= neItem < nItemCnt ? neItem:nItemCnt; for( int i=nsItem; i 0 || m_edLct.nSubItem > 0) { IsModifyEdit(m_edLct.nItem, m_edLct.nSubItem); UpdateCell(m_edLct.nItem, m_edLct.nSubItem); } LVHITTESTINFO pItem; pItem.pt = point; int test = SubItemHitTest(&pItem); int nCol,nRow; nRow = pItem.iItem; nCol = pItem.iSubItem; if(nRow != -1 && nCol != -1) UseEdit(nRow, nCol); else m_edit.ShowWindow(FALSE); } CListCtrl::OnLButtonDown(nFlags, point); }