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

244 lines
6.3 KiB
C++

#include "stdafx.h"
#include "GlwCursorDlg.h"
#include "resource.h"
IMPLEMENT_DYNAMIC(GlwCursorDlg, CDialog)
BEGIN_MESSAGE_MAP(GlwCursorDlg, CDialog)
ON_WM_PAINT()
//ON_MESSAGE(WM_ACAD_KEEPFOCUS, &GlwCursorDlg::OnAcadKeepFocus)
ON_WM_SHOWWINDOW()
END_MESSAGE_MAP()
#define WIDTH 17
#define HEIGHT 22
static TEntitySet g_utility_pEntShow;
static bool g_utility_ChangeCursor = false;
static GlwCursorDlg *g_utility_pCursorDlg = NULL;
static CString g_utility_sFilter = _T("");
TUTIL_IMPEXP BOOL GetEntFromPt(const AcGePoint3d& pt, LPCTSTR sDxfName, TEntitySet& ent)
{
TRBList tgMask(RTDXF0, sDxfName, NULL);
TPickEntSet ssEnts(SS_FREE);
TADSGePoint3d pt1, pt2;
pt1[X] = pt.x;
pt1[Y] = pt.y;
pt1[Z] = pt.z;
pt1 = Wcs2Ucs(pt1);
pt2 = pt1;
//得到拾取框大小
double dAperture = 50.0;//GetPickBoxWcs();
pt1[X] -= dAperture;
pt1[Y] += dAperture;
pt2[X] += dAperture;
pt2[Y] -= dAperture;
AcDbObjectId id = AcDbObjectId::kNull;
if (ssEnts.Get(_T("C"),pt1,pt2,tgMask) == RTNORM)
{
ent = ssEnts[0L];
return TRUE;
}
return FALSE;
}
TUTIL_IMPEXP void SetHandCursorSelectType(LPCTSTR pszType)
{
g_utility_sFilter = pszType;
}
TUTIL_IMPEXP void SetHandCursorSelectEntity(TEntitySet & ent)
{
g_utility_pEntShow = ent;
}
TUTIL_IMPEXP BOOL MouseMoveMonitorByHandCursor(MSG* msg)
{
if (!acdbCurDwg())
{
return FALSE;
}
BOOL bRet = FALSE;
switch(msg->message)
{
case WM_MOUSEMOVE:
{
CPoint ptClient = msg->pt;
acedGetAcadDwgView()->ScreenToClient(&ptClient);
int nVpNum = acedGetWinNum(ptClient.x, ptClient.y);
int nCurVp = 0;
VERIFY(TGGetVar(_T("CVPORT"), &nCurVp) == RTNORM);
if (nVpNum == nCurVp)
{
TADSGePoint3d ptDwgWcs, ptDwgDcs;
BOOL nRetCode = TRUE;
if (acedCoordFromPixelToWorld(nVpNum, ptClient, ptDwgWcs))
{
g_utility_pEntShow.Redraw(4);
if (GetEntFromPt(ptDwgWcs, g_utility_sFilter, g_utility_pEntShow))
g_utility_pEntShow.Redraw(3);
else
g_utility_pEntShow.Redraw(4);
}
}
if (g_utility_ChangeCursor && g_utility_pCursorDlg)
{
// 关于光标对话框是否显示,只由一个条件来判断,即 光标在 acedGetAcadDwgView 内,则显示
CMDIFrameWnd *pWnd = acedGetAcadFrame();
CWnd *pMDI = CWnd::FromHandle(pWnd->m_hWndMDIClient);
CView *pView = acedGetAcadDwgView();
do
{
if (!pView) break;
HWND hwnd = ::WindowFromPoint(msg->pt);
if (!hwnd) break;
if (pView->GetSafeHwnd() != hwnd) break;
if (!g_utility_pCursorDlg->IsWindowVisible())
g_utility_pCursorDlg->ShowWindow(SW_SHOW);
g_utility_pCursorDlg->Move2Pt(msg->pt);
//使CAD获得焦点,以避免面板获得焦点而CAD收不到WM_MOUSEMOVE消息 by stf
//acedGetAcadFrame()->SetFocus();
return bRet;
} while (false);
if (g_utility_pCursorDlg->IsWindowVisible())
g_utility_pCursorDlg->ShowWindow(SW_HIDE);
}
}
break;
default: break;
}
return bRet;
}
TUTIL_IMPEXP void StartChangeCursor()
{
if(g_utility_ChangeCursor) return;
CAcModuleResourceOverride temp;
g_utility_ChangeCursor = true;
if (!g_utility_pCursorDlg)
{
g_utility_pCursorDlg = new GlwCursorDlg;
g_utility_pCursorDlg->Create(IDD_HAND_DLG, acedGetAcadFrame());
}
if (!g_utility_pCursorDlg->IsWindowVisible())
g_utility_pCursorDlg->ShowWindow(SW_SHOW);
}
TUTIL_IMPEXP void EndChangeCursor()
{
if(!g_utility_ChangeCursor) return;
if (g_utility_pCursorDlg->IsWindowVisible())
g_utility_pCursorDlg->ShowWindow(SW_HIDE);
g_utility_ChangeCursor = false;
g_utility_pEntShow.Redraw(4);
}
BOOL GlwCursorDlg::OnInitDialog()
{
MoveWindow(0, 0, WIDTH, HEIGHT);
SetRgn();
// TGGetVar(_T("CURSORSIZE"), &m_nOldCursorSz);
// TGGetVar(_T("APERTURE"), &m_nOldApertureSz);
return CDialog::OnInitDialog();
}
void GlwCursorDlg::OnPaint()
{
CPaintDC dc(this);
dc.FillSolidRect(CRect(0, 0, WIDTH, HEIGHT), GetAcadBackColor());
CBitmap bitmap;
bitmap.LoadBitmap(IDB_HAND_CURSOR);
CDC memDC;
memDC.CreateCompatibleDC(&dc);
memDC.SelectObject(bitmap.GetSafeHandle());
dc.TransparentBlt(0, 0, WIDTH, HEIGHT, &memDC, 0, 0, WIDTH, HEIGHT, RGB(255, 0, 255));
}
void GlwCursorDlg::Move2Pt( const CPoint &pt )
{
MoveWindow(CRect(CPoint(pt.x+1, pt.y+1), CSize(WIDTH, HEIGHT)));
Invalidate();
}
void GlwCursorDlg::OnShowWindow( BOOL bShow, UINT nStatus )
{
if (bShow)
{
// TGGetVar(_T("CURSORSIZE"), &m_nOldCursorSz);
// TGGetVar(_T("APERTURE"), &m_nOldApertureSz);
// TGSetVar(_T("CURSORSIZE"), 1);
// TGSetVar(_T("APERTURE"), 1);
}
else
{
// TGSetVar(_T("CURSORSIZE"), m_nOldCursorSz);
// TGSetVar(_T("APERTURE"), m_nOldApertureSz);
}
}
void GlwCursorDlg::SetRgn()
{
CRgn rgn;
rgn.CreateRectRgn(0, 0, 17, 22);
// 左上
CRgn rgn1, rgn2, rgn2_1, rgn2_2;
rgn1.CreateRectRgn(0, 0, 4, 9);
rgn2.CreateRectRgn(8, 0, 17, 5);
rgn2_1.CreateRectRgn(4, 0, 5, 1);
rgn2_2.CreateRectRgn(3, 9, 4, 10);
// 右上
CRgn rgn3, rgn4, rgn5;
CRgn rgn5_1, rgn5_2, rgn5_3, rgn5_4, rgn5_5;
rgn3.CreateRectRgn(11, 5, 17, 6);
rgn4.CreateRectRgn(14, 6, 17, 7);
rgn5.CreateRectRgn(16, 7, 17, 8);
rgn5_1.CreateRectRgn(7, 0, 8, 1);
rgn5_2.CreateRectRgn(10, 5, 11, 6);
rgn5_3.CreateRectRgn(13, 6, 14, 7);
rgn5_4.CreateRectRgn(15, 7, 16, 8);
rgn5_5.CreateRectRgn(16, 8, 17, 9);
// 右下
CRgn rgn6, rgn7;
rgn6.CreateRectRgn(15, 19, 16, 22);
rgn7.CreateRectRgn(16, 16, 17, 22);
// 左下
CRgn rgn8, rgn9, rgn10, rgn11, rgn12;
rgn8.CreateRectRgn(0, 19, 5, 22);
rgn9.CreateRectRgn(0, 17, 4, 29);
rgn10.CreateRectRgn(0, 15, 3, 17);
rgn11.CreateRectRgn(0, 13, 2, 15);
rgn12.CreateRectRgn(0, 12, 1, 13);
rgn.CombineRgn(&rgn, &rgn1, RGN_DIFF);
rgn.CombineRgn(&rgn, &rgn2, RGN_DIFF);
rgn.CombineRgn(&rgn, &rgn3, RGN_DIFF);
rgn.CombineRgn(&rgn, &rgn4, RGN_DIFF);
rgn.CombineRgn(&rgn, &rgn5, RGN_DIFF);
rgn.CombineRgn(&rgn, &rgn6, RGN_DIFF);
rgn.CombineRgn(&rgn, &rgn7, RGN_DIFF);
rgn.CombineRgn(&rgn, &rgn8, RGN_DIFF);
rgn.CombineRgn(&rgn, &rgn9, RGN_DIFF);
rgn.CombineRgn(&rgn, &rgn10, RGN_DIFF);
rgn.CombineRgn(&rgn, &rgn11, RGN_DIFF);
rgn.CombineRgn(&rgn, &rgn12, RGN_DIFF);
rgn.CombineRgn(&rgn, &rgn5_1, RGN_DIFF);
rgn.CombineRgn(&rgn, &rgn5_2, RGN_DIFF);
rgn.CombineRgn(&rgn, &rgn5_3, RGN_DIFF);
rgn.CombineRgn(&rgn, &rgn5_4, RGN_DIFF);
rgn.CombineRgn(&rgn, &rgn5_5, RGN_DIFF);
rgn.CombineRgn(&rgn, &rgn2_1, RGN_DIFF);
rgn.CombineRgn(&rgn, &rgn2_2, RGN_DIFF);
SetWindowRgn(rgn, TRUE);
}
LRESULT GlwCursorDlg::OnAcadKeepFocus( WPARAM wp, LPARAM lp )
{
//时刻使CAD获得焦点
return FALSE;
}