#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; }