539 lines
12 KiB
C++
539 lines
12 KiB
C++
// 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; i<pageSize; i++) {
|
|
int index = CurPage()*pageSize + i;
|
|
CImageDC *pImageDC = m_lstImage[i];
|
|
CRect rect;
|
|
GetImageRect(i, rect);
|
|
pImageDC->InitDC(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<len;i++){
|
|
if(index == *m_lstSelected[i])
|
|
return TRUE;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
int CSlideStatic::CurPage()
|
|
{
|
|
int curPage = m_nIndex / PageSize();
|
|
if(m_nIndex < 0) return 0; //-1;
|
|
else if(m_nIndex >= 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<TKStruct> lstOldSelected;
|
|
for(int i=0;i<m_lstSelected.Length();i++){
|
|
int sel = *m_lstSelected[i];
|
|
lstOldSelected.Append(new TKStruct(*m_lstBlk[sel]));
|
|
}
|
|
if(m_bSort)
|
|
m_lstBlk.QuickSort(TKStruct::SortByItem);
|
|
else
|
|
m_lstBlk.QuickSort(TKStruct::SortByDrawing);
|
|
m_lstSelected.Reset();
|
|
for(i=0;i<m_lstBlk.Length();i++){
|
|
for(int j=0;j<lstOldSelected.Length();j++){
|
|
CString csTmp1 = lstOldSelected[j]->csTKFile;
|
|
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;i<lstTKFiles.Length();i++)
|
|
SetTKInfo(lstTKFiles[i], csTKType, FALSE);
|
|
if(m_bSort)
|
|
m_lstBlk.QuickSort(TKStruct::SortByItem);
|
|
m_nIndex = m_lstBlk.Length()>0 ?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;i<m_lstSelected.Length();i++)
|
|
{
|
|
if(m_nIndex == *m_lstSelected[i])
|
|
{
|
|
m_lstSelected.Remove(i);
|
|
SwapFlipImage(cur, -1);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
m_lstSelected.Append(new int(m_nIndex));
|
|
SwapFlipImage(CurImage(), cur);
|
|
}
|
|
}
|
|
}
|
|
DWORD lParam = -1;
|
|
GetParent()->SendMessage(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; i<pageSize; i++)
|
|
{
|
|
break;
|
|
int index = CurPage()*pageSize + i;
|
|
CImageDC *pImageDC = m_lstImage[i];
|
|
|
|
pImageDC->SetDC(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);
|
|
}
|
|
|