📄 propertyitemeditors.h
字号:
return 0;
}
// Calendar message handlers
LRESULT OnKillFocus(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
LRESULT lRes = m_wndCalendar.DefWindowProc();
m_wndCalendar.ShowWindow(SW_HIDE);
return lRes;
}
// Ownerdrawn button message handler
LRESULT OnDrawItem(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/)
{
LPDRAWITEMSTRUCT lpdis = (LPDRAWITEMSTRUCT) lParam;
if( m_wndButton != lpdis->hwndItem ) return 0;
CDCHandle dc(lpdis->hDC);
// Paint as dropdown button
dc.DrawFrameControl(&lpdis->rcItem, DFC_SCROLL, (lpdis->itemState & ODS_SELECTED) ? DFCS_SCROLLDOWN | DFCS_PUSHED : DFCS_SCROLLDOWN);
return 0;
}
};
/////////////////////////////////////////////////////////////////////////////
// Editor with dropdown list
class CPropertyListWindow :
public CPropertyDropWindowImpl<CPropertyListWindow>
{
public:
DECLARE_WND_SUPERCLASS(_T("WTL_InplacePropertyList"), CEdit::GetWndClassName())
CContainedWindowT<CListBox> m_wndList;
int m_cyList; // Used to resize the listbox when first shown
typedef CPropertyDropWindowImpl<CPropertyListWindow> baseClass;
BEGIN_MSG_MAP(CPropertyListWindow)
MESSAGE_HANDLER(WM_CREATE, OnCreate)
MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
MESSAGE_HANDLER(WM_CHAR, OnChar)
MESSAGE_HANDLER(WM_DRAWITEM, OnDrawItem)
COMMAND_CODE_HANDLER(BN_CLICKED, OnButtonClicked)
CHAIN_MSG_MAP(baseClass)
ALT_MSG_MAP(1) // Button
CHAIN_MSG_MAP_ALT(baseClass, 1)
ALT_MSG_MAP(2) // List
MESSAGE_HANDLER(WM_KEYDOWN, OnKeyDown)
MESSAGE_HANDLER(WM_KILLFOCUS, OnKillFocus)
MESSAGE_HANDLER(WM_LBUTTONUP, OnLButtonUp)
END_MSG_MAP()
void AddItem(LPCTSTR pstrItem)
{
ATLASSERT(m_wndList.IsWindow());
ATLASSERT(!::IsBadStringPtr(pstrItem,-1));
m_wndList.AddString(pstrItem);
m_cyList = 0;
}
void SelectItem(int idx)
{
ATLASSERT(m_wndList.IsWindow());
m_wndList.SetCurSel(idx);
}
LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
{
// Create dropdown list (as hidden)
RECT rc = CWindow::rcDefault;
m_wndList.Create(this, 2, m_hWnd, &rc, NULL, WS_POPUP | WS_BORDER | WS_VSCROLL);
ATLASSERT(m_wndList.IsWindow());
m_wndList.SetFont( CWindow(GetParent()).GetFont() );
// Go create the rest of the control...
bHandled = FALSE;
return 0;
}
LRESULT OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
{
if( m_wndList.IsWindow() ) m_wndList.DestroyWindow();
bHandled = FALSE;
return 0;
}
LRESULT OnChar(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)
{
// Let the dropdown-box handle the keypress...
if( m_wndList.GetStyle() & WS_VISIBLE ) {
m_wndList.PostMessage(uMsg, wParam, lParam);
}
else {
TCHAR szStr[] = { (TCHAR) wParam, _T('\0') };
int idx = m_wndList.FindString(-1, szStr);
if( idx == LB_ERR ) return 0;
m_wndList.SetCurSel(idx);
BOOL bDummy;
OnKeyDown(WM_KEYDOWN, VK_RETURN, 0, bDummy);
}
return 0; // Don't allow any editing
}
LRESULT OnButtonClicked(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
if( m_cyList == 0 ) {
// Resize list to fit all items (but not more than 140 pixels)
const int MAX_HEIGHT = 140;
int cy = m_wndList.GetCount() * m_wndList.GetItemHeight(0);
m_cyList = min( MAX_HEIGHT, cy + (::GetSystemMetrics(SM_CYBORDER)*2) );
}
// Move the dropdown under the item
RECT rcWin;
GetWindowRect(&rcWin);
RECT rc = { rcWin.left, rcWin.bottom, rcWin.right, rcWin.bottom + m_cyList };
m_wndList.SetWindowPos(HWND_TOPMOST, &rc, SWP_SHOWWINDOW);
return 0;
}
// List message handlers
LRESULT OnKeyDown(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)
{
switch( wParam ) {
case VK_RETURN:
{
int idx = m_wndList.GetCurSel();
if( idx >= 0 ) {
// Copy text from list to item
int len = m_wndList.GetTextLen(idx) + 1;
LPTSTR pstr = (LPTSTR) _alloca(len * sizeof(TCHAR));
m_wndList.GetText(idx, pstr);
SetWindowText(pstr);
// Announce the new value
::SendMessage(GetParent(), WM_USER_PROP_UPDATEPROPERTY, 0, (LPARAM) m_hWnd);
}
}
::SetFocus(GetParent());
break;
case VK_ESCAPE:
// Announce the cancellation
::SendMessage(GetParent(), WM_USER_PROP_CANCELPROPERTY, 0, (LPARAM) m_hWnd);
::SetFocus(GetParent());
break;
}
bHandled = FALSE;
return 0;
}
LRESULT OnLButtonUp(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
LRESULT lRes = m_wndList.DefWindowProc();
// Selected an item? Fake RETURN key to copy new value...
BOOL bDummy;
OnKeyDown(WM_KEYDOWN, VK_RETURN, 0, bDummy);
return lRes;
}
LRESULT OnKillFocus(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
LRESULT lRes = m_wndList.DefWindowProc();
m_wndList.ShowWindow(SW_HIDE);
return lRes;
}
// Ownerdrawn button message handler
LRESULT OnDrawItem(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/)
{
LPDRAWITEMSTRUCT lpdis = (LPDRAWITEMSTRUCT) lParam;
if( m_wndButton != lpdis->hwndItem ) return 0;
CDCHandle dc(lpdis->hDC);
// Paint as dropdown button
dc.DrawFrameControl(&lpdis->rcItem, DFC_SCROLL, (lpdis->itemState & ODS_SELECTED) ? DFCS_SCROLLDOWN | DFCS_PUSHED : DFCS_SCROLLDOWN);
return 0;
}
};
/////////////////////////////////////////////////////////////////////////////
// Editor with embedded ListBox control
class CPropertyComboWindow :
public CPropertyDropWindowImpl<CPropertyComboWindow, CStatic>
{
public:
DECLARE_WND_SUPERCLASS(_T("WTL_InplacePropertyCombo"), CStatic::GetWndClassName())
CContainedWindowT<CListBox> m_wndList;
HWND m_hWndCombo; // Listbox supplied by Property class
int m_cyList; // Used to resize the listbox when first shown
typedef CPropertyDropWindowImpl<CPropertyComboWindow, CStatic> baseClass;
CPropertyComboWindow() :
m_wndList(this, 2),
m_hWndCombo(NULL),
m_cyList(0)
{
}
BEGIN_MSG_MAP(CPropertyComboWindow)
MESSAGE_HANDLER(WM_CREATE, OnCreate)
MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
MESSAGE_HANDLER(WM_PAINT, OnPaint)
MESSAGE_HANDLER(WM_DRAWITEM, OnDrawItem)
COMMAND_CODE_HANDLER(BN_CLICKED, OnButtonClicked)
CHAIN_MSG_MAP( baseClass )
ALT_MSG_MAP(1) // Button
CHAIN_MSG_MAP_ALT( baseClass, 1 )
ALT_MSG_MAP(2) // List
MESSAGE_HANDLER(WM_LBUTTONUP, OnLButtonUp)
END_MSG_MAP()
LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
{
ATLASSERT(::IsWindow(m_hWndCombo));
m_wndList.SubclassWindow(m_hWndCombo);
// Go create the rest of the control...
bHandled = FALSE;
return 0;
}
LRESULT OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
{
if( ::GetCapture() == m_wndList ) ::ReleaseCapture();
if( m_wndList.IsWindow() ) m_wndList.UnsubclassWindow();
if( ::IsWindowVisible(m_hWndCombo) ) ::ShowWindow(m_hWndCombo, SW_HIDE);
bHandled = FALSE;
return 0;
}
LRESULT OnPaint(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
CPaintDC dc( m_hWnd );
RECT rcButton;
m_wndButton.GetWindowRect(&rcButton);
RECT rcClient;
GetClientRect(&rcClient);
rcClient.right -= rcButton.right - rcButton.left;
DRAWITEMSTRUCT dis = { 0 };
dis.hDC = dc;
dis.hwndItem = m_wndList;
dis.CtlID = m_wndList.GetDlgCtrlID();
dis.CtlType = ODT_LISTBOX;
dis.rcItem = rcClient;
dis.itemState = ODS_DEFAULT | ODS_COMBOBOXEDIT;
dis.itemID = m_wndList.GetCurSel();
dis.itemData = (int) m_wndList.GetItemData(dis.itemID);
m_wndList.SendMessage(OCM_DRAWITEM, dis.CtlID, (LPARAM) &dis);
return 0;
}
LRESULT OnButtonClicked(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
if( m_cyList == 0 ) {
// Resize list to fit all items (but not more than 140 pixels)
const int MAX_HEIGHT = 140;
int cy = m_wndList.GetCount() * m_wndList.GetItemHeight(0);
m_cyList = min( MAX_HEIGHT, cy + (::GetSystemMetrics(SM_CYBORDER)*2) );
}
// Move the dropdown under the item
RECT rcWin;
GetWindowRect(&rcWin);
RECT rc = { rcWin.left, rcWin.bottom, rcWin.right, rcWin.bottom + m_cyList };
m_wndList.SetWindowPos(HWND_TOPMOST, &rc, SWP_SHOWWINDOW);
m_wndList.SetFocus();
::SetCapture(m_wndList);
return 0;
}
// List message handlers
LRESULT OnLButtonUp(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/)
{
LRESULT lRes = m_wndList.DefWindowProc();
::ReleaseCapture();
m_wndList.ShowWindow(SW_HIDE);
//
POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
BOOL bOutside = TRUE;
int iSel = m_wndList.ItemFromPoint(pt, bOutside);
if( !bOutside ) {
m_wndList.SetCurSel(iSel);
Invalidate();
// Announce the new value
::PostMessage(GetParent(), WM_USER_PROP_UPDATEPROPERTY, 0, (LPARAM) m_hWnd);
}
return lRes;
}
// Ownerdrawn button message handler
LRESULT OnDrawItem(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/)
{
LPDRAWITEMSTRUCT lpdis = (LPDRAWITEMSTRUCT) lParam;
if( m_wndButton != lpdis->hwndItem ) return 0;
CDCHandle dc(lpdis->hDC);
// Paint as dropdown button
dc.DrawFrameControl(&lpdis->rcItem, DFC_SCROLL, (lpdis->itemState & ODS_SELECTED) ? DFCS_SCROLLDOWN | DFCS_PUSHED : DFCS_SCROLLDOWN);
return 0;
}
};
/////////////////////////////////////////////////////////////////////////////
// Editor with browse button
class CPropertyButtonWindow :
public CPropertyDropWindowImpl<CPropertyButtonWindow>
{
public:
DECLARE_WND_SUPERCLASS(_T("WTL_InplacePropertyButton"), CEdit::GetWndClassName())
IProperty* m_prop; // BUG: Dangerous reference
typedef CPropertyDropWindowImpl<CPropertyButtonWindow> baseClass;
BEGIN_MSG_MAP(CPropertyButtonWindow)
COMMAND_CODE_HANDLER(BN_CLICKED, OnButtonClicked)
MESSAGE_HANDLER(WM_DRAWITEM, OnDrawItem)
CHAIN_MSG_MAP( baseClass )
ALT_MSG_MAP(1) // Button
CHAIN_MSG_MAP_ALT( baseClass, 1 )
END_MSG_MAP()
LRESULT OnButtonClicked(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
ATLASSERT(m_prop);
// Call Property class' implementation of BROWSE action
m_prop->Activate(PACT_BROWSE, 0);
::PostMessage(GetParent(), WM_USER_PROP_UPDATEPROPERTY, 0, (LPARAM) m_hWnd);
return 0;
}
LRESULT OnDrawItem(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/)
{
LPDRAWITEMSTRUCT lpdis = (LPDRAWITEMSTRUCT) lParam;
if( m_wndButton != lpdis->hwndItem ) return 0;
CDCHandle dc(lpdis->hDC);
// Paint as ellipsis button
dc.DrawFrameControl(&lpdis->rcItem, DFC_BUTTON, (lpdis->itemState & ODS_SELECTED) ? DFCS_BUTTONPUSH | DFCS_PUSHED : DFCS_BUTTONPUSH);
dc.SetBkMode(TRANSPARENT);
LPCTSTR pstrEllipsis = _T("...");
dc.DrawText(pstrEllipsis, ::lstrlen(pstrEllipsis), &lpdis->rcItem, DT_CENTER | DT_EDITCONTROL | DT_SINGLELINE | DT_VCENTER);
return 0;
}
};
#endif // __PROPERTYITEMEDITORS__H
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -