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

281 lines
5.1 KiB
C++
Raw Blame History

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