281 lines
5.5 KiB
C++
281 lines
5.5 KiB
C++
#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;
|
||
}
|