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