Files
envi-code/SourceCode/Code2026/tg_shs/shs_annotate/TchAnnotateGlobalFunc.cpp
T

280 lines
5.5 KiB
C++
Raw Normal View History

2026-10-04 00:04:20 +08:00
#include "StdAfx.h"
2026-09-28 15:28:50 +08:00
2026-10-04 00:04:20 +08:00
// 键盘输入的返回结果
2026-09-28 15:28:50 +08:00
static int s_nInputRet;
2026-10-04 00:04:20 +08:00
// 关键字列表,多个关键字中间不需要加空格区分
2026-09-28 15:28:50 +08:00
static const TCHAR* s_szKeyword;
2026-10-04 00:04:20 +08:00
// Zyu add on 101208,键盘输入的关键字
2026-09-28 15:28:50 +08:00
static WPARAM s_nInput;
2026-10-04 00:04:20 +08:00
CPoint m_ptLeft;// add by xly on 110104 鼠标点取位置
2026-09-28 15:28:50 +08:00
2026-10-04 00:04:20 +08:00
// 捕获键盘输入关键字的动作
2026-09-28 15:28:50 +08:00
#if ADS > 22
static bool InputKeyWord(MSG* msg)
#else
static BOOL InputKeyWord(MSG* msg)
#endif
{
if (!acdbCurDwg())
{
return FALSE;
}
BOOL bRet = FALSE;
2026-10-04 00:04:20 +08:00
// 关键字控制表中的关键字的个数
2026-09-28 15:28:50 +08:00
int iLen = 0;
for (iLen = 0; ;iLen++)
{
if (s_szKeyword[iLen] == _T('\0'))
{
break;
}
}
//modify by lxb on 2011/12/01
switch(msg->message)
{
2026-10-04 00:04:20 +08:00
case WM_KEYDOWN: // 键盘输入
2026-09-28 15:28:50 +08:00
{
2026-10-04 00:04:20 +08:00
if (msg->wParam == VK_RETURN || msg->wParam == VK_SPACE) // 键盘输入回车和空格
2026-09-28 15:28:50 +08:00
{
s_nInputRet = RTNONE;
msg->wParam = VK_SPACE;
}
else
{
2026-10-04 00:04:20 +08:00
for (int i = 0; i < iLen; i++) //是否是输入关键字
2026-09-28 15:28:50 +08:00
{
if (msg->wParam == s_szKeyword[i])
{
ads_printf(CString(s_szKeyword[i]));
s_nInput = msg->wParam;
s_nInputRet = RTKWORD;
msg->wParam = VK_SPACE;
}
}
}
}
break;
2026-10-04 00:04:20 +08:00
case WM_RBUTTONDOWN: // 鼠标右键
2026-09-28 15:28:50 +08:00
{
s_nInputRet = RTNONE;
msg->wParam = VK_SPACE;
}
break;
2026-10-04 00:04:20 +08:00
case WM_LBUTTONDOWN: // add by xly on 110104 鼠标左键点取位置
2026-09-28 15:28:50 +08:00
{
m_ptLeft = msg->pt;
}
break;
default:
break;
}
2026-10-04 00:04:20 +08:00
/* // 没有关键字
2026-09-28 15:28:50 +08:00
if (iLen < 1)
{
2026-10-04 00:04:20 +08:00
// 没有关键字输入的时候支持判断结果
2026-09-28 15:28:50 +08:00
switch(msg->message)
{
2026-10-04 00:04:20 +08:00
case WM_KEYDOWN: // 键盘输入关键字
2026-09-28 15:28:50 +08:00
{
2026-10-04 00:04:20 +08:00
if (msg->wParam == VK_RETURN || msg->wParam == VK_SPACE) // 键盘输入回车和空格
2026-09-28 15:28:50 +08:00
{
s_nInputRet = RTNONE;
msg->wParam = VK_SPACE;
}
}
break;
2026-10-04 00:04:20 +08:00
case WM_RBUTTONDOWN: // 鼠标右键
2026-09-28 15:28:50 +08:00
{
s_nInputRet = RTNONE;
msg->wParam = VK_SPACE;
}
break;
2026-10-04 00:04:20 +08:00
case WM_LBUTTONDOWN: // add by xly on 110104 鼠标左键点取位置
2026-09-28 15:28:50 +08:00
{
m_ptLeft = msg->pt;
}
break;
default:
break;
}
return bRet;
}
for (int i = 0; i < iLen; i++)
{
switch(msg->message)
{
2026-10-04 00:04:20 +08:00
case WM_KEYDOWN: // 键盘输入关键字
2026-09-28 15:28:50 +08:00
{
2026-10-04 00:04:20 +08:00
if (msg->wParam == s_szKeyword[i]) // 键盘输入Q
2026-09-28 15:28:50 +08:00
{
ads_printf(CString(s_szKeyword[i]));
s_nInputRet = RTKWORD;
2026-10-04 00:04:20 +08:00
// Zyu add on 101208,保存键盘输入结果
2026-09-28 15:28:50 +08:00
s_nInput = msg->wParam;
msg->wParam = VK_SPACE;
}
2026-10-04 00:04:20 +08:00
else if (msg->wParam == VK_RETURN || msg->wParam == VK_SPACE) // 键盘输入回车和回车 add by lxb on 2011/11/29
2026-09-28 15:28:50 +08:00
{
s_nInputRet = RTNONE;
msg->wParam = VK_SPACE;
}
}
break;
2026-10-04 00:04:20 +08:00
case WM_RBUTTONDOWN: // 鼠标右键
2026-09-28 15:28:50 +08:00
{
s_nInputRet = RTNONE;
msg->wParam = VK_SPACE;
}
break;
2026-10-04 00:04:20 +08:00
case WM_LBUTTONDOWN: // add by xly on 110104 鼠标左键点取位置
2026-09-28 15:28:50 +08:00
{
m_ptLeft = msg->pt;
}
break;
default:
break;
}
}
*/
return bRet;
}
2026-10-04 00:04:20 +08:00
// 判断选择集的选择的情况:
// 1.选择了关键字:RTKWORD;2.按Esc键退出:RTCAN;3.选择到了实体:RTNORM;
// 4.没有选择到实体:RTERROR;5.鼠标右键\回车:RTNONE
// 修改关键字可以在钩子函数InputKeyWord中修改
2026-09-28 15:28:50 +08:00
int SelectEnts(CString csPrompt, PickSet &ssResult, TRBList &rbBaseMask, const TCHAR* szKeyword)
{
s_szKeyword = szKeyword;
2026-10-04 00:04:20 +08:00
// 钩子函数监视键盘中输入关键字
2026-09-28 15:28:50 +08:00
acedRegisterFilterWinMsg(InputKeyWord);
2026-10-04 00:04:20 +08:00
// 保存返回结果
2026-09-28 15:28:50 +08:00
int nRet = 0;
const TCHAR *szTempPrompts[2]={csPrompt, _T("") };
int iRet = ssResult.Get(_T(":S:$"), szTempPrompts, NULL, rbBaseMask);
if (s_nInputRet == RTKWORD)
{
nRet = RTKWORD;
s_nInputRet = 0;
}
else if (s_nInputRet == RTNONE)
{
nRet = RTNONE;
s_nInputRet = 0;
}
else if (iRet == RTNORM)
{
nRet = RTNORM;
}
else if (iRet == RTCAN)
{
nRet = RTCAN;
}
else
{
nRet = RTERROR;
}
2026-10-04 00:04:20 +08:00
// 释放函数
2026-09-28 15:28:50 +08:00
acedRemoveFilterWinMsg(InputKeyWord);
return nRet;
}
2026-10-04 00:04:20 +08:00
// 首次选择提示szPrompt,之后提示szNextPrompt,支持关键字
2026-09-28 15:28:50 +08:00
int SelectEnts(LPCTSTR szPrompt, LPCTSTR szNextPrompt, TRBList &rbBaseMask,
PickSet &ssResult, LPCTSTR szKeyword, TCHAR& cRet)
{
2026-10-04 00:04:20 +08:00
// 状态行提示
2026-09-28 15:28:50 +08:00
CString csPromt = szPrompt,
csKeyword = szKeyword;
2026-10-04 00:04:20 +08:00
bool bIsFirSel= true; // 标记是否是第一次选择
2026-09-28 15:28:50 +08:00
PickSet ssNew(SS_FREE);
2026-10-04 00:04:20 +08:00
// 保存选择集返回的结果
2026-09-28 15:28:50 +08:00
int nRet;
while(1)
{
2026-10-04 00:04:20 +08:00
// 获得选择集的结果
2026-09-28 15:28:50 +08:00
nRet = SelectEnts(csPromt, ssNew, rbBaseMask, csKeyword);
2026-10-04 00:04:20 +08:00
if (bIsFirSel) // 第一次选择
2026-09-28 15:28:50 +08:00
{
if (nRet == RTKWORD)
{
cRet = s_nInput;
break;
}
else if (nRet == RTNORM)
{
2026-10-04 00:04:20 +08:00
// 第一次选择成功后,再次选择时切换提示语
2026-09-28 15:28:50 +08:00
csPromt = szNextPrompt;
csKeyword = _T("");
bIsFirSel = false;
ssNew.Redraw(3);
ssResult += ssNew;
continue;
}
2026-10-04 00:04:20 +08:00
else if (nRet == RTCAN)// 不与nRet==RTCAN合并的原因是区分取消(ESC)和右键回车
2026-09-28 15:28:50 +08:00
{
2026-10-04 00:04:20 +08:00
// 更新显示
2026-09-28 15:28:50 +08:00
ssNew.Redraw(4);
break;
}
else if (nRet == RTNONE)
{
2026-10-04 00:04:20 +08:00
// 更新显示
2026-09-28 15:28:50 +08:00
ssNew.Redraw(4);
break;
}
}
2026-10-04 00:04:20 +08:00
else // 第一次以后的选择
2026-09-28 15:28:50 +08:00
{
if (nRet == RTKWORD)
{
cRet = s_nInput;
break;
}
else if (nRet == RTNORM)
{
csPromt = szNextPrompt;
ssNew.Redraw(3);
ssResult += ssNew;
continue;
}
2026-10-04 00:04:20 +08:00
else if (nRet == RTCAN)// 不与nRet==RTCAN合并的原因是区分取消(ESC)和右键回车
2026-09-28 15:28:50 +08:00
{
2026-10-04 00:04:20 +08:00
ssResult.Redraw(4); // 更新显示
2026-09-28 15:28:50 +08:00
ssResult.Free();
break;
}
else if (nRet == RTERROR)
{
continue;
}
else if (nRet == RTNONE)
{
if (ssResult.Length() != 0)
{
nRet = RTNORM;
}
break;
}
else
{
break;
}
}
}
return nRet;
}