Files
envi-code/SourceCode/Code2026/tg_shs/shs_blklib/TKImageDlg.cpp
T
2026-09-28 15:28:50 +08:00

644 lines
15 KiB
C++

// 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; i<pageSize; i++) {
int dd = CurPage();
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 {
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.x<rect.BottomRight().x && point.y<rect.BottomRight().y && point.x >rect.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);
}
}