⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 kfontcombo.h

📁 WTL开发的一个写字板程序 ,很有借鉴意义
💻 H
字号:
/*
 Copyright (c) 2000 
 Author: Konstantin Boukreev 
 E-mail: konstantin@mail.primorye.ru 

 Created: 30.06.2000 14:14:21
 Version: 1.0.0

 Font selection combo

 Portions Copyright:
	Girish Bharadwaj (Girish_Bharadwaj@smtpnotes.pictel.com) - http://codeguru.earthweb.com/combobox/font_selection_combo.shtml
	Norm Almond of Paramax Technology Limited (nalmond@hotmail.com) - http://codeguru.earthweb.com/combobox/fontcombo.shtml
*/

#ifndef _kFontCombo_0690d7cc_49b3_4d9a_9390_978bc2839650
#define _kFontCombo_0690d7cc_49b3_4d9a_9390_978bc2839650

#if _MSC_VER > 1000 
#pragma once
#endif // _MSC_VER > 1000

//#include "kFlatCombo.h"

class kFontCombo : public kFlatCombo
{	
	CImageList m_img;	
	int m_cyItem;

	enum 
	{
		ITEM_DEFAULT_HEIGHT = 15,
		GLYPH_WIDTH = 15
	};

public:	
	kFontCombo() { m_cyItem = ITEM_DEFAULT_HEIGHT; }

	BEGIN_MSG_MAP(kFontCombo)
		MESSAGE_HANDLER(WM_CREATE, OnCreate);
		MESSAGE_HANDLER(WM_DESTROY, OnDestroy);
		MESSAGE_HANDLER(OCM_DRAWITEM, OnDrawItem);
		MESSAGE_HANDLER(OCM_MEASUREITEM, OnMeasureItem);
		CHAIN_MSG_MAP(kFlatCombo)		
		ALT_MSG_MAP(1)
			CHAIN_MSG_MAP_ALT(kFlatCombo, 1)
	END_MSG_MAP()

	HWND CreateEx(HWND hWnd, RECT& rc, int cyItem = -1, int ID = 0)
	{
		m_cyItem = cyItem;
		return Create(hWnd, rc, 0, WS_CHILD|WS_VSCROLL|WS_TABSTOP|WS_VISIBLE|CBS_DROPDOWN|CBS_OWNERDRAWFIXED|CBS_HASSTRINGS | CBS_SORT,
				0, ID, 0);		
	}

	const TCHAR* GetSelFontName()
	{
		static TCHAR szFaceName[LF_FACESIZE];		
		GetLBText(GetCurSel(), szFaceName);
		return szFaceName;
	}

	int SetSelFont (CHARFORMAT& cf)
	{
		return SelectString(-1, cf.szFaceName);
	}

	int SetSelFont (CHARFORMAT2& cf)
	{
		return SelectString(-1, cf.szFaceName);
	}

protected:
	LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
	{
		LRESULT lRet = kFlatCombo::OnCreate(uMsg, wParam, lParam, bHandled);

		Init();

		return lRet;
	}
	
	LRESULT OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
	{
		return 0;
	}

	LRESULT OnDrawItem(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/)
	{
		DRAWITEMSTRUCT *lpDIS = reinterpret_cast<DRAWITEMSTRUCT *>(lParam);

		ATLASSERT(lpDIS->CtlType == ODT_COMBOBOX); 
	
		CDCHandle dc = lpDIS->hDC;		
		RECT rc = lpDIS->rcItem;
	
		if (lpDIS->itemState & ODS_FOCUS)
			dc.DrawFocusRect(&rc);
			
		int nIndexDC = dc.SaveDC();

		CBrush br;
		
		if (lpDIS->itemState & ODS_SELECTED)
		{
			br.CreateSolidBrush(::GetSysColor(COLOR_HIGHLIGHT));
			dc.SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT));
		}
		else
		{
			br.CreateSolidBrush(dc.GetBkColor());
		}

		dc.SetBkMode(TRANSPARENT);
		dc.FillRect(&rc, br);
		
		DWORD dwData = GetItemData(lpDIS->itemID);

		int nLen = GetLBTextLen(lpDIS->itemID);
		TCHAR* psFont = (TCHAR *)_alloca(sizeof TCHAR * (nLen + 1));
		GetLBText(lpDIS->itemID, psFont);
		
		if (dwData & TRUETYPE_FONTTYPE)
			m_img.Draw(dc, 0, rc.left, rc.top,ILD_TRANSPARENT);
	
		rc.left += GLYPH_WIDTH + 2;
		dc.TextOut(rc.left, rc.top, psFont);

		dc.RestoreDC(nIndexDC);
		return 0;
	}

	LRESULT OnMeasureItem(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/)
	{
		MEASUREITEMSTRUCT* pmis = reinterpret_cast<MEASUREITEMSTRUCT*>(lParam);
		ATLASSERT(pmis->CtlType == ODT_COMBOBOX);

		if (m_cyItem == -1)
		{
			// calculate height
			CClientDC dc(m_hWnd);
			HFONT hFont = ((HFONT)GetStockObject( DEFAULT_GUI_FONT ));
			dc.SelectFont( hFont ); //GetFont()
			TEXTMETRIC tm;
			dc.GetTextMetrics(&tm); 

			m_cyItem = tm.tmHeight + tm.tmInternalLeading;
		}

		pmis->itemHeight = m_cyItem;
		return TRUE;			
	}
	
	void Init ()
	{		
		HFONT hFont = ((HFONT)GetStockObject( DEFAULT_GUI_FONT ));
		SetFont(hFont);

		m_img.CreateFromImage(IDB_TRUETYPE_FONTTYPE, GLYPH_WIDTH, 1, RGB(255,255,255), IMAGE_BITMAP);
		CClientDC dc(m_hWnd);		

		EnumFonts (dc, 0,(FONTENUMPROC) EnumFontProc,(LPARAM)this); //Enumerate font
	}


	static BOOL CALLBACK EnumFontProc (LPLOGFONT lplf, LPTEXTMETRIC /*lptm*/, DWORD dwType, LPARAM lpData)	
	{	
		kFontCombo *pThis = reinterpret_cast<kFontCombo*>(lpData);		
		int index = pThis->AddString(lplf->lfFaceName);
		pThis->SetItemData (index, dwType); 
		return TRUE;
	}

};

#endif //_kFontCombo_0690d7cc_49b3_4d9a_9390_978bc2839650

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -