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

📄 fontview.c

📁 ReactOS是一些高手根据Windows XP的内核编写出的类XP。内核实现机理和API函数调用几乎相同。甚至可以兼容XP的程序。喜欢研究系统内核的人可以看一看。
💻 C
字号:
/*
 *	fontview
 *
 *	fontview.c
 *
 *	Copyright (C) 2007	Timo Kreuzer <timo <dot> kreuzer <at> reactos <dot> org>
 *
 *	This program is free software; you can redistribute it and/or modify
 *	it under the terms of the GNU General Public License as published by
 *	the Free Software Foundation; either version 2 of the License, or
 *	(at your option) any later version.
 *
 *	This program is distributed in the hope that it will be useful,
 *	but WITHOUT ANY WARRANTY; without even the implied warranty of
 *	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *	GNU General Public License for more details.
 *
 *	You should have received a copy of the GNU General Public License
 *	along with this program; if not, write to the Free Software
 *	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */

#include "fontview.h"

HINSTANCE g_hInstance;
WCHAR g_szTypeFaceName[LF_FULLFACESIZE];
LOGFONTW g_LogFontW;

static const WCHAR g_szFontViewClassName[] = L"FontViewWClass";

/* Tye definition for the GetFontResourceInfo function */
typedef BOOL (WINAPI *PGFRI)(LPCWSTR, DWORD *, LPVOID, DWORD);

DWORD
FormatString(
	DWORD dwFlags,
	HINSTANCE hInstance,
	DWORD dwStringId,
	DWORD dwLanguageId,
	LPWSTR lpBuffer,
	DWORD nSize,
	va_list* Arguments
)
{
	DWORD dwRet;
	int len;
	WCHAR Buffer[1000];

	len = LoadStringW(hInstance, dwStringId, (LPWSTR)Buffer, 1000);

	if (len)
	{
		dwFlags |= FORMAT_MESSAGE_FROM_STRING;
		dwFlags &= ~(FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_FROM_SYSTEM);
		dwRet = FormatMessageW(dwFlags, Buffer, 0, dwLanguageId, lpBuffer, nSize, Arguments);
		return dwRet;
	}
	return 0;
}

static void
ErrorMsgBox(HWND hParent, DWORD dwCaptionID, DWORD dwMessageId, ...)
{
	HMODULE hModule;
	HLOCAL hMemCaption = NULL;
	HLOCAL hMemText = NULL;
	va_list args;

	hModule = GetModuleHandle(NULL);

	va_start(args, dwMessageId);
	FormatString(FORMAT_MESSAGE_ALLOCATE_BUFFER,
	              NULL, dwMessageId, 0, (LPWSTR)&hMemText, 0, &args);
	va_end(args);

	FormatString(FORMAT_MESSAGE_ALLOCATE_BUFFER,
	              NULL, dwCaptionID, 0, (LPWSTR)&hMemCaption, 0, NULL);

	MessageBoxW(hParent, hMemText, hMemCaption, MB_ICONERROR);

	LocalFree(hMemCaption);
	LocalFree(hMemText);
}

int WINAPI 
WinMain (HINSTANCE hThisInstance,
         HINSTANCE hPrevInstance,
         LPSTR lpCmdLine,
         int nCmdShow)
{
	int argc;
	WCHAR** argv;
	DWORD dwSize;
	HWND hMainWnd;
	MSG msg;
	WNDCLASSEXW wincl;

	g_hInstance = hThisInstance;

	/* Get unicode command line */
	argv = CommandLineToArgvW(GetCommandLineW(), &argc);
	if (argc < 2)
	{
		ErrorMsgBox(0, IDS_ERROR, IDS_ERROR_BADCMD, argv[1]);
		return -1;
	}

	/* Try to add the font resource */
	if (!AddFontResourceW(argv[1]))
	{
		ErrorMsgBox(0, IDS_ERROR, IDS_ERROR_NOFONT, argv[1]);
		return -1;
	}

	/* Load the GetFontResourceInfo function from gdi32.dll */
	HINSTANCE hDLL = LoadLibraryW(L"GDI32.DLL");
	PGFRI GetFontResourceInfoW = (PGFRI)GetProcAddress(hDLL, "GetFontResourceInfoW");

	/* Get the font name */
	dwSize = sizeof(g_szTypeFaceName);
	if (!GetFontResourceInfoW(argv[1], &dwSize, g_szTypeFaceName, 1))
	{
		ErrorMsgBox(0, IDS_ERROR, IDS_ERROR_NOFONT, argv[1]);
		return -1;
	}

	dwSize = sizeof(LOGFONTW);
	if (!GetFontResourceInfoW(argv[1], &dwSize, &g_LogFontW, 2))
	{
		ErrorMsgBox(0, IDS_ERROR, IDS_ERROR_NOFONT, argv[1]);
		return -1;
	}

	if (!Display_InitClass(hThisInstance))
	{
		ErrorMsgBox(0, IDS_ERROR, IDS_ERROR_NOCLASS);
		return -1;
	}

	/* The main window class */
	wincl.cbSize = sizeof (WNDCLASSEXW);
	wincl.style = CS_DBLCLKS;
	wincl.lpfnWndProc = MainWndProc;
	wincl.cbClsExtra = 0;
	wincl.cbWndExtra = 0;
	wincl.hInstance = hThisInstance;
	wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
	wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
	wincl.hbrBackground = (HBRUSH)COLOR_BACKGROUND;
	wincl.lpszMenuName = NULL;
	wincl.lpszClassName = g_szFontViewClassName;
	wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);

	/* Register the window class, and if it fails quit the program */
	if (!RegisterClassExW (&wincl))
	{
		ErrorMsgBox(0, IDS_ERROR, IDS_ERROR_NOCLASS);
		return 0;
	}

	/* The class is registered, let's create the main window */
	hMainWnd = CreateWindowExW(
				0,						/* Extended possibilites for variation */
				g_szFontViewClassName,	/* Classname */
				g_szTypeFaceName,		/* Title Text */
				WS_OVERLAPPEDWINDOW,	/* default window */
				CW_USEDEFAULT,			/* Windows decides the position */
				CW_USEDEFAULT,			/* where the window ends up on the screen */
				544,					/* The programs width */
				375,					/* and height in pixels */
				HWND_DESKTOP,			/* The window is a child-window to desktop */
				NULL,					/* No menu */
				hThisInstance,			/* Program Instance handler */
				NULL					/* No Window Creation data */
			);
	ShowWindow(hMainWnd, nCmdShow);

	/* Main message loop */
	while (GetMessage (&msg, NULL, 0, 0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}

	RemoveFontResourceW(argv[1]);

	return msg.wParam;
}

static LRESULT
MainWnd_OnCreate(HWND hwnd)
{
	WCHAR szQuit[MAX_BUTTONNAME];
	WCHAR szPrint[MAX_BUTTONNAME];
	WCHAR szString[MAX_STRING];
	HWND hDisplay, hButtonQuit, hButtonPrint;

	/* create the display window */
	hDisplay = CreateWindowExW(
				0,						/* Extended style */
				g_szFontDisplayClassName,	/* Classname */
				L"",				/* Title text */
				WS_CHILD | WS_VSCROLL,	/* Window style */
				0,						/* X-pos */
				HEADER_SIZE,			/* Y-Pos */
				550,					/* Width */
				370-HEADER_SIZE,		/* Height */
				hwnd,					/* Parent */
				(HMENU)IDC_DISPLAY,		/* Identifier */
				g_hInstance,			/* Program Instance handler */
				NULL					/* Window Creation data */
			);

	LoadStringW(g_hInstance, IDS_STRING, szString, MAX_STRING);
	SendMessage(hDisplay, FVM_SETSTRING, 0, (LPARAM)szString);

	/* Init the display window with the font name */
	SendMessage(hDisplay, FVM_SETTYPEFACE, 0, (LPARAM)&g_LogFontW.lfFaceName);
	ShowWindow(hDisplay, SW_SHOWNORMAL);

	/* Create the quit button */
	LoadStringW(g_hInstance, IDS_QUIT, szQuit, MAX_BUTTONNAME);
	hButtonQuit = CreateWindowExW(
				0,						/* Extended style */
				L"button",				/* Classname */
				szQuit,					/* Title text */
				WS_CHILD | WS_VISIBLE,	/* Window style */
				BUTTON_POS_X,			/* X-pos */
				BUTTON_POS_Y,			/* Y-Pos */
				BUTTON_WIDTH,			/* Width */
				BUTTON_HEIGHT,			/* Height */
				hwnd,					/* Parent */
				(HMENU)IDC_QUIT,		/* Identifier */
				g_hInstance,			/* Program Instance handler */
				NULL					/* Window Creation data */
			);
	SendMessage(hButtonQuit, WM_SETFONT, (WPARAM)GetStockObject(DEFAULT_GUI_FONT), (LPARAM)TRUE);

	/* Create the print button */
	LoadStringW(g_hInstance, IDS_PRINT, szPrint, MAX_BUTTONNAME);
	hButtonPrint = CreateWindowExW(
				0,						/* Extended style */
				L"button",				/* Classname */
				szPrint,				/* Title text */
				WS_CHILD | WS_VISIBLE,	/* Window style */
				450,					/* X-pos */
				BUTTON_POS_Y,			/* Y-Pos */
				BUTTON_WIDTH,			/* Width */
				BUTTON_HEIGHT,			/* Height */
				hwnd,					/* Parent */
				(HMENU)IDC_PRINT,		/* Identifier */
				g_hInstance,			/* Program Instance handler */
				NULL					/* Window Creation data */
			);
	SendMessage(hButtonPrint, WM_SETFONT, (WPARAM)GetStockObject(DEFAULT_GUI_FONT), (LPARAM)TRUE);

	return 0;
}

static LRESULT
MainWnd_OnSize(HWND hwnd)
{
	RECT rc;

	GetClientRect(hwnd, &rc);
	MoveWindow(GetDlgItem(hwnd, IDC_PRINT), rc.right - BUTTON_WIDTH - BUTTON_POS_X, BUTTON_POS_Y, BUTTON_WIDTH, BUTTON_HEIGHT, TRUE);
	MoveWindow(GetDlgItem(hwnd, IDC_DISPLAY), 0, HEADER_SIZE, rc.right, rc.bottom - HEADER_SIZE, TRUE);

	return 0;
}

static LRESULT
MainWnd_OnPaint(HWND hwnd)
{
	HDC hDC;
	PAINTSTRUCT ps;
	RECT rc;

	hDC = BeginPaint(hwnd, &ps);
	GetClientRect(hwnd, &rc);
	rc.top = HEADER_SIZE - 2;
	rc.bottom = HEADER_SIZE;
	FillRect(hDC, &rc, GetStockObject(GRAY_BRUSH));
	EndPaint(hwnd, &ps);
	return 0;
}

LRESULT CALLBACK
MainWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
		case WM_CREATE:
			return MainWnd_OnCreate(hwnd);

		case WM_PAINT:
			return MainWnd_OnPaint(hwnd);

		case WM_SIZE:
			return MainWnd_OnSize(hwnd);

		case WM_COMMAND:
			switch(LOWORD(wParam))
			{
				case IDC_QUIT:
					PostQuitMessage (0);	/* send a WM_QUIT to the message queue */
					break;

				case IDC_PRINT:
					MessageBox(hwnd, TEXT("This function is unimplemented"), TEXT("Unimplemented"), MB_OK);
					break;
			}
			break;

		case WM_DESTROY:
			PostQuitMessage (0);	/* send a WM_QUIT to the message queue */
			break;

		default:					/* for messages that we don't deal with */
			return DefWindowProcW(hwnd, message, wParam, lParam);
	}

	return 0;
}

/* EOF */

⌨️ 快捷键说明

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