244 lines
6.3 KiB
C++
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;
|
|
}
|