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