// SlideStatic.cpp : implementation file // #include "stdafx.h" #include "SlideStatic.h" #include "tkwfile.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif extern CString GetFileNameByAllName(const TCHAR* szAllFileName); extern CString GetPathNameByAllName(const TCHAR* szAllFileName); //extern void GetTKFilesList(CString m_csTKWFile, XStringList &m_lstTKFiles, CString& csVersion, CString& csDescription, BOOL &bIsJpg); ///////////////////////////////////////////////////////////////////////////// // CSlideStatic CSlideStatic::CSlideStatic() :m_bMouseDown(FALSE),m_bRMouseDown(FALSE) { m_lstSelected.Reset(); m_lstImage.Reset(); m_nPageColumn = 4; m_nPageRow = 4; m_bMultiSel = TRUE; m_bSort = FALSE; m_bIsJpgShow = FALSE; SetPageSize(m_nPageRow, m_nPageColumn);//初始化页面 } CSlideStatic::~CSlideStatic() { } BEGIN_MESSAGE_MAP(CSlideStatic, CStatic) //{{AFX_MSG_MAP(CSlideStatic) ON_WM_PAINT() ON_WM_LBUTTONUP() ON_WM_LBUTTONDBLCLK() ON_WM_LBUTTONDOWN() ON_WM_RBUTTONDOWN() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CSlideStatic message handlers void CSlideStatic::OnPaint() { CPaintDC dc(this); // device context for painting CRect rcImage; GetWindowRect(&rcImage); ScreenToClient(&rcImage); SetupImage(FALSE); } void CSlideStatic::Wash() { CRect rc; CDC * pDC = GetDC(); GetClientRect(&rc); rc.DeflateRect(1,1,1,1); pDC->FillSolidRect(&rc, RGB(192,192,192)); ReleaseDC(pDC); } void CSlideStatic::GetImageRect(int nindex, CRect & rcImage) { CRect rc; 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 CSlideStatic::SetupImage(BOOL bReload) { ASSERT(m_lstImage.Length() == PageSize()); CDC *pDC = GetDC(); int pageSize = PageSize(); for(int i=0; iInitDC(pDC, rect, GetAcadBackColor()); if(bReload) { SetupNthImage(index, pImageDC); } else { pImageDC->SetHighlight(IsSelected(index)); /* if(IsSelected(index)) pImageDC->SetBackColor(RGB(0,128,192)); else pImageDC->SetBackColor(GetAcadBackColor()); */ if(IsValid(index)) { pImageDC->Redraw(); } } pImageDC->SetDC(NULL); } ReleaseDC(pDC); return TRUE; } BOOL CSlideStatic::IsSelected(int index) { int len = m_lstSelected.Length(); for(int i=0;i= GetTotalRecords()) return TotalPages() - 1; else return curPage; } int CSlideStatic::GetTotalRecords() //取得当前链表的节点个数 { return m_lstBlk.Length(); } // 设置nIndex个图像/幻灯 void CSlideStatic::SetupNthImage(int nIndex, CImageDC *pImg) { BOOL bValid = IsValid(nIndex); XString sFile(256), xsDrawing; if (bValid) { CString csTKName, csTKPath; csTKName = GetFileNameByAllName(m_lstBlk[nIndex]->csTKFile); csTKPath = GetPathNameByAllName(m_lstBlk[nIndex]->csTKFile); xsDrawing = (const TCHAR *)(csTKName + _T("(") + m_lstBlk[nIndex]->csDrawing+ _T(")")); sFile << csTKPath << xsDrawing; } if(!bValid) { if(m_bIsJpgShow) pImg->PaintJpeg(NULL); else pImg->PaintSlide(NULL); //pImg->Fill(RGB(192,192,192)); } else { if(IsSelected(nIndex)){ pImg->SetHighlight(TRUE); //pImg->SetBackColor(RGB(0,128,192)); // 被选择 if(m_bIsJpgShow) pImg->PaintJpeg(sFile); else pImg->PaintSlide(sFile); } else{ pImg->SetHighlight(FALSE); if(m_bIsJpgShow) pImg->PaintJpeg(sFile); else pImg->PaintSlide(sFile); } } } void CSlideStatic::SetTKInfo(const TCHAR* szTKAllName, const TCHAR* szTKType, BOOL bReset) { CString csTKAllName, csTKType; csTKAllName = szTKAllName; csTKType = szTKType; if(!csTKAllName) return; if(bReset){ m_lstBlk.Reset(); m_lstSelected.Reset(); } CString sKind, sItem, sDrawing; //类别,名称,内部图名 CodeBase db; db.read_only = 1; XDbfTable *pTable = db.Open(csTKAllName); if(!pTable) return; for(pTable->MoveFirst(); !pTable->IsEOF(); pTable->MoveNext()) { GET_FIELD(pTable, _T("kind"), sKind); GET_FIELD(pTable, _T("item"), sItem); GET_FIELD(pTable, _T("drawing"), sDrawing); if(sKind == (const TCHAR *)csTKType && sDrawing != _T("")) { m_lstBlk.Append(new TKStruct(csTKAllName, sKind, sItem, sDrawing)); } } if(m_bSort) m_lstBlk.QuickSort(TKStruct::SortByItem); m_nIndex = m_lstBlk.Length()>0 ?0 :-1; return; } void CSlideStatic::SetSort() { DList lstOldSelected; for(int i=0;icsTKFile; CString csTmp2 = m_lstBlk[i]->csTKFile; CString csTmp3 = lstOldSelected[j]->csDrawing; CString csTmp4 = m_lstBlk[i]->csDrawing; //if(csTmp1 == csTmp2 && csTmp3 == csTmp4) if(_tcsicmp(csTmp1,csTmp2)==0 &&_tcsicmp(csTmp3,csTmp4)==0) { m_lstSelected.Append(new int(i)); break; } } } SetupImage(TRUE); } void CSlideStatic::SetTKWInfo(const TCHAR* szTKWAllName, const TCHAR* szTKType) { CString csTKWAllName, csTKType; csTKWAllName = szTKWAllName; csTKType = szTKType; m_lstSelected.Reset(); m_lstBlk.Reset(); XStringList lstTKFiles; CTkwFile tkw(csTKWAllName); tkw.GetTKList(lstTKFiles); m_bIsJpgShow = tkw.m_bIsJpg; for(int i=0;i0 ?0 :-1; } void CSlideStatic::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); } void CSlideStatic::OnLButtonDown(UINT nFlags, CPoint point) { m_bMouseDown = TRUE; int cur = GetPageIndex(point); if(cur > -1){ if(!IsValid(CurPage()*PageSize() + cur)) return; cur = CurPage()*PageSize() + cur; if(IsSelected(cur)){ DWORD lParam = -1; GetParent()->SendMessage(WM_LBUTTONDOWN, (WPARAM)nFlags, lParam); } } CStatic::OnLButtonDown(nFlags, point); } void CSlideStatic::OnLButtonUp(UINT nFlags, CPoint point) { if(m_bMouseDown) { m_bMouseDown = FALSE; BOOL bFlag; if((nFlags & MK_CONTROL) | (nFlags & MK_SHIFT)) bFlag = TRUE; else bFlag = FALSE; if((m_bMultiSel && !bFlag) || !m_bMultiSel){ //如果多选,但没有按CTRL键 int cur = GetPageIndex(point); if(cur > -1){ if(!IsValid(CurPage()*PageSize() + cur)) return; m_nIndex = CurPage()*PageSize() + cur; if(!IsSelected(m_nIndex)){ ClearBkColor(); m_lstSelected.Reset(); m_lstSelected.Append(new int(m_nIndex)); SwapFlipImage(CurImage(), cur); } } } else if(m_bMultiSel && (nFlags & MK_CONTROL)){//如果多选,且按CTRL键 int cur = GetPageIndex(point); if(cur > -1) { m_nIndex = CurPage()*PageSize() + cur; if(IsSelected(m_nIndex)) { for(int i=0;iSendMessage(WM_LBUTTONUP, (WPARAM)nFlags, lParam); } CStatic::OnLButtonUp(nFlags, point); } void CSlideStatic::OnLButtonDblClk(UINT nFlags, CPoint point) { if(GetPageIndex(point) >= 0){ DWORD lParam = -1; GetParent()->SendMessage(WM_LBUTTONDBLCLK, (WPARAM)nFlags, lParam); } else CStatic::OnLButtonDblClk(nFlags, point); } // 求给定的点在当前页的第几个 -1为没有点中 int CSlideStatic::GetPageIndex(CPoint & pt) { CRect rc; CPoint point = pt; ClientToScreen(&point); GetWindowRect(&rc); rc.DeflateRect(2, 2); if (!rc.PtInRect(point)) return -1; point.x -= rc.left; point.y -= rc.top; 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; } void CSlideStatic::Reset() { m_lstBlk.Reset(); m_lstSelected.Reset(); } void CSlideStatic::ClearBkColor() { CDC *pDC = GetDC(); int pageSize = PageSize(); for(int i=0; iSetDC(pDC); pImageDC->SetHighlight(FALSE); pImageDC->Redraw(); pImageDC->SetDC(NULL); /* if(IsSelected(index)){ CImageDC *pImageDC = m_lstImage[i]; pImageDC->SetDC(pDC); pImageDC->SetBackColor(GetAcadBackColor()); pImageDC->Redraw(); pImageDC->SetDC(NULL); } else{ if(pImageDC->GetBkColor() != GetAcadBackColor()){ pImageDC->SetDC(pDC); pImageDC->SetBackColor(GetAcadBackColor()); pImageDC->Redraw(); pImageDC->SetDC(NULL); } }*/ } for(i = 0;i < m_lstSelected.Length(); i++) { int index = *m_lstSelected[i] - CurPage()*pageSize; if(index >= 0 && index < pageSize) { CImageDC *pImageDC = m_lstImage[index]; pImageDC->SetDC(pDC); pImageDC->SetHighlight(FALSE); pImageDC->Redraw(); pImageDC->SetDC(NULL); } } ReleaseDC(pDC); } BOOL CSlideStatic::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); } else { SwapFlipImage(lastImage, curImage); } return TRUE; } void CSlideStatic::SwapFlipImage(int from_image, int to_image) { CDC *pDC = GetDC(); //modify by xlc on 070903 //减少图号相同时的重绘次数 //if(IsValid(to_image)) if(IsValid(to_image) && from_image!=to_image) { m_lstImage[to_image]->SetDC(pDC); m_lstImage[to_image]->SetHighlight(TRUE); //m_lstImage[to_image]->SetBackColor ( RGB(0,128,192)); m_lstImage[to_image]->Redraw(); m_lstImage[to_image]->SetDC(NULL); } if(IsValid(from_image)) { int pageSize = PageSize(); int index = CurPage()*pageSize + from_image; m_lstImage[from_image]->SetDC(pDC); if(IsSelected(index)) m_lstImage[from_image]->SetHighlight(TRUE); //m_lstImage[from_image]->SetBackColor(RGB(0,128,192)); else //m_lstImage[from_image]->SetBackColor(GetAcadBackColor()); { m_lstImage[from_image]->SetHighlight(FALSE); } m_lstImage[from_image]->Redraw(); m_lstImage[from_image]->SetDC(NULL); } ReleaseDC(pDC); } BOOL CSlideStatic::SelectPageIndex(int selindex) { int lastImage = CurImage(); int curImage=selindex; if(curImage == lastImage) return FALSE; int curPage=CurPage(); // 改变列表状态 int nIndex = curPage*PageSize() + curImage; if(!IsValid(nIndex)) return FALSE; m_nIndex = nIndex; SwapFlipImage(lastImage, curImage); return TRUE; } // 翻到第n页 // 返回: TRUE -- 成功的翻页 FALSE -- 不能翻到指定的页 BOOL CSlideStatic::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); return TRUE; } return FALSE; } void CSlideStatic::OnRButtonDown(UINT nFlags, CPoint point) { m_bRMouseDown = TRUE; CStatic::OnRButtonDown(nFlags, point); }