枚举系统字体的COMBOX例子

1  设置组合框控件变量

	DDX_Control(pDX, IDC_COMBO1, m_FontList);

 

	// 当前字体名称
	CString m_selFont;



2  声明CALLBACK函数 

    注意:此函数为全局函数,而不是类函数

BOOL   CALLBACK   AFX_EXPORT  EnumFamScreenCallBackEx(ENUMLOGFONTEX*   pelf,   
													  NEWTEXTMETRICEX*   lpntm,   int   FontType,   LPVOID   pThis);/*回调函数,枚举系统已经安装的字体*/ 


 

3 定义CALLBACK函数

 

BOOL CALLBACK  EnumFamScreenCallBackEx(ENUMLOGFONTEX* pelf, NEWTEXTMETRICEX* lpntm, int FontType, LPVOID pThis)
{

	if (FontType&RASTER_FONTTYPE)
	{
		return TRUE;
	}

	CString str;

	if (FontType&TRUETYPE_FONTTYPE)
	{
		str=((pelf)->elfLogFont.lfFaceName);
	}

	int i=((CSizeDlg *)pThis)->m_FontList.AddString(str);

	return TRUE;

}

 

4 调用

 

BOOL CSizeDlg::EnumerateFonts()
{

	HDC hDC;
	hDC=::GetWindowDC(NULL);
	LOGFONT lf;

	memset(&lf,0,sizeof(LOGFONT));
	
	lf.lfCharSet=GB2312_CHARSET;

	if (!::EnumFontFamiliesEx(
		hDC,
		&lf,
		(FONTENUMPROC)EnumFamScreenCallBackEx,
		(LPARAM)this,
		(DWORD) 0
		))
	{
		return FALSE;
	}

	::ReleaseDC(NULL,hDC);

	CString strCurrentFont;
	CString strPreFont=L"";

	int num=m_FontList.GetCount();


	// 删除重复项
	for (int i=num;i>0;i--)
	{
		m_FontList.GetLBText((i-1),strCurrentFont);

		if (strCurrentFont==strPreFont)
		{
			m_FontList.DeleteString(i-1);
		}

		strPreFont=strCurrentFont;
	}

	// 删除@字体  循环次序 为 从高到低   因为删除某个元素后, 各个位置可能改变

	num=m_FontList.GetCount();
	for (int i=num-1;i>=0;i--)
	{
		m_FontList.GetLBText(i,strCurrentFont);
		strCurrentFont=strCurrentFont.Left(1);

		if (strCurrentFont==_T("@"))
		{
			m_FontList.DeleteString(i);
		}
	}




	if (!m_selFont.IsEmpty())
	{
		CString temp;
		for (int i=0;i<m_FontList.GetCount();i++)
		{
			m_FontList.GetLBText(i,temp);

			if (temp.Compare(m_selFont)==0)
			{
				m_FontList.SetCurSel(i);
				break;
			}
			
		}

	}

	return TRUE;

}



 

BOOL CSizeDlg::OnInitDialog()
{
	CDialog::OnInitDialog();


	EnumerateFonts();


	UpdateData(FALSE);
	return TRUE;  
}


 

 5  记录当前字体名称

 

	//SEL 改变时 触发的消息
	ON_CBN_SELCHANGE(IDC_COMBO1, &CSizeDlg::OnCbnSelchangeCombo1)


 

// SEL 改变时,记录当前字体名称
void CSizeDlg::OnCbnSelchangeCombo1()
{
	// TODO: 在此添加控件通知处理程序代码


	int i=m_FontList.GetCurSel();
	m_FontList.GetLBText(i,m_selFont);


}


 

你可能感兴趣的:(枚举系统字体的COMBOX例子)