// TKImageDlg.cpp : implementation file // #include "stdafx.h" #include "TKImageDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif TCHAR g_szDirName[256] = _T(""); //申请自己的16K缓冲区 ///////////////////////////////////////////////////////////////////////////// // CTKImageDlg dialog IMPLEMENT_DYNAMIC(CTKImageDlg, CAcUiDialog) CTKImageDlg::CTKImageDlg(UINT IDD, CWnd* pParent /*=NULL*/) : CAcUiDialog(IDD, pParent), m_pPopupMenu(NULL) { //{{AFX_DATA_INIT(CTKImageDlg) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT m_bInit = FALSE; m_bBiginEdit = FALSE; m_bSort = FALSE; m_bIsDelTree = FALSE; m_nOldSizeX=558; m_nOldSizeY=437; // ZJQ add 2 lines m_nIndex=-1; m_nFindIndex=-1; // 当前查找索引项 m_bMultiSel=FALSE; } CTKImageDlg::~CTKImageDlg() { if(m_pPopupMenu) { m_pPopupMenu->DestroyMenu(); delete m_pPopupMenu; } } void CTKImageDlg::DoDataExchange(CDataExchange* pDX) { CAcUiDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CTKImageDlg) DDX_Control(pDX, IDC_PIC_IMAGE, m_ImageBox); DDX_Control(pDX, IDC_VSBAR, m_vsBar); DDX_Control(pDX, IDC_S_DESCRIPTION, m_ctrlDescription); DDX_Control(pDX, IDC_TK_LIST, m_listCtrl); DDX_Control(pDX, IDC_TK_TREE, m_treeCtrl); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CTKImageDlg, CAcUiDialog) //{{AFX_MSG_MAP(CTKImageDlg) ON_WM_PAINT() ON_WM_VSCROLL() ON_WM_SIZE() ON_COMMAND(ID_BLK_PAGEUP, OnBlkPageUp) ON_COMMAND(ID_BLK_PAGEDOWN, OnBlkPageDown) ON_WM_CREATE() ON_COMMAND(IDOK, OnOK) ON_WM_LBUTTONDBLCLK() //}}AFX_MSG_MAP ON_COMMAND_RANGE(ID_LAYOUT1X1, ID_LAYOUT5X4, OnLayout) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CTKImageDlg message handlers BOOL CTKImageDlg::SelectIndex(int selindex) { // 选择总目 if (!IsValid(selindex)) return FALSE; int lastImage = CurImage(); int lastPage = CurPage(); m_nIndex = selindex; int curPage = CurPage(); int curImage = CurImage(); if(curPage!=lastPage) { /*turn page*/ SetupImage(TRUE); SwapFlipImage(-1, curImage); m_vsBar.SetScrollPos(CurPage() * m_nPageRow); // 使滚动条跟着发生变化 } else { SwapFlipImage(lastImage, curImage); } return TRUE; } void CTKImageDlg::OnSize(UINT nType, int cx, int cy) { if(m_bInit && (!nType || nType==SIZE_MAXIMIZED)) { CSize sizeOld = sizeDlg; sizeDlg.cx = cx; sizeDlg.cy = cy; long nIncY = sizeDlg.cy - sizeOld.cy; long nIncX = sizeDlg.cx - sizeOld.cx; ResetSize(nIncX, nIncY); Wash(); // 刷新显示slide 之间的间隔 } } // 当对话框大小改变时: void CTKImageDlg::ResetSize(long nIncX, long nIncY) { CRect rectImage; m_ImageBox.GetWindowRect(rectImage); ScreenToClient(rectImage); CRect rectDescription, rectScroll, rectList, rectXbar; m_ctrlDescription.GetWindowRect(rectDescription); ScreenToClient(rectDescription); m_vsBar.GetWindowRect(rectScroll); ScreenToClient(rectScroll); m_listCtrl.GetWindowRect(rectList); ScreenToClient(rectList); CWnd *pWnd = GetDlgItem(IDC_XBAR); ASSERT(pWnd); pWnd->GetWindowRect(rectXbar); ScreenToClient(rectXbar); m_ImageBox.MoveWindow(rectImage.left, rectImage.top, rectImage.Width() + nIncX, rectImage.Height() + nIncY); m_ctrlDescription.MoveWindow(rectDescription.left, rectDescription.top + nIncY, rectDescription.Width() + nIncX, rectDescription.Height()); m_vsBar.MoveWindow(rectScroll.left + nIncX, rectScroll.top, rectScroll.Width(), rectScroll.Height() + nIncY); m_listCtrl.MoveWindow(rectList.left, rectList.top, rectList.Width(), rectList.Height() + nIncY); pWnd->MoveWindow(rectXbar.left, rectXbar.top, rectXbar.Width(), rectXbar.Height() + nIncY); } void CTKImageDlg::Wash() { CRect rc; CDC * pDC = m_ImageBox.GetDC(); m_ImageBox.GetClientRect(&rc); rc.DeflateRect(1,1,1,1); pDC->FillSolidRect(&rc, RGB(192,192,192)); m_ImageBox.ReleaseDC(pDC); } void CTKImageDlg::OnPaint() { CPaintDC dc(this); // device context for painting CAcUiDialog::OnPaint(); CRect rcClip, rcImage; dc.GetClipBox(&rcClip); m_ImageBox.GetWindowRect(&rcImage); ScreenToClient(&rcImage); if(!rcImage.IntersectRect(&rcImage, &rcClip)) return; SetupImage(FALSE); SwapFlipImage(-1, CurImage()); } // 交换高亮图标 void CTKImageDlg::SwapFlipImage(int from_image, int to_image) { CClientDC dc(&m_ImageBox); if(from_image>=0) { CRect rect; GetImageRect(from_image, rect); CBrush brush(m_lstImage[from_image]->GetBkColor()); dc.FrameRect(&rect, &brush); rect.DeflateRect(1,1); dc.FrameRect(&rect, &brush); rect.DeflateRect(1,1); dc.FrameRect(&rect, &brush); rect.DeflateRect(1,1); dc.FrameRect(&rect, &brush); } if(to_image>=0) { // 为了加粗, 每条线均画两次 CRect rect; GetImageRect(to_image, rect); dc.Draw3dRect(rect,RGB(128,128,128),RGB(240,240,240)); //3D rect.DeflateRect(1, 1); dc.Draw3dRect(rect,RGB(128,128,128),RGB(240,240,240)); //3D rect.DeflateRect(1,1); CBrush brush(RGB(255,0,0)); dc.FrameRect(&rect, &brush); rect.DeflateRect(1,1); dc.FrameRect(&rect, &brush); } } BOOL CTKImageDlg::IsPointOnImage(CPoint & pt) { int nnn = GetPageIndex(pt); if(nnn<0) return FALSE; return IsValid(CurPage() * PageSize() + nnn); } // 求给定的点在当前页的第几个 -1为没有点中 int CTKImageDlg::GetPageIndex(CPoint & pt) { CRect rc; CPoint point = pt; ClientToScreen(&point); m_ImageBox.GetWindowRect(&rc); rc.DeflateRect(2, 2); if (!rc.PtInRect(point)) return -1; point.x -= rc.left; point.y -= rc.top; m_ImageBox.GetClientRect(&rc); rc.DeflateRect(1,1); int uw = rc.Width() / m_nPageColumn; int uh = rc.Height() / m_nPageRow; int row = (point.y-1)/uh; int col = (point.x-1)/uw; return m_nPageColumn * row + col; } // 改变当前页的选中的Image BOOL CTKImageDlg::SelectPageIndex(int selindex) { int lastImage = CurImage(); int curImage=selindex; if(curImage == lastImage) return FALSE; //sr remove it 2002/7/25 int curPage=CurPage(); // 改变列表状态 int nIndex = curPage*PageSize() + curImage; if(!IsValid(nIndex)) return FALSE; m_nIndex = nIndex; SwapFlipImage(lastImage, curImage); if(!m_bMultiSel ) SetListHighLight(); return TRUE; } // 改变树、布局、初始 时调用 BOOL CTKImageDlg::InitVSBar() { int totalRec, pageSize, imageRowNum, imageColNum; imageRowNum = m_nPageRow; imageColNum = m_nPageColumn; pageSize = imageRowNum * imageColNum; totalRec = GetTotalRecords(); if(totalRec <= pageSize || totalRec == 0){ m_vsBar.ShowScrollBar(FALSE); return FALSE; } else m_vsBar.ShowScrollBar(TRUE); SCROLLINFO scrollInfo; scrollInfo.cbSize = sizeof(SCROLLINFO); scrollInfo.fMask = SIF_ALL; scrollInfo.nMin = 0; scrollInfo.nMax = ((totalRec-1) / pageSize+1) * imageRowNum-1; scrollInfo.nPage = imageRowNum; scrollInfo.nPos = CurPage() * imageRowNum; m_vsBar.SetScrollInfo(&scrollInfo, TRUE); return TRUE; } void CTKImageDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { int nCurSel; if(!IsMultSelected()){ if(m_listCtrl.GetItemState(m_nIndex,LVIS_SELECTED)){//如果已经选过了,取消选中 m_listCtrl.SetItemState(m_nIndex, 0, LVIS_SELECTED); } } if(pScrollBar == &m_vsBar){ UINT nEndPos=pScrollBar->GetScrollPos(); switch(nSBCode){ case SB_THUMBPOSITION: //拖动滑块 if((m_nIndex % m_nPageColumn) == 0) nCurSel = m_nPageColumn * nPos; else // 保证每次滚动时当前图都再该列 nCurSel = m_nPageColumn * nPos + CurImage() % m_nPageColumn; SelectIndex(nCurSel); nEndPos = nPos; break; case SB_LINEDOWN: if(m_nIndex > (GetTotalRecords() - m_nPageColumn)) break; SelectIndex(m_nIndex + m_nPageColumn); nEndPos += 1; break; case SB_PAGEDOWN: GoPage(CurPage() + 1); nEndPos += m_nPageRow; break; case SB_LINEUP: if(m_nIndex < m_nPageColumn) break; SelectIndex(m_nIndex - m_nPageColumn); nEndPos -= 1; break; case SB_PAGEUP: GoPage(CurPage() - 1); nEndPos -= m_nPageRow; break; } // if(!IsMultSelected()){ SetListHighLight(); // } pScrollBar->SetScrollPos(nEndPos); } CAcUiDialog::OnVScroll(nSBCode, nPos, pScrollBar); ResetStateText(); } BOOL CTKImageDlg::IsMultSelected() { POSITION pos = m_listCtrl.GetFirstSelectedItemPosition(); int len = 0; if (pos == NULL) return FALSE; else { while (pos) { int nItem = m_listCtrl.GetNextSelectedItem(pos); len++; } } if(len > 1) return TRUE; else return FALSE; } void CTKImageDlg::SetListHighLight() { if(!IsValid(m_nIndex)) return; ASSERT(m_nIndex>=0); // ZJQ modify here m_listCtrl.SetFocus(); m_listCtrl.SetItemState(m_nIndex, LVIS_SELECTED, LVIS_SELECTED); m_listCtrl.SetHotItem(m_nIndex); m_listCtrl.EnsureVisible(m_nIndex, TRUE); } void CTKImageDlg::HideDialog(BOOL Flag) { if (Flag) { GetParent()->EnableWindow(TRUE); GetParent()->SetFocus(); GetParent()->SetActiveWindow(); ShowWindow(SW_HIDE); } else { GetParent()->EnableWindow(FALSE); EnableWindow(TRUE); SetActiveWindow(); ShowWindow(SW_SHOW); } } // 翻到第n页 // 返回: TRUE -- 成功的翻页 FALSE -- 不能翻到指定的页 BOOL CTKImageDlg::GoPage(int destPage) { // 跳至指定页 if(destPage<0 || destPage >= TotalPages()) return FALSE; if(CurPage() != destPage) { m_nIndex = destPage * PageSize() + CurImage(); if(!IsCurrentValid()) m_nIndex = GetTotalRecords()-1; SetupImage(TRUE); SwapFlipImage(-1, CurImage()); return TRUE; } return FALSE; } int CTKImageDlg::CurPage() { int curPage = m_nIndex / PageSize(); if(m_nIndex < 0) return 0; //-1; else if(m_nIndex >= GetTotalRecords()) return TotalPages() - 1; else return curPage; } void CTKImageDlg::GetImageRect(int nindex, CRect & rcImage) { CRect rc; m_ImageBox.GetClientRect(&rc); rc.DeflateRect(2,2); if (nindex<0 || nindex >= PageSize()) { rcImage.SetRectEmpty(); return; } int row = nindex/m_nPageColumn; int col = nindex - row * m_nPageColumn; rcImage.left = rc.left + rc.Width() * col / m_nPageColumn; rcImage.top = rc.top + rc.Height() * row / m_nPageRow; rcImage.right = rcImage.left + rc.Width() / m_nPageColumn; rcImage.bottom = rcImage.top + rc.Height() / m_nPageRow; rcImage.DeflateRect(2, 2); } BOOL CTKImageDlg::IsSelected(int index) { POSITION pos = m_listCtrl.GetFirstSelectedItemPosition(); if (pos == NULL) return FALSE; else { while (pos) { int nItem = m_listCtrl.GetNextSelectedItem(pos); if(nItem == index){ return TRUE; } } } return FALSE; } BOOL CTKImageDlg::SetupImage(BOOL bReload) { ASSERT(m_lstImage.Length() == PageSize()); CDC *pDC = m_ImageBox.GetDC(); int pageSize = PageSize(); for(int i=0; iInitDC(pDC, rect, GetAcadBackColor()); if(bReload) { SetupNthImage(index, pImageDC); } else { if(IsSelected(index) && m_bMultiSel) pImageDC->SetBackColor(RGB(0,128,192)); else pImageDC->SetBackColor(GetAcadBackColor()); if(IsValid(index)) { pImageDC->Redraw(); } } pImageDC->SetDC(NULL); } m_ImageBox.ReleaseDC(pDC); return TRUE; } // Finished void CTKImageDlg::SetPageSize(int nRow, int nColumn) { m_nPageColumn = nColumn; m_nPageRow = nRow; m_lstImage.Reset(); for(int i=nRow*nColumn; i>0; i--) m_lstImage.Append(new CImageDC); } BOOL CTKImageDlg::IsInRect(UINT CtrlID, CPoint point) { CRect rect; CWnd *pWnd=GetDlgItem(CtrlID); ASSERT(pWnd); pWnd->GetWindowRect(rect); if(point.xrect.TopLeft().x && point.y >rect.TopLeft().y) return TRUE; return FALSE; } void CTKImageDlg::SetStateText(const TCHAR *str) { CWnd *pWnd = GetDlgItem(IDC_S_DESCRIPTION); ASSERT(pWnd); pWnd->SetWindowText(str); } void CTKImageDlg::OnBlkPageUp() { if(!IsMultSelected()){ if(m_listCtrl.GetItemState(m_nIndex,LVIS_SELECTED))//如果已经选过了,取消选中 m_listCtrl.SetItemState(m_nIndex, 0, LVIS_SELECTED); } CScrollBar* pScrollBar; pScrollBar = &m_vsBar; UINT nEndPos = pScrollBar->GetScrollPos(); GoPage(CurPage() - 1); nEndPos -= m_nPageRow; if(!IsMultSelected()) SetListHighLight(); pScrollBar->SetScrollPos(nEndPos); ResetStateText(); } void CTKImageDlg::OnBlkPageDown() { if(!IsMultSelected()){ if(m_listCtrl.GetItemState(m_nIndex,LVIS_SELECTED))//如果已经选过了,取消选中 m_listCtrl.SetItemState(m_nIndex, 0, LVIS_SELECTED); } CScrollBar* pScrollBar; pScrollBar = &m_vsBar; UINT nEndPos = pScrollBar->GetScrollPos(); GoPage(CurPage() + 1); nEndPos += m_nPageRow; if(!IsMultSelected()) SetListHighLight(); pScrollBar->SetScrollPos(nEndPos); ResetStateText(); } // 布局 void CTKImageDlg::OnLayout(UINT nID) { //CTemporaryResourceOverride vTemp; switch (nID) { case ID_LAYOUT1X1: SetPageSize(1,1); break; case ID_LAYOUT2X1: SetPageSize(2,1); break; case ID_LAYOUT2X2: SetPageSize(2,2); break; case ID_LAYOUT3X2: SetPageSize(3,2); break; case ID_LAYOUT3X3: SetPageSize(3,3); break; case ID_LAYOUT4X3: SetPageSize(4,3); break; case ID_LAYOUT4X4: SetPageSize(4,4); break; case ID_LAYOUT5X4: SetPageSize(5,4); break; } Wash(); SetupImage(TRUE); SelectIndex(m_nIndex); SwapFlipImage(-1, CurImage()); SetStateText(_T("图标排列更改完毕!")); InitVSBar(); ResetStateText(); } BOOL CTKImageDlg::OnInitDialog() { CAcUiDialog::OnInitDialog(); CRect rectDlg; GetClientRect(rectDlg); sizeDlg.cx = rectDlg.Width(); sizeDlg.cy = rectDlg.Height(); long nIncY = sizeDlg.cy - m_nOldSizeY; // 对话框绝对尺寸 long nIncX = sizeDlg.cx - m_nOldSizeX; m_bInit = TRUE; ResetSize(nIncX, nIncY); m_ySplitter.BindWithControl(this, IDC_YBAR); m_ySplitter.AttachAsAbovePane(IDC_TK_TREE); m_ySplitter.AttachAsBelowPane(IDC_TK_LIST); m_ySplitter.RecalcLayout(); m_ySplitter.SetMinHeight(50, 50); m_xSplitter.BindWithControl(this, IDC_XBAR); m_xSplitter.AttachAsLeftPane(IDC_TK_TREE); m_xSplitter.AttachAsLeftPane(IDC_YBAR); m_xSplitter.AttachAsLeftPane(IDC_TK_LIST); m_xSplitter.AttachAsRightPane(IDC_PIC_IMAGE); m_xSplitter.RecalcLayout(); m_xSplitter.SetMinWidth(20, 320); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } int CTKImageDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CAcUiDialog::OnCreate(lpCreateStruct) == -1) return -1; CRect rect; GetClientRect(rect); m_nOldSizeX=rect.Width(); m_nOldSizeY=rect.Height(); return 0; } void CTKImageDlg::OnOK() { if(IsZoomed()) CAcUiDialog::OnCancel(); else CAcUiDialog::OnOK(); } void CTKImageDlg::OnLButtonDblClk(UINT nFlags, CPoint point) { if(IsPointOnImage(point) && (GetPageIndex(point) >= 0) && (!m_bBiginEdit)) { if(GetCapture()==this) { ReleaseCapture(); m_treeCtrl.SelectDropTarget(NULL); } OnOK(); } else { CAcUiDialog::OnLButtonDblClk(nFlags, point); } }