Files
envi-code/SourceCode/Code2026/tg_shs/shs_blklib/SlideStatic.cpp
T
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

539 lines
13 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);
}