2025-11-27 16:46:48 +09:00

353 lines
7.7 KiB
C++

// OXFontComboBox.cpp : implementation file
//
// Version: 9.3
#include "stdafx.h"
#include "OXFontComboBox.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
IMPLEMENT_DYNAMIC(COXFontListBoxHelper, COXFontListBox)
/////////////////////////////////////////////////////////////////////////////
COXFontListBoxHelper::COXFontListBoxHelper() :
m_pComboBox(NULL)
{
}
COXFontListBoxHelper::~COXFontListBoxHelper()
{
}
BEGIN_MESSAGE_MAP(COXFontListBoxHelper, COXFontListBox)
//{{AFX_MSG_MAP(COXFontListBoxHelper)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// COXFontListBox message handlers
BOOL COXFontListBoxHelper::FilterFont(OXLBFONTINFO* pLBFI)
{
if(GetAssociateComboBox()!=NULL)
return (GetAssociateComboBox()->FilterFont(pLBFI));
else
return (COXFontListBox::FilterFont(pLBFI));
}
BOOL COXFontListBoxHelper::InitializeListBox()
{
ASSERT(::IsWindow(GetSafeHwnd()));
int nIndexSelected=-1;
BOOL bIsMultipleSel=(GetStyle()&LBS_MULTIPLESEL);
if(!bIsMultipleSel)
{
nIndexSelected=GetCurSel();
}
if(GetCount()>0)
{
ResetContent();
}
if(!COXListBoxEx::InitializeListBox())
return FALSE;
SetRedraw(FALSE);
PopulateWithFonts();
if(GetSaveRestoreMRUState())
RestoreMRUState();
SetCurSel(nIndexSelected);
SetRedraw(TRUE);
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// COXFontComboBox
IMPLEMENT_DYNAMIC(COXFontComboBox, CComboBox)
void AFXAPI DDX_FontComboFont(CDataExchange *pDX, int nIDC, CFont* pFont)
{
ASSERT(pFont!=NULL);
HWND hWnd=pDX->PrepareCtrl(nIDC);
ASSERT(hWnd!=NULL);
COXFontComboBox* pComboBox=
DYNAMIC_DOWNCAST(COXFontComboBox,CWnd::FromHandle(hWnd));
ASSERT(pComboBox!=NULL);
if(pDX->m_bSaveAndValidate)
{
if((HFONT)*pFont!=NULL)
pFont->DeleteObject();
CFont* pSelectedFont=pComboBox->GetSelectedFont();
if(pSelectedFont!=NULL)
{
LOGFONT lf;
VERIFY(pSelectedFont->GetLogFont(&lf));
VERIFY(pFont->CreateFontIndirect(&lf));
}
}
else
{
pComboBox->SelectFont(pFont);
}
}
COXFontComboBox::COXFontComboBox() :
m_bAllowToUpdateMRU(FALSE)
{
}
COXFontComboBox::~COXFontComboBox()
{
}
BEGIN_MESSAGE_MAP(COXFontComboBox, CComboBox)
//{{AFX_MSG_MAP(COXFontComboBox)
ON_WM_ERASEBKGND()
ON_CONTROL_REFLECT_EX(CBN_SELCHANGE, OnSelChange)
ON_CONTROL_REFLECT_EX(CBN_SELENDOK, OnSelEndOk)
ON_CONTROL_REFLECT_EX(CBN_CLOSEUP, OnCloseUp)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// COXFontComboBox message handlers
int COXFontComboBox::CompareItem(LPCOMPAREITEMSTRUCT lpCompareItemStruct)
{
// TODO: Add your code to determine the sorting order of the specified items
// return -1 = item 1 sorts before item 2
// return 0 = item 1 and item 2 sort the same
// return 1 = item 1 sorts after item 2
ASSERT(GetListBoxCtrl()!=NULL);
return GetListBoxCtrl()->CompareItem(lpCompareItemStruct);
}
void COXFontComboBox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
// TODO: Add your code to draw the specified item
if(lpDrawItemStruct->itemState&ODS_COMBOBOXEDIT)
{
lpDrawItemStruct->itemID=GetCurSel();
CString sText(_T(""));
if(lpDrawItemStruct->itemID!=CB_ERR)
{
GetListBoxCtrl()->GetText(lpDrawItemStruct->itemID,sText);
}
CDC* pDC=CDC::FromHandle(lpDrawItemStruct->hDC);
CRect rect(lpDrawItemStruct->rcItem);
if((lpDrawItemStruct->itemAction & (ODA_SELECT|ODA_DRAWENTIRE)))
{
CBrush brush(lpDrawItemStruct->itemState & ODS_SELECTED ?
::GetSysColor(COLOR_HIGHLIGHT) : ::GetSysColor(COLOR_WINDOW));
pDC->FillRect(rect,&brush);
}
else if((lpDrawItemStruct->itemAction & (ODA_FOCUS|ODA_DRAWENTIRE)) &&
!(lpDrawItemStruct->itemState & ODS_FOCUS))
{
CBrush brush(lpDrawItemStruct->itemState & ODS_SELECTED ?
::GetSysColor(COLOR_HIGHLIGHT) : ::GetSysColor(COLOR_WINDOW));
pDC->FrameRect(rect,&brush);
}
CRect rectText=rect;
rectText.DeflateRect(2,0);
int nOldBkMode=pDC->SetBkMode(TRANSPARENT);
pDC->DrawText(sText,rectText,DT_LEFT|DT_SINGLELINE|DT_VCENTER);
pDC->SetBkMode(nOldBkMode);
if((lpDrawItemStruct->itemAction & (ODA_FOCUS|ODA_DRAWENTIRE)) &&
(lpDrawItemStruct->itemState & ODS_FOCUS))
{
pDC->DrawFocusRect(rect);
}
}
else
{
ASSERT(GetListBoxCtrl()!=NULL);
GetListBoxCtrl()->DrawItem(lpDrawItemStruct);
}
}
void COXFontComboBox::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
// TODO: Add your code to determine the size of specified item
UNREFERENCED_PARAMETER(lpMeasureItemStruct);
}
BOOL COXFontComboBox::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
UNREFERENCED_PARAMETER(pDC);
return TRUE;
}
CFont* COXFontComboBox::GetSelectedFont()
{
ASSERT(::IsWindow(GetSafeHwnd()));
int nIndex=GetCurSel();
if(nIndex==CB_ERR)
{
return NULL;
}
else
{
ASSERT(GetListBoxCtrl()!=NULL);
return ((COXListBoxEx*)GetListBoxCtrl())->GetItemFont(nIndex);
}
}
int COXFontComboBox::SelectFont(CFont* pFont)
{
ASSERT(::IsWindow(GetSafeHwnd()));
ASSERT(pFont!=NULL);
LOGFONT lf;
if(!pFont->GetLogFont(&lf))
{
TRACE(_T("COXFontComboBox::SelectFont: failed to retrieve log info for specified CFont object\n"));
return CB_ERR;
}
return SelectFont(&lf);
}
int COXFontComboBox::SelectFont(LOGFONT* pLF)
{
ASSERT(::IsWindow(GetSafeHwnd()));
ASSERT(pLF!=NULL);
return SelectFont(pLF->lfFaceName);
}
int COXFontComboBox::SelectFont(LPCTSTR lpszFontName)
{
ASSERT(lpszFontName!=NULL);
CString sFontName=lpszFontName;
if(sFontName.IsEmpty())
return SetCurSel(-1);
else
return SelectString(-1,sFontName);
}
BOOL COXFontComboBox::OnCloseUp()
{
// TODO: Add your control notification handler code here
m_bAllowToUpdateMRU=TRUE;
return FALSE;
}
BOOL COXFontComboBox::OnSelEndOk()
{
// TODO: Add your control notification handler code here
return FALSE;
}
BOOL COXFontComboBox::OnSelChange()
{
// TODO: Add your control notification handler code here
if(m_bAllowToUpdateMRU)
{
ASSERT(GetListBoxCtrl()!=NULL);
if(((COXListBoxEx*)GetListBoxCtrl())->GetMaxItemsBeforeSeparator()>0)
{
int nIndex=GetCurSel();
if(nIndex!=CB_ERR)
{
VERIFY(((COXListBoxEx*)GetListBoxCtrl())->MRUInsert(nIndex,0)!=LB_ERR);
}
}
m_bAllowToUpdateMRU=FALSE;
}
return FALSE;
}
void COXFontComboBox::SetSaveRestoreMRUState(BOOL bSaveRestore)
{
ASSERT(GetListBoxCtrl()!=NULL);
((COXListBoxEx*)GetListBoxCtrl())->SetSaveRestoreMRUState(bSaveRestore);
}
BOOL COXFontComboBox::GetSaveRestoreMRUState()
{
ASSERT(GetListBoxCtrl()!=NULL);
return ((COXListBoxEx*)GetListBoxCtrl())->GetSaveRestoreMRUState();
}
void COXFontComboBox::SubclassListBoxCtrl(CWnd* pWnd)
{
TRACE(_T("COXFontComboBox::SubclassListBoxCtrl\n"));
ASSERT(GetListBoxCtrl()!=NULL);
if(::IsWindow(GetListBoxCtrl()->GetSafeHwnd()))
{
VERIFY(GetListBoxCtrl()->DestroyWindow());
}
COXBaseSubclassedComboBox<CComboBox,COXFontListBoxHelper,CEdit>::
SubclassListBoxCtrl(pWnd);
((COXFontListBoxHelper*)GetListBoxCtrl())->AssociateComboBox(this);
}
BOOL COXFontComboBox::InitializeComboBox()
{
if(!COXBaseSubclassedComboBox<CComboBox,COXFontListBoxHelper,CEdit>::
InitializeComboBox())
{
return FALSE;
}
COXListBoxEx* pListBox=(COXListBoxEx*)GetListBoxCtrl();
ASSERT(pListBox!=NULL);
ASSERT(!::IsWindow(pListBox->GetSafeHwnd()));
VERIFY(pListBox->CreateEx(WS_EX_TOOLWINDOW,_T("ComboLBox"),_T(""),
WS_CHILD|LBS_OWNERDRAWVARIABLE|LBS_HASSTRINGS|LBS_NOINTEGRALHEIGHT|WS_VISIBLE,
CRect(0,0,0,0),GetParent(),0));
for(int nIndex=0; nIndex<pListBox->GetCount(); nIndex++)
{
CString sText;
pListBox->GetText(nIndex,sText);
VERIFY(AddString(sText)>=0);
}
return TRUE;
}