📄 comboboxex.cpp
字号:
// ComboBoxEx.cpp : 僀儞僾儕儊儞僥乕僔儑儞 僼傽僀儖
//
#include "stdafx.h"
#include "ComboBoxEx.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CComboBoxEx2
CComboBoxEx2::CComboBoxEx2()
{
m_addSpace = FALSE;
}
CComboBoxEx2::~CComboBoxEx2()
{
}
BEGIN_MESSAGE_MAP(CComboBoxEx2, CComboBox)
//{{AFX_MSG_MAP(CComboBoxEx2)
ON_WM_KEYDOWN()
ON_CONTROL_REFLECT(CBN_DROPDOWN, OnDropdown)
ON_CONTROL_REFLECT(CBN_SELCHANGE, OnSelchange)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CComboBoxEx2 儊僢僙乕僕 僴儞僪儔
inline LPCSTR
AsnToKeyInput(const WORD wVKey)
{
LPCSTR psz;
switch (wVKey)
{
case (48):
case (96):
psz = "0";
break;
case (49):
case (97):
psz = "1";
break;
case (50):
case (98):
psz = "2";
break;
case (51):
case (99):
psz = "3";
break;
case (52):
case (100):
psz = "4";
break;
case (53):
case (101):
psz = "5";
break;
case (54):
case (102):
psz = "6";
break;
case (55):
case (103):
psz = "7";
break;
case (56):
case (104):
psz = "8";
break;
case (57):
case (105):
psz = "9";
break;
case (65):
psz = "a";
break;
case (66):
psz = "b";
break;
case (67):
psz = "c";
break;
case (68):
psz = "d";
break;
case (69):
psz = "e";
break;
case (70):
psz = "f";
break;
case (71):
psz = "g";
break;
case (72):
psz = "h";
break;
case (73):
psz = "i";
break;
case (74):
psz = "j";
break;
case (75):
psz = "k";
break;
case (76):
psz = "l";
break;
case (77):
psz = "m";
break;
case (78):
psz = "n";
break;
case (79):
psz = "o";
break;
case (80):
psz = "p";
break;
case (81):
psz = "q";
break;
case (82):
psz = "r";
break;
case (83):
psz = "s";
break;
case (84):
psz = "t";
break;
case (85):
psz = "u";
break;
case (86):
psz = "v";
break;
case (87):
psz = "w";
break;
case (88):
psz = "x";
break;
case (89):
psz = "y";
break;
case (90):
psz = "z";
break;
default:
psz = " ";
}
return psz;
}
void CComboBoxEx2::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// DELETE key傑偨偼Combo偵擖偭偰側偄Key擖椡偑偁傟偽Selection傪僋儕傾偡傞丅
if ( (VK_HELP < nChar) && (VK_MULTIPLY > nChar) )
{
LPCSTR lpszString = AsnToKeyInput(nChar);
if (CB_ERR == FindString(-1, lpszString))
SetCurSel(-1);
}
else if ((VK_DELETE == nChar) || (VK_BACK == nChar))
SetCurSel(-1);
CComboBox::OnKeyDown(nChar, nRepCnt, nFlags);
}
void CComboBoxEx2::OnDropdown()
{
if (!m_addSpace) return;
int cnt = GetCount();
CString tmpString;
GetLBText(cnt-1, tmpString);
if ("" != tmpString)
AddString("");
}
void CComboBoxEx2::OnSelchange()
{
if (!m_addSpace) return;
CString tmpString;
GetWindowText(tmpString);
if (tmpString == "")
SetCurSel(-1);
}
void CComboBoxEx2::AdjustComboWidth(BOOL addSpace)
{
m_addSpace = addSpace;
int width = 0;
for(int nIndex = 0; nIndex<GetCount(); nIndex++)
{
CString strItem;
GetLBText(nIndex, strItem);
if (!strItem.IsEmpty())
{
// Calulate the ideal text length.
CClientDC DC(this);
CFont* pOldFont = DC.SelectObject(GetFont());
CSize ItemSize = DC.GetTextExtent(strItem);
DC.SelectObject(pOldFont);
// Take the maximum of regular width and ideal width.
const int cxEdgeSpace = 2;
width = max(width,
ItemSize.cx + (cxEdgeSpace * 2));
}
}
SetDroppedWidth(18+width);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -