Files
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

327 lines
7.3 KiB
C++

// PropTreeItemCombo.cpp : implementation file
//
// Copyright (C) 1998-2001 Scott Ramsay
// sramsay@gonavi.com
// http://www.gonavi.com
//
// This material is provided "as is", with absolutely no warranty expressed
// or implied. Any use is at your own risk.
//
// Permission to use or copy this software for any purpose is hereby granted
// without fee, provided the above notices are retained on all copies.
// Permission to modify the code and to distribute modified code is granted,
// provided the above notices are retained, and a notice that the code was
// modified is included with the above copyright notice.
//
// If you use this code, drop me an email. I'd like to know if you find the code
// useful.
#include "stdafx.h"
#include "Resource.h"
#include "PropCtrl.h"
#include "PropItemCombo.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define DROPDOWN_HEIGHT 150
/////////////////////////////////////////////////////////////////////////////
// CPropItemCombo
CPropItemCombo::CPropItemCombo()
{
m_nDropHeight = DROPDOWN_HEIGHT,
m_pText = NULL;
m_pDouble = NULL;
m_pInt = NULL;
m_nItemType = ITEMTYPE_COMBOBOX;
}
CPropItemCombo::~CPropItemCombo()
{
}
BEGIN_MESSAGE_MAP(CPropItemCombo, CComboBox)
//{{AFX_MSG_MAP(CPropItemCombo)
ON_CONTROL_REFLECT(CBN_SELCHANGE, OnSelchange)
ON_CONTROL_REFLECT(CBN_EDITCHANGE, OnEditchange)
ON_CONTROL_REFLECT(CBN_KILLFOCUS, OnKillfocus)
ON_CONTROL_REFLECT(CBN_DROPDOWN, OnDropdown)
// ON_BN_CLICKED(IDC_BUTTON, OnButtonClick)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CPropItemCombo message handlers
void CPropItemCombo::DrawAttribute(CDC* pDC, const RECT& rc)
{
ASSERT(m_pProp!=NULL);
// verify the window has been created
if (!IsWindow(m_hWnd))
{
TRACE0("CPropItemCombo::DrawAttribute() - The window has not been created\n");
return;
}
// pDC->SelectObject(IsReadOnly() ? m_pProp->GetNormalFont() : m_pProp->GetBoldFont());
pDC->SelectObject(m_pProp->GetNormalFont());
if (IsReadOnly())
pDC->SetTextColor(RGB(140,140,140));
else
pDC->SetTextColor(RGB(0,0,0));
pDC->SetBkMode(TRANSPARENT);
CRect r = rc;
CString csText = GetValueText();
pDC->DrawText(csText, r, DT_SINGLELINE|DT_VCENTER);
}
void CPropItemCombo::OnMove()
{
if (IsWindow(m_hWnd) && IsWindowVisible())
SetWindowPos(NULL, m_rc.left, m_rc.top, m_rc.Width() + 1,
m_rc.Height(), SWP_NOZORDER|SWP_SHOWWINDOW);
}
void CPropItemCombo::OnActivate()
{
// activate the combo box
SetWindowPos(NULL, m_rc.left, m_rc.top, m_rc.Width(),
m_rc.Height() + m_nDropHeight, SWP_NOZORDER|SWP_SHOWWINDOW);
SetWindowText(GetValueText());
if (!m_bEdit && GetCount())
ShowDropDown(TRUE);
// 原来有按钮的话先隐藏先隐藏
ShowButton(FALSE);
ShowSpinCtrl(FALSE);
// add button on right
if (m_bHasBt)
CreateButton(this);
if (m_bHasSpinCtrl)
CreateSpinCtrl(this);
SetFocus();
}
BOOL CPropItemCombo::CreateDropListComb(int* pInt)
{
DWORD dwStyle = WS_VISIBLE|WS_CHILD|WS_VSCROLL|CBS_DROPDOWNLIST;
m_pInt = pInt;
m_bEdit = FALSE;
return CreateComb(dwStyle);
}
BOOL CPropItemCombo::CreateDropListComb(CString* pCString)
{
DWORD dwStyle = WS_VISIBLE|WS_CHILD|WS_VSCROLL|CBS_DROPDOWNLIST;
m_pText = pCString;
m_bEdit = FALSE;
return CreateComb(dwStyle);
}
BOOL CPropItemCombo::CreateDropDownComb(CString* pCString)
{
DWORD dwStyle = WS_VISIBLE|WS_CHILD|WS_VSCROLL|CBS_DROPDOWN;
m_pText = pCString;
m_bEdit = TRUE;
return CreateComb(dwStyle);
}
BOOL CPropItemCombo::CreateDropDownComb(double* pDouble)
{
DWORD dwStyle = WS_VISIBLE|WS_CHILD|WS_VSCROLL|CBS_DROPDOWN;
m_pDouble = pDouble;
m_bEdit = TRUE;
return CreateComb(dwStyle);
}
BOOL CPropItemCombo::CreateComb(DWORD dwStyle)
{
ASSERT(m_pProp!=NULL);
if (IsWindow(m_hWnd))
DestroyWindow();
// force as not visible child window
dwStyle = (WS_CHILD|WS_VSCROLL|dwStyle) & ~WS_VISIBLE;
if (!Create(dwStyle, CRect(0,0,0,0), m_pProp->GetCtrlParent(), GetCtrlID()))
{
TRACE0("CPropItemCombo::CreateComboBox() - failed to create combo box\n");
return FALSE;
}
SendMessage(WM_SETFONT, (WPARAM)m_pProp->GetNormalFont()->m_hObject);
return TRUE;
}
LONG CPropItemCombo::FindCBData(LPARAM lParam)
{
LONG idx;
for (idx = 0; idx < GetCount(); idx++)
{
if (GetItemData(idx)==(DWORD)lParam)
return idx;
}
return CB_ERR;
}
void CPropItemCombo::OnRefresh()
{
}
void CPropItemCombo::OnCommit()
{
}
void CPropItemCombo::OnSelchange()
{
CommitChanges();
ShowWindow(SW_HIDE);
CString csText;
GetLBText(GetCurSel(), csText);
if (NULL != m_pText)
*m_pText = csText;
else if (NULL != m_pDouble)
*m_pDouble = _tstof(csText);
else if (NULL != m_pInt)
*m_pInt = GetCurSel();
CWnd* pWnd = m_pProp->GetParent();
if (NULL != pWnd)
{
::SendMessage(pWnd->m_hWnd, WM_SELECTCHANGED, (WPARAM)ITEMTYPE_COMBOBOX, (LPARAM)this);
}
}
/*----------------------------------------------------------------------------*
* 描述: 编辑修改事件,肯定是DropDown,没有int型,只取当前字符
* 备注:
-----------------------------------------------------------------------------*/
void CPropItemCombo::OnEditchange()
{
CommitChanges();
CString csText;
GetWindowText(csText);
if (NULL != m_pText)
*m_pText = csText;
else if (NULL != m_pDouble)
*m_pDouble = _tstof(csText);
}
void CPropItemCombo::OnKillfocus()
{
CommitChanges();
ShowWindow(SW_HIDE);
}
void CPropItemCombo::OnDropdown()
{
RecalcDropWidth();
}
void CPropItemCombo::SetDropDownHeight(LONG nDropHeight)
{
m_nDropHeight = nDropHeight;
}
LONG CPropItemCombo::GetDropDownHeight()
{
return m_nDropHeight;
}
/*----------------------------------------------------------------------------*
* 描述: 得到要Draw画出显示的字符
* 备注:
-----------------------------------------------------------------------------*/
CString CPropItemCombo::GetValueText()
{
CString csText;
if (NULL != m_pText)
csText = *m_pText;
else if (NULL != m_pDouble)
{
csText.Format(_T("%.10f"), *m_pDouble);
csText.TrimRight(_T("0"));
csText.TrimRight(_T("."));
}
else if (NULL != m_pInt && *m_pInt > -1 && *m_pInt < GetCount())
{
GetLBText(*m_pInt, csText);
}
return csText;
}
/*----------------------------------------------------------------------------*
* 描述: 切换到给定的字符串
* 备注: 如果没有,则添加
-----------------------------------------------------------------------------*/
void CPropItemCombo::SetSelText(CString csText)
{
int nIndex = FindStringExact(0, csText);
if (nIndex < 0 && !csText.IsEmpty())
nIndex = AddString(csText);
SetCurSel(nIndex);
if (NULL != m_pInt)
*m_pInt = nIndex;
else if (NULL != m_pText)
*m_pText = csText;
}
// 自动计算宽度
void CPropItemCombo::RecalcDropWidth()
{
// Reset the dropped width
int nNumEntries = GetCount();
int nWidth = 0;
CString str;
CClientDC dc(this);
int nSave = dc.SaveDC();
dc.SelectObject(GetFont());
int nScrollWidth = ::GetSystemMetrics(SM_CXVSCROLL);
int nLength(0);
for (int i = 0; i < nNumEntries; i++)
{
GetLBText(i, str);
nLength = dc.GetTextExtent(str).cx + nScrollWidth;
nWidth = max(nWidth, nLength);
}
// Add margin space to the calculations
nWidth += dc.GetTextExtent(_T("0")).cx;
dc.RestoreDC(nSave);
SetDroppedWidth(nWidth);
}