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

? 歡迎來(lái)到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? fontembed.cpp

?? Windows 圖形編程 書籍
?? CPP
字號(hào):
//-----------------------------------------------------------------------------------//
//              Windows Graphics Programming: Win32 GDI and DirectDraw               //
//                             ISBN  0-13-086985-6                                   //
//                                                                                   //
//  Written            by  Yuan, Feng                             www.fengyuan.com   //
//  Copyright (c) 2000 by  Hewlett-Packard Company                www.hp.com         //
//  Published          by  Prentice Hall PTR, Prentice-Hall, Inc. www.phptr.com      //
//                                                                                   //
//  FileName   : fontembed.cpp					                                     //
//  Description: Font embedding demo program, Chapter 14                             //
//  Version    : 1.00.000, May 31, 2000                                              //
//-----------------------------------------------------------------------------------//

#define STRICT
#define _WIN32_WINNT 0x0500

#include <windows.h>
#include <tchar.h>
#include <string.h>
#include <assert.h>

#include "resource.h"
#include "..\..\include\Dialog.h"


#define FR_HIDDEN   0x01
#define FR_MEM		0x02


BOOL RemoveFont(const TCHAR * fontname, int option, HANDLE hFont)
{
	if ( option & FR_MEM )
	{
		return RemoveFontMemResourceEx(hFont);
	}
	
	TCHAR ttffile[MAX_PATH];
	TCHAR fotfile[MAX_PATH];

	GetCurrentDirectory(MAX_PATH-1, ttffile);
	_tcscpy(fotfile, ttffile);

	wsprintf(ttffile + _tcslen(ttffile), "\\%s.ttf", fontname);
	wsprintf(fotfile + _tcslen(fotfile), "\\%s.fot", fontname);

	BOOL rslt;

	switch ( option )
	{
		case 0:
		case FR_HIDDEN:
			rslt = RemoveFontResource(fotfile);
			break;

		case FR_PRIVATE:
		case FR_NOT_ENUM:
		case FR_PRIVATE | FR_NOT_ENUM:
			rslt = RemoveFontResourceEx(fotfile, option, NULL);
			break;

		default:
			assert(false);
			rslt = FALSE;
	}

	if ( ! DeleteFile(fotfile) )
		rslt = FALSE;

	if ( ! DeleteFile(ttffile) )
		rslt = FALSE;

	return rslt;
}


HANDLE InstallFont(void * fontdata, unsigned fontsize, const TCHAR * fontname, int option)
{
	if ( option & FR_MEM )
	{
		DWORD num;

		return AddFontMemResourceEx(fontdata, fontsize, NULL, & num);
	}

	TCHAR ttffile[MAX_PATH];
	TCHAR fotfile[MAX_PATH];

	GetCurrentDirectory(MAX_PATH-1, ttffile);
	_tcscpy(fotfile, ttffile);

	wsprintf(ttffile + _tcslen(ttffile), "\\%s.ttf", fontname);
	wsprintf(fotfile + _tcslen(fotfile), "\\%s.fot", fontname);

	HANDLE hFile = CreateFile(ttffile, GENERIC_WRITE, 0, NULL,
						CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, 0);

	if ( hFile==INVALID_HANDLE_VALUE )
		return NULL;

	DWORD dwWritten;
	WriteFile(hFile, fontdata, fontsize, & dwWritten, NULL);
	FlushFileBuffers(hFile);
	CloseHandle(hFile);

	if ( ! CreateScalableFontResource(option & FR_HIDDEN, fotfile, ttffile, NULL) )
		return NULL;

	switch ( option )
	{
		case 0:
		case FR_HIDDEN:
			return (HANDLE) AddFontResource(fotfile);

		case FR_PRIVATE:
		case FR_NOT_ENUM:
		case FR_PRIVATE | FR_NOT_ENUM:
			return (HANDLE) AddFontResourceEx(fotfile, option, NULL);

		default:
			assert(false);
			return NULL;
	}
}

const char key[4] = { 0x31, 0x41, 0x59, 0x26 }; // encryption key, pi

typedef struct
{
	char	Tag[4];			// font
	DWORD	size;			// size of attached font data
	char	FileName[56];
}	FontEmbed;


// Load/unload a document, install/uninstall the fonts embedded inside

int ProcessDocument(const TCHAR * docname, int option, bool load, HANDLE hfont[])
{
	HANDLE handle = CreateFile(docname, GENERIC_READ, FILE_SHARE_READ, 
		NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
	
	if ( handle == INVALID_HANDLE_VALUE )
		return 0;

	int       processed  = 0;
	DWORD	  dwRead;
	FontEmbed header;

	while ( ReadFile(handle, & header, sizeof(header), & dwRead, NULL) )
	{
		if ( dwRead!=sizeof(header) )
			break;

		if ( strncmp(header.Tag, "FONT", 4) )
			break;

		unsigned size = header.size - sizeof(header);

		BYTE * pData = new BYTE[size];

		if ( pData==NULL )
			break;

		ReadFile(handle, pData, size, & dwRead, NULL);

		// simple decryption
		for (unsigned i=0; i<size; i++)
			pData[i] ^= key[i % 4];

		if ( load )
			hfont[processed] = InstallFont(pData, size, header.FileName, option);
		else
			if ( ! RemoveFont(header.FileName, option, hfont[processed]) )
			{
				delete [] pData;
				break;
			}
		
		delete [] pData;

		if ( hfont[processed] )
			processed ++;
		else
			break;
	}

	CloseHandle(handle);

	return processed;
}

class KFileDialog
{
	void SetupOFN(OPENFILENAME & ofn, TCHAR Filter[], HWND hWnd, const TCHAR * pExtension, const TCHAR * pClass);

public:
	TCHAR	m_FileName[MAX_PATH];
	TCHAR	m_TitleName[MAX_PATH];
	
	// "bmp" "Bitmap Files"
	BOOL GetOpenFileName(HWND hWnd, const TCHAR * pExtension, const TCHAR * pClass);
	BOOL GetSaveFileName(HWND hWnd, const TCHAR * pExtension, const TCHAR * pClass);
};


void KFileDialog::SetupOFN(OPENFILENAME & ofn, TCHAR Filter[], HWND hWnd, const TCHAR * pExtension, const TCHAR * pClass)
{
	memset(& ofn, 0, sizeof(ofn));

	wsprintf(Filter, "%s (*.%s)%c*.%s%c", pClass, pExtension, 0, pExtension, 0);

	ofn.lStructSize		= sizeof(OPENFILENAME);
	ofn.hwndOwner		= hWnd;
	ofn.lpstrFilter		= Filter; // _T("Bitmaps (*.bmp)\0*.bmp\0\0");
	ofn.lpstrFile		= m_FileName;
	ofn.nMaxFile		= MAX_PATH;
	ofn.lpstrFileTitle	= m_TitleName;
	ofn.nMaxFileTitle	= MAX_PATH;
	ofn.lpstrDefExt		= pExtension; // _T("bmp");
	ofn.nFilterIndex	= 1;

	m_FileName[0] = 0;
}


BOOL KFileDialog::GetOpenFileName(HWND hWnd, const TCHAR * pExtension, const TCHAR * pClass)
{
	OPENFILENAME ofn;
	TCHAR Filter[MAX_PATH];

	SetupOFN(ofn, Filter, hWnd, pExtension, pClass);

	ofn.Flags	= OFN_HIDEREADONLY | OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
			
	return ::GetOpenFileName(&ofn);
}


BOOL KFileDialog::GetSaveFileName(HWND hWnd, const TCHAR * pExtension, const TCHAR * pClass)
{
	OPENFILENAME ofn;
	TCHAR Filter[MAX_PATH];

	SetupOFN(ofn, Filter, hWnd, pExtension, pClass);

	ofn.Flags  = OFN_HIDEREADONLY | OFN_PATHMUSTEXIST | OFN_OVERWRITEPROMPT;
	
	return ::GetSaveFileName(&ofn);
}

// Generate a EMF file with fonts embedded as GDI commands


BOOL GenerateDoc(const TCHAR * docname)
{
	HANDLE out = CreateFile(docname, GENERIC_WRITE, FILE_SHARE_READ, 
		NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

	if ( out==INVALID_HANDLE_VALUE )
		return FALSE;

	KFileDialog fi;

	while ( fi.GetOpenFileName(NULL, "ttf", "TrueType fonts") )
	{
		HANDLE handle = CreateFile(fi.m_TitleName, GENERIC_READ, FILE_SHARE_READ, 
			NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
	
		if ( handle == INVALID_HANDLE_VALUE )
			break;

		DWORD size = GetFileSize(handle, NULL);

		FontEmbed font;
		
		memset(&font, 0, sizeof(font));
		font.Tag[0] = 'F';
		font.Tag[1] = 'O';
		font.Tag[2] = 'N';
		font.Tag[3] = 'T';
		font.size   = sizeof(FontEmbed) + size;

		int len = strlen(fi.m_TitleName);

		for (int i=0; i<len; i++)
			if ( fi.m_TitleName[i]=='.')
				break;
			else
				font.FileName[i] = fi.m_TitleName[i];
		
		DWORD dwWritten, dwRead;

		// write header
		WriteFile(out, & font, sizeof(font), & dwWritten, NULL);

		char buffer[4096];

		// read, write the whole font file
		while ( ReadFile(handle, buffer, sizeof(buffer), & dwRead, NULL) )
		{
			if ( dwRead==0) 
				break;

			// simple encryption
			for (unsigned i=0; i<dwRead; i++)
				buffer[i] ^= key[i % 4];

			WriteFile(out, buffer, dwRead, & dwWritten, NULL);
		}

		CloseHandle(handle);
	}

	CloseHandle(out);

	return TRUE;
}

const TCHAR * FontList[] =
{
	"Euro Sign",
	"Ozzie Black",
	"Ozzie Black Italic",
	NULL
};


class KMyDialog : public KDialog
{
	HINSTANCE m_hInst;
	int		  m_nFontChange;
	HFONT	  m_font[10];
	int		  m_option;

	void GetOption(void)
	{			
		m_option = 0;

		if ( SendDlgItemMessage(m_hWnd, IDC_HIDDEN, BM_GETCHECK, 0, 0)==BST_CHECKED )
			m_option = FR_HIDDEN;

		if ( SendDlgItemMessage(m_hWnd, IDC_PRIVATE, BM_GETCHECK, 0, 0)==BST_CHECKED )
			m_option = FR_PRIVATE;

		if ( SendDlgItemMessage(m_hWnd, IDC_NOENUM, BM_GETCHECK, 0, 0)==BST_CHECKED )
			m_option = FR_NOT_ENUM;

		if ( SendDlgItemMessage(m_hWnd, IDC_MEM, BM_GETCHECK, 0, 0)==BST_CHECKED )
			m_option = FR_MEM;
	}

	void Update(void)
	{
		for (int i=0; FontList[i]; i++)
		{
			if ( m_font[i] )
				DeleteObject(m_font[i]);

			LOGFONT logfont = { - 20,
							 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, 
							 ANSI_CHARSET, OUT_TT_PRECIS, CLIP_DEFAULT_PRECIS, 
							 PROOF_QUALITY, VARIABLE_PITCH };
			
			_tcscpy(logfont.lfFaceName, FontList[i]);

			if (i==2) 
				logfont.lfItalic = TRUE;

			if (i==0)
				logfont.lfCharSet = SYMBOL_CHARSET;

			m_font[i] = CreateFontIndirect(& logfont);

			HDC      hDC = GetDC(NULL);
			HGDIOBJ hOld = SelectObject(hDC, m_font[i]);

			OUTLINETEXTMETRIC outm[3];
			GetOutlineTextMetrics(hDC, sizeof(outm), outm);
			SelectObject(hDC, hOld);
			DeleteObject(hDC);

			TCHAR name[64];
			
			if ( i==0 )
				_tcscpy(name, "e");
			else
			{
				_tcscpy(name, (char *) outm + (int) outm[0].otmpFamilyName);
				_tcscat(name, " ");
				_tcscat(name, (char *) outm + (int) outm[0].otmpStyleName);
			}

			SetDlgItemText(m_hWnd, IDC_SAMPLE1 + i, name);

			SendDlgItemMessage(m_hWnd, IDC_SAMPLE1 + i, WM_SETFONT, (WPARAM) m_font[i], TRUE);
    	}
	}

	virtual BOOL OnInitDialog(HWND hWnd, WPARAM wParam, LPARAM lParam)
	{
		m_hWnd = hWnd;

		Update();

		return TRUE;
	}

	HANDLE hFont[32];

	virtual BOOL OnCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
	{
		switch ( LOWORD(wParam) )
		{
			case IDOK:
				EndDialog(hWnd, IDOK);
				return TRUE;

			case IDC_GENERATE:
				GenerateDoc("testdoc.tmp");
				return TRUE;

			case IDC_LOAD:
			{
				GetOption();
				int succeeded = ProcessDocument("testdoc.tmp", m_option, true, hFont);

				TCHAR mess[32];
				wsprintf(mess, "%d font(s) installed.", succeeded);
				MessageBox(NULL, mess, "Font Install", MB_OK);

				if ( succeeded )
                    if ( m_option==0 )
						SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
					else
						Update();
			}
				return TRUE;

			case IDC_UNLOAD:
			{
				GetOption();
				int succeeded = ProcessDocument("testdoc.tmp", m_option, false, hFont);

				TCHAR mess[32];
				wsprintf(mess, "%d font(s) uninstalled.", succeeded);
				MessageBox(NULL, mess, "Font Install", MB_OK);

				if ( succeeded )
					if ( m_option==0 )
						SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
					else
						Update();
			}
				return TRUE;
		}

		return FALSE;
	}

    virtual BOOL DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
    	switch (uMsg)
	    {
		    case WM_INITDIALOG:
			    return OnInitDialog(hWnd, wParam, lParam);

		    case WM_COMMAND:
			    return OnCommand(hWnd, wParam, lParam);

			case WM_FONTCHANGE:
				{
					TCHAR mess[32];

					wsprintf(mess, "WM_FONTCHANGE %d", ++m_nFontChange);
					SetDlgItemText(hWnd, IDC_MESSAGE, mess);

					Update();
				}
				return TRUE;
	    }

	    return FALSE;
    }

public:
	KMyDialog(HINSTANCE hInst)
	{
		m_hInst       = hInst;
		m_nFontChange = 0;
		m_option      = 0;

		memset(m_font, 0, sizeof(m_font));
	}
};


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int)
{
	KMyDialog dialog(hInstance);

	return dialog.Dialogbox(hInstance, MAKEINTRESOURCE(IDD_FONT));
}

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产偷国产偷亚洲高清人白洁| 亚洲婷婷在线视频| 欧美一区二区三区婷婷月色| 在线观看一区二区精品视频| 91一区二区三区在线播放| 国产乱人伦偷精品视频免下载| 91原创在线视频| a在线播放不卡| av午夜一区麻豆| 91浏览器在线视频| 91美女片黄在线观看| 色婷婷亚洲精品| 欧美私人免费视频| 6080日韩午夜伦伦午夜伦| 欧美一区二区三区人| 日韩三级电影网址| 精品国产a毛片| 欧美国产欧美综合| 亚洲色欲色欲www| 亚洲福利电影网| 日本系列欧美系列| 精品在线视频一区| 高清不卡一区二区在线| 不卡区在线中文字幕| 日本精品一区二区三区高清 | 国产成人精品午夜视频免费| 粉嫩aⅴ一区二区三区四区五区 | 日韩免费在线观看| 国产亚洲综合性久久久影院| 中文字幕精品三区| 亚洲国产精品一区二区www| 亚洲午夜日本在线观看| 秋霞午夜鲁丝一区二区老狼| 国内精品不卡在线| 99re在线视频这里只有精品| 91国产免费观看| 欧美一区二区三区日韩| 国产日韩欧美在线一区| 亚洲欧洲色图综合| 视频一区在线播放| 国产精品一品视频| 91电影在线观看| 日韩欧美激情在线| 亚洲日本在线看| 日韩精品成人一区二区在线| 国产精品996| 色先锋久久av资源部| 日韩精品一区二区三区四区| 国产精品第一页第二页第三页| 香蕉成人伊视频在线观看| 国产成人在线看| 欧美日韩综合不卡| 国产欧美一区二区三区鸳鸯浴| 一区二区三区在线影院| 激情丁香综合五月| 欧美视频一二三区| 欧美国产精品一区| 秋霞成人午夜伦在线观看| caoporm超碰国产精品| 日韩精品一区二区三区四区视频 | 国产精品污www在线观看| 亚洲午夜精品网| 成人小视频在线| 亚洲激情综合网| 久久成人免费网| 在线一区二区三区四区五区| 久久久久久久久岛国免费| 亚洲国产精品一区二区久久| 不卡av电影在线播放| 精品日韩欧美一区二区| 亚洲国产综合视频在线观看| 成人夜色视频网站在线观看| 91精品国产福利在线观看| 亚洲欧美乱综合| 成人激情综合网站| 精品国产欧美一区二区| 日韩二区三区四区| 在线欧美日韩国产| 中文字幕av资源一区| 精品亚洲成a人| 欧美日韩精品一区二区| 亚洲品质自拍视频网站| 国产成人av福利| 日韩免费观看高清完整版| 视频一区免费在线观看| 色婷婷av久久久久久久| 国产精品久久久久久亚洲毛片| 久久av资源网| 欧美一级黄色片| 奇米888四色在线精品| 欧美怡红院视频| 亚洲美女一区二区三区| 不卡电影免费在线播放一区| 久久久亚洲午夜电影| 精品一区二区免费在线观看| 91麻豆精品国产91久久久久久| 亚洲福利视频导航| 欧美日韩国产a| 亚洲aaa精品| 欧美巨大另类极品videosbest | 国产剧情在线观看一区二区| 日韩一区二区三免费高清| 日本午夜精品视频在线观看| 欧美日本国产一区| 午夜欧美在线一二页| 欧美日韩在线播放| 性做久久久久久免费观看欧美| 欧美丝袜自拍制服另类| 亚洲一区二区av电影| 91久久一区二区| 依依成人综合视频| 欧美性色黄大片| 婷婷亚洲久悠悠色悠在线播放| 欧美日韩国产经典色站一区二区三区| 夜夜精品浪潮av一区二区三区| 欧美在线视频全部完| 亚洲成人av免费| 日韩亚洲欧美综合| 国内精品嫩模私拍在线| 国产午夜精品久久久久久免费视| 成人永久免费视频| 亚洲精品中文字幕乱码三区| 欧美日韩在线观看一区二区| 日韩在线一区二区三区| 日韩一级在线观看| 国产原创一区二区| 国产精品色婷婷| 91福利在线免费观看| 日韩专区一卡二卡| 亚洲精品在线观| a亚洲天堂av| 婷婷综合另类小说色区| 日韩精品一区二区三区在线观看| 国产很黄免费观看久久| 最好看的中文字幕久久| 欧美日韩一级二级| 国产乱码精品一品二品| 亚洲欧美视频一区| 欧美一区三区四区| 国产成人午夜精品影院观看视频| 亚洲欧美区自拍先锋| 欧美一区二区免费视频| 国产成人精品aa毛片| 亚洲高清三级视频| 久久亚洲二区三区| 91九色最新地址| 久久成人免费网站| 亚洲美女在线一区| 精品国产sm最大网站| 一本大道久久a久久综合| 日本成人中文字幕在线视频| 欧美国产精品中文字幕| 91精品视频网| 播五月开心婷婷综合| 午夜电影网一区| 国产欧美日韩一区二区三区在线观看| 日本黄色一区二区| 欧美成人国产一区二区| 成人免费三级在线| 人禽交欧美网站| 亚洲人一二三区| 精品电影一区二区| 欧美三级日韩三级| 国产91精品精华液一区二区三区 | 中文字幕av一区 二区| 欧美人动与zoxxxx乱| 成人性生交大片免费看在线播放 | a级精品国产片在线观看| 日韩精品免费视频人成| 国产精品成人一区二区三区夜夜夜| 在线不卡一区二区| 91蜜桃视频在线| 国产不卡视频一区| 蜜臀av一区二区| 亚洲一区在线观看免费| 中文一区二区在线观看| 精品毛片乱码1区2区3区| 欧美日韩国产一级片| 粉嫩一区二区三区在线看| 精油按摩中文字幕久久| 亚洲国产视频一区| 亚洲免费在线看| 国产精品少妇自拍| 亚洲精品一区在线观看| 欧美夫妻性生活| 在线精品视频免费播放| 99国产精品久| 国产盗摄一区二区三区| 久久97超碰国产精品超碰| 天堂av在线一区| 亚洲午夜免费电影| 亚洲激情自拍视频| 最好看的中文字幕久久| 国产精品人妖ts系列视频| 精品国产免费人成在线观看| 欧美日韩www| 一本一道综合狠狠老| 91在线你懂得| eeuss国产一区二区三区| 国产a视频精品免费观看|