亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? wizfontsenumerator.cpp

?? visual c++ 實例編程
?? CPP
字號:
// WizFontsEnumerator.cpp: implementation of the CWizFontsEnumerator class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "WizFontsEnumerator.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

namespace
{
UCHAR TTDefaults[] = { 8, 9, 10, 11, 12, 14, 16, 18, 20, 22, 24, 26, 28, 36, 48, 72 };
const int TTDefaultsSize =  sizeof(TTDefaults)/sizeof(TTDefaults[0]);
}
//////////////////////////////////////////////////////////////////////

CWizFontsEnumerator::Font::Font(const LOGFONT& lf, DWORD fontType, LPCTSTR Script)
	: m_Name(lf.lfFaceName) ,  m_bItalics(false), m_bBold(false), 
	  m_bUnderline(false),  m_bRegular(false),
	  m_dwFontType(fontType),  m_bInited(false)
{
	if (Script && *Script)
		AddScript(Script);
}

void CWizFontsEnumerator::Font::operator=(const Font& f)
{
	m_Name		= f.m_Name		;
	m_bItalics	= f.m_bItalics	; 
	m_bBold		= f.m_bBold		; 
	m_bUnderline= f.m_bUnderline;
	m_bRegular	= f.m_bRegular;
	m_dwFontType= f.m_dwFontType;

	m_Script.RemoveAll();
	for (int i = 0; i < f.m_Script.GetSize(); i++)
		m_Script.Add(f.m_Script[i]);

	m_sizes.SetSize(f.m_sizes.GetSize());
	for (i = 0; i < f.m_sizes.GetSize(); i++)
		m_sizes[i] = f.m_sizes[i];

	m_bInited = f.m_bInited;
}

struct Font_EnumStep
{
	Font_EnumStep(CWizFontsEnumerator::Font& f, CDC& dc)
		: rTHIS(f) , r_dc(dc) 
		{
		cyPixelsPerInch = dc.GetDeviceCaps(LOGPIXELSY);
		}

	CWizFontsEnumerator::Font& rTHIS;
	CDC& r_dc;
	int	cyPixelsPerInch;
};

int CALLBACK DetailsEnumProc (const ENUMLOGFONTEX *lpelfe, const NEWTEXTMETRICEX *lpntme, unsigned long FontType, LPARAM lParam) 
{
	Font_EnumStep* p = reinterpret_cast<Font_EnumStep*>(lParam);
	/*
	CWizFontsEnumerator::Font* pTHIS = reinterpret_cast<CWizFontsEnumerator::Font*>(lParam);
	return pTHIS->DoEnumStep (lpelfe, lpntme, FontType);
	*/
	return p->rTHIS.DoEnumStep (lpelfe, lpntme, FontType, *p);
}

int CWizFontsEnumerator::Font::DoEnumStep (const ENUMLOGFONTEX *lpelf, const NEWTEXTMETRICEX *lpntm, unsigned long FontType, Font_EnumStep& data)
{
	ASSERT(&(data.rTHIS) == this);

	if (FontType & TRUETYPE_FONTTYPE)
	{
		if (!(lpntm->ntmTm.ntmFlags & (NTM_BOLD | NTM_ITALIC)))
			{
			TRACE("\n\tFont %s add regular", lpelf->elfLogFont.lfFaceName);
			m_bRegular = true;
			}

		if (lpntm->ntmTm.ntmFlags & NTM_ITALIC)
			{
			TRACE("\n\tFont %s add Italics", lpelf->elfLogFont.lfFaceName);
			m_bItalics = true;
			}

		if (lpntm->ntmTm.ntmFlags & NTM_BOLD)
			{
			TRACE("\n\tFont %s add Bold", lpelf->elfLogFont.lfFaceName);
			m_bBold = true;
			}
	}
	else
	{
		if (FontType & RASTER_FONTTYPE)
		{
			int height = lpntm->ntmTm.tmHeight - lpntm->ntmTm.tmInternalLeading;
			int size_pp = MulDiv(height, 72, data.cyPixelsPerInch); //, height);
			TRACE("\n\tFont %s add size %d", lpelf->elfLogFont.lfFaceName, size_pp);
			AddSize(size_pp, height);
		}

		if (lpelf->elfLogFont.lfWeight >= FW_BOLD && lpelf->elfLogFont.lfItalic)
			{
			TRACE("\n\tFont %s add bold & italics", lpelf->elfLogFont.lfFaceName);
			m_bItalics = true;
			m_bBold = true;
			}
		else if (lpelf->elfLogFont.lfWeight >= FW_BOLD)
			{
			TRACE("\n\tFont %s add bold", lpelf->elfLogFont.lfFaceName);
			m_bBold = true;
			}
		else if (lpelf->elfLogFont.lfItalic)
			{
			TRACE("\n\tFont %s add italics", lpelf->elfLogFont.lfFaceName);
			m_bItalics = true;
			}
		else
			{
			TRACE("\n\tFont %s add regular", lpelf->elfLogFont.lfFaceName);
			m_bRegular = true;
			}
	}

	return 1;
	
}

void CWizFontsEnumerator::Font::DoInit() 
{
	// Init flags
	m_bRegular = m_bItalics = m_bBold = m_bUnderline = false;

	// Init for enumeration
	CClientDC dc(NULL);
	LOGFONT lf;
	memset (&lf, 0, sizeof(lf));
	lf.lfCharSet	= DEFAULT_CHARSET;
	strcpy(lf.lfFaceName, m_Name);
	Font_EnumStep temp(const_cast<Font&>(*this), dc);
	// Enumeration procedure
	EnumFontFamiliesEx (dc.m_hAttribDC, &lf, (FONTENUMPROC)::DetailsEnumProc, reinterpret_cast<LPARAM>(&temp), 0);
	// Finish init:
	m_bUnderline = true; // Always availible so far
	// Allow for "synthesized" italic && bold variants
	if (m_bRegular)
		m_bItalics = m_bBold = true;
}

void CWizFontsEnumerator::Font::Initialize() const
{
	if (m_bInited)
		return;
	const_cast<Font*>(this)->DoInit();
	m_bInited = true;
}


void CWizFontsEnumerator::Font::FillSizes(CWordArray& sizes) const
{
	sizes.SetSize(0);
	if (m_dwFontType != RASTER_FONTTYPE)
		{
		sizes.SetSize(TTDefaultsSize);
		for (int i = 0; i < TTDefaultsSize; i++)
			sizes[i] = TTDefaults[i];
		}
	else
		{
		Initialize();
		sizes.SetSize(m_sizes.GetSize());
		for (int i = 0; i < m_sizes.GetSize(); i++)
			sizes[i] = m_sizes[i];
		}
}

bool CWizFontsEnumerator::Font::CanBeItalics	() const
{
	Initialize();
	return m_bItalics;
}

bool CWizFontsEnumerator::Font::CanBeBold		() const
{
	Initialize();
	return m_bBold;
}

bool CWizFontsEnumerator::Font::CanBeUnderline	() const
{
	Initialize();
	return m_bUnderline;
}

bool CWizFontsEnumerator::Font::CanBeRegular	() const
{
	Initialize();
	return m_bRegular;
}

bool CWizFontsEnumerator::Font::MustBeRegular	() const
{
	Initialize();
	return (m_bRegular && !(m_bItalics || m_bUnderline || m_bBold));
}

bool CWizFontsEnumerator::Font::MustBeItalics	() const
{
	Initialize();
	return (m_bItalics && !(m_bRegular /*|| m_bUnderline || m_bBold*/));
}

bool CWizFontsEnumerator::Font::MustBeBold	() const
{
	Initialize();
	return (m_bBold && !(m_bRegular /*|| m_bItalics  || m_bUnderline*/));
}

bool CWizFontsEnumerator::Font::MustBeUnderline	() const
{
	Initialize();
	return false;// (m_bUnderline && !(m_bRegular || m_bItalics || m_bBold));
}


void CWizFontsEnumerator::Font::AddSize(int pp_size, int lf_height)
{
	m_sizes.Add(WORD(pp_size));
}

void CWizFontsEnumerator::Font::AddScript(LPCTSTR Script)
{ 
	m_Script.Add(Script);
}

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CWizFontsEnumerator::CWizFontsEnumerator()
{
}

CWizFontsEnumerator::~CWizFontsEnumerator()
{

}

int	CWizFontsEnumerator::DoEnumStep (const ENUMLOGFONTEX *lpelfe, const NEWTEXTMETRICEX *lpntme, unsigned long FontType)
{
	CString script = lpelfe->elfScript;

TRACE("\nFont %s", lpelfe->elfLogFont.lfFaceName);

	// If font exists yet
	int nFont = FindFont(lpelfe->elfLogFont.lfFaceName);
	if (nFont >= 0)
		{
		m_aFonts.ElementAt(nFont).AddScript(script);

TRACE(" Add script %s", (LPCTSTR)script);

		return 1;
		}
	// add font to list
	Font f (lpelfe->elfLogFont, FontType, script);
	int i = m_aFonts.Add(f);

	if (i < 0)
		{ ASSERT(0); AfxThrowMemoryException(); }

TRACE(" Script %s", (LPCTSTR)script);

	return 1;
}

int CALLBACK EnumProc (const ENUMLOGFONTEX *lpelfe, const NEWTEXTMETRICEX *lpntme, unsigned long FontType, LPARAM lParam) 
{
	CWizFontsEnumerator* pTHIS = reinterpret_cast<CWizFontsEnumerator*>(lParam);
	return pTHIS->DoEnumStep (lpelfe, lpntme, FontType);
}

void	CWizFontsEnumerator::DoEnumerate (HDC hdc)
{
	ASSERT(NULL != hdc);
	m_aFonts.RemoveAll();

	LOGFONT lf;
	memset (&lf, 0, sizeof(lf));
	lf.lfCharSet	= DEFAULT_CHARSET;
	lf.lfFaceName[0]= 0;
	EnumFontFamiliesEx (hdc, &lf, (FONTENUMPROC)::EnumProc, reinterpret_cast<LPARAM>(this), 0);

#ifdef _DEBUG
	TRACE("\nFound %d fonts:", m_aFonts.GetSize());
	for (int i = 0; i < m_aFonts.GetSize(); i++)
	{
		const Font* p = GetFont(i);
		TRACE("\n %s", (LPCTSTR)(p->Name()));
		for (int j = 0; j < p->GetScriptsCount(); j++)
			TRACE("\n\t %s", (LPCTSTR)(p->GetScript(j)));
	}
#endif

}

void	CWizFontsEnumerator::InternalEnumerate (HDC hdc, bool bWayBack)
{
	// If no valid DC supplied
	if (NULL == hdc && bWayBack)
		{
		TRACE0("Warning! NULL hDC at CWizFontsEnumerator::Enumerate"); 
		// Get main app window (hopefully)
		CClientDC some(NULL);
		//CWnd* pSomeWnd = AfxGetMainWnd();
		InternalEnumerate(some, false); // No way back here again
		}
	else
		DoEnumerate (hdc);
}


void	CWizFontsEnumerator::InternalEnumerate (CDC* pdc,	bool bWayBack)
{
	if (NULL != pdc)
		InternalEnumerate(pdc->m_hAttribDC, bWayBack);
	else
		{
		TRACE0("Warning! NULL pDC at CWizFontsEnumerator::Enumerate");
		if (bWayBack) // try to figure up something
			InternalEnumerate ((HDC)NULL, bWayBack);
		}
}

void	CWizFontsEnumerator::InternalEnumerate (CWnd* pWnd,	bool bWayBack)
{
	if (NULL == pWnd)
		{
		TRACE0("Warning! NULL Window at CWizFontsEnumerator::Enumerate"); 
		if (bWayBack) // try to figure up something
			InternalEnumerate((HDC)NULL, bWayBack);
		}
	else
		{
		// Two attempts to get DC: client DC and, if fails,
		// window DC
		// BLOCK
			{
			CClientDC dc(pWnd);
			if (dc.m_hAttribDC != NULL)
				{
				InternalEnumerate(&dc, bWayBack);
				return;
				}
			}
		// BLOCK
			{
			CWindowDC dc(pWnd);
			InternalEnumerate(&dc, bWayBack);
			}
		}
}

void	CWizFontsEnumerator::Enumerate (HDC hdc)
{
	InternalEnumerate(hdc, true);
}

void	CWizFontsEnumerator::Enumerate (CDC* pdc)
{
	InternalEnumerate(pdc, true);
}

void	CWizFontsEnumerator::Enumerate (CWnd* pWnd)
{
	InternalEnumerate(pWnd, true);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产亚洲一二三区| 国产精品一区不卡| 麻豆国产欧美一区二区三区| 国产99久久久国产精品免费看| 色系网站成人免费| 亚洲精品一线二线三线| 亚洲综合一区在线| 国产成+人+日韩+欧美+亚洲| 7777精品伊人久久久大香线蕉的 | 欧美日韩第一区日日骚| 久久久99免费| 日精品一区二区三区| 日本精品一区二区三区高清 | 91精品国产综合久久精品麻豆| 欧美—级在线免费片| 蜜臀av在线播放一区二区三区| 色网站国产精品| 国产精品美女视频| 国产精品亚洲一区二区三区妖精| 欧美一级免费观看| 亚洲一区免费视频| 91传媒视频在线播放| 亚洲精品免费在线| 91亚洲精品乱码久久久久久蜜桃| 久久精品综合网| 国产一区二区三区高清播放| 91精品国产麻豆国产自产在线 | 久久精品国产精品亚洲红杏| 欧美日韩在线三级| 一区二区三区高清在线| 99久久er热在这里只有精品66| 久久九九久精品国产免费直播| 九九在线精品视频| 日韩精品一区二区三区在线播放| 亚洲国产va精品久久久不卡综合| 一本大道久久精品懂色aⅴ | 国产校园另类小说区| 久久成人久久爱| 国产肉丝袜一区二区| 国产在线不卡一区| 日本一区二区成人在线| 波多野洁衣一区| 亚洲欧美激情插 | 一本色道久久加勒比精品| 亚洲色图在线看| 欧美私模裸体表演在线观看| 天使萌一区二区三区免费观看| 日韩一区二区三区电影在线观看| 久久精品国产一区二区三 | 亚洲欧美另类久久久精品| 欧美性生活大片视频| 日韩国产欧美一区二区三区| 日韩精品影音先锋| 成人一区二区三区在线观看| 亚洲欧美日韩系列| 欧美日韩免费视频| 久久er精品视频| 中文字幕乱码一区二区免费| 91国产免费看| 经典三级在线一区| 中文字幕日韩一区| 欧美日韩一级二级| 国产美女精品一区二区三区| 亚洲视频在线一区| 91精品国产欧美一区二区| 国产激情91久久精品导航| 亚洲欧洲一区二区三区| 7777女厕盗摄久久久| 成人免费黄色大片| 日韩国产一二三区| 亚洲欧美一区二区不卡| 日韩欧美一区二区在线视频| 国产黄人亚洲片| 亚洲国产日韩a在线播放 | 精品国产亚洲一区二区三区在线观看 | 国产精品蜜臀在线观看| 欧美少妇bbb| 国产乱子伦视频一区二区三区 | 成人av电影在线| 日韩av电影天堂| 日本一区二区视频在线| 亚洲四区在线观看| 久久精品视频免费观看| 精品综合免费视频观看| 久久草av在线| 亚洲午夜在线电影| 久久噜噜亚洲综合| 欧美久久久久久久久中文字幕| 国产成人av网站| 毛片一区二区三区| 亚洲一区中文在线| 日韩一区日韩二区| 久久久欧美精品sm网站| 欧美精选一区二区| 色欧美日韩亚洲| 成人激情图片网| 国产精品一区二区久久不卡| 视频一区中文字幕国产| 亚洲免费大片在线观看| 中文字幕欧美一| 国产精品乱码一区二区三区软件| 日韩视频一区在线观看| 欧美系列一区二区| 91福利社在线观看| 97精品久久久久中文字幕| 丁香激情综合国产| 国产精品一二三四五| 黄页网站大全一区二区| 麻豆精品一区二区| 久久99国产精品免费| 伦理电影国产精品| 久久精品国产免费看久久精品| 日本免费新一区视频| 男男gaygay亚洲| 捆绑调教美女网站视频一区| 美女视频免费一区| 久久成人羞羞网站| 国产乱码精品一区二区三区av| 久久99久久99精品免视看婷婷 | 国产欧美在线观看一区| 国产亚洲1区2区3区| 国产欧美精品区一区二区三区 | 91香蕉视频在线| 91丝袜高跟美女视频| 色综合久久久久综合| 91久久一区二区| 欧美日韩国产免费一区二区| 制服丝袜一区二区三区| 欧美videos中文字幕| 久久综合一区二区| 国产精品免费人成网站| 一区二区三区在线视频观看58 | 欧美日韩成人激情| 日韩一级免费观看| 国产亚洲综合色| 夜夜夜精品看看| 亚洲午夜精品17c| 美女视频黄 久久| 韩国精品久久久| 成人午夜激情片| 在线观看成人免费视频| 欧美一区二区黄| 亚洲国产电影在线观看| 亚洲综合色噜噜狠狠| 麻豆一区二区在线| www..com久久爱| 欧美日韩一区视频| 久久综合视频网| 亚洲永久免费视频| 加勒比av一区二区| 色综合久久九月婷婷色综合| 欧美日韩二区三区| 中文av字幕一区| 手机精品视频在线观看| 国产精品系列在线观看| 在线视频观看一区| 精品日韩一区二区三区免费视频| 中文字幕一区二区三区四区不卡| 亚洲一级二级在线| 丰满少妇在线播放bd日韩电影| 色系网站成人免费| 久久久久久久久久久久久久久99| 综合久久久久久久| 精品中文字幕一区二区| 色婷婷av一区二区三区软件 | 日本久久一区二区三区| 久久众筹精品私拍模特| 一区二区三区高清不卡| 成人免费电影视频| 日韩欧美第一区| 亚洲aⅴ怡春院| 91在线小视频| 久久男人中文字幕资源站| 五月婷婷激情综合网| 99久久久久久| 国产欧美日韩综合精品一区二区| 亚洲一区二区三区四区五区中文 | 久久精品国产免费看久久精品| 色香蕉成人二区免费| 日本一区二区电影| 久久99久久99小草精品免视看| 欧美日本在线视频| 亚洲一区二区三区视频在线| 91一区二区在线| 国产精品电影一区二区| 国产一区二区三区最好精华液| 欧美精品一卡两卡| 一区二区视频在线| 91在线免费视频观看| 中文字幕在线播放不卡一区| 国产不卡在线一区| 国产精品伦理在线| 成人免费视频视频在线观看免费| 欧美精品一区在线观看| 精品一区中文字幕| 日韩精品一区二区三区在线| 激情综合色播五月| 久久久久国产一区二区三区四区| 久久99精品国产| 国产欧美日韩另类一区|