Import
This commit is contained in:
@@ -0,0 +1,320 @@
|
||||
#include <stdio.h>
|
||||
#include "SimpFont.h"
|
||||
#include "c_WinApp.h"
|
||||
|
||||
/* ------------------------------------------------------------------------------------------------------------------ */
|
||||
/* */
|
||||
|
||||
#define WINDOW_CLASS_NAME "SimpFont.Main"
|
||||
|
||||
|
||||
|
||||
static LOGFONT LogFont;
|
||||
static HFONT TheFont;
|
||||
static char aFaceName[80];
|
||||
static TEXTMETRIC TextMets;
|
||||
static char* FontChoice[]={
|
||||
"Times New Roman",
|
||||
"Arial",
|
||||
"Symbol",
|
||||
"StockFont"
|
||||
};
|
||||
|
||||
typedef enum {
|
||||
Roman, Swiss, Symbol, StockFont
|
||||
}TChoice;
|
||||
|
||||
static TChoice Choice;
|
||||
|
||||
/* ------------------------------------------------------------------------------------------------------------------ */
|
||||
/* */
|
||||
|
||||
static HFONT GetFont(int Escapement, char* Name) {
|
||||
memset(&LogFont, 0, sizeof(LOGFONT));
|
||||
LogFont.lfHeight = 37;
|
||||
LogFont.lfWeight = 400;
|
||||
LogFont.lfEscapement = Escapement;
|
||||
LogFont.lfItalic = 1;
|
||||
LogFont.lfUnderline = 1;
|
||||
LogFont.lfOutPrecision = OUT_STROKE_PRECIS;
|
||||
LogFont.lfClipPrecision = CLIP_STROKE_PRECIS;
|
||||
LogFont.lfQuality = DEFAULT_QUALITY;
|
||||
strcpy(LogFont.lfFaceName, Name);
|
||||
if (TheFont) {
|
||||
DeleteFont(TheFont);
|
||||
}
|
||||
TheFont = CreateFontIndirect(&LogFont);
|
||||
return TheFont;
|
||||
}
|
||||
|
||||
static char* GetType(char* s) {
|
||||
strcpy(s, "Font Type:");
|
||||
if ((TextMets.tmPitchAndFamily & TMPF_FIXED_PITCH)==0) {
|
||||
strcat(s, "Default<>");
|
||||
}
|
||||
if ((TextMets.tmPitchAndFamily & TMPF_FIXED_PITCH)==TMPF_FIXED_PITCH) {
|
||||
strcat(s, "Fixed<>");
|
||||
}
|
||||
if ((TextMets.tmPitchAndFamily & TMPF_VECTOR)==TMPF_VECTOR) {
|
||||
strcat(s, "Vector<>");
|
||||
}
|
||||
if ((TextMets.tmPitchAndFamily & TMPF_TRUETYPE)==TMPF_TRUETYPE) {
|
||||
strcat(s, "TrueType<>");
|
||||
}
|
||||
if ((TextMets.tmPitchAndFamily & TMPF_DEVICE)==TMPF_DEVICE) {
|
||||
strcat(s, "Device<>");
|
||||
}
|
||||
if (strlen(s) > 99) {
|
||||
s[strlen(s) - 3 ] = '\0';
|
||||
}
|
||||
return s;
|
||||
}
|
||||
|
||||
static char* GetFamily(char* s) {
|
||||
int R = TextMets.tmPitchAndFamily & 0xF0;
|
||||
strcpy(s, "Family:");
|
||||
if (R==FF_DONTCARE) strcat(s, "Don't Care or don't know");
|
||||
if (R==FF_ROMAN) strcat(s, "Roman");
|
||||
if (R==FF_SWISS) strcat(s, "Swiss");
|
||||
if (R==FF_MODERN) strcat(s, "Modern");
|
||||
if (R==FF_SCRIPT) strcat(s, "Script");
|
||||
if (R==FF_DECORATIVE) strcat(s, "Decorative");
|
||||
return s;
|
||||
}
|
||||
|
||||
static char* GetCharSet(char* s) {
|
||||
strcpy(s, "Char Set:");
|
||||
if (TextMets.tmCharSet==ANSI_CHARSET) {
|
||||
strcat(s, "Ansi");
|
||||
}
|
||||
if (TextMets.tmCharSet==DEFAULT_CHARSET) {
|
||||
strcat(s, "Default");
|
||||
}
|
||||
if (TextMets.tmCharSet==SYMBOL_CHARSET) {
|
||||
strcat(s, "Symbol");
|
||||
}
|
||||
if (TextMets.tmCharSet==OEM_CHARSET) {
|
||||
strcat(s, "OEM");
|
||||
}
|
||||
return s;
|
||||
}
|
||||
|
||||
static char* GetFontString(char* s, TEXTMETRIC TextMetric, char* FaceName) {
|
||||
char szType[99];
|
||||
char szFamily[99];
|
||||
char szCharSet[99];
|
||||
TextMets = TextMetric;
|
||||
GetType(szType);
|
||||
GetFamily(szFamily);
|
||||
GetCharSet(szCharSet);
|
||||
sprintf(s, "Font:%s\n"
|
||||
"Height: %d\n"
|
||||
"Ascent: %d\n"
|
||||
"Descent: %d\n"
|
||||
"AveCharW: %d\n"
|
||||
"MaxCharW: %d\n"
|
||||
"Weight: %d\n"
|
||||
"Italic: %hd\n"
|
||||
"Underlined: %d\n"
|
||||
"%s\n"
|
||||
"%s\n"
|
||||
"%s", FaceName,
|
||||
TextMets.tmHeight,
|
||||
TextMets.tmAscent,
|
||||
TextMets.tmDescent,
|
||||
TextMets.tmAveCharWidth,
|
||||
TextMets.tmMaxCharWidth,
|
||||
TextMets.tmWeight,
|
||||
TextMets.tmItalic,
|
||||
TextMets.tmUnderlined,
|
||||
szType,
|
||||
szFamily,
|
||||
szCharSet
|
||||
);
|
||||
return s;
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------------------------------------------------------ */
|
||||
/* */
|
||||
|
||||
c_WinGUI_EventHandlerDef(WM_DESTROY, Main_Destroy) {
|
||||
if (TheFont) {
|
||||
DeleteFont(TheFont);
|
||||
}
|
||||
PostQuitMessage(0);
|
||||
}
|
||||
|
||||
c_WinGUI_EventHandlerDef(WM_CREATE, Main_Create) {
|
||||
GetFont(0, "New Times Roman");
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
c_WinGUI_EventHandlerDef(WM_COMMAND, Main_Command) {
|
||||
char s[500];
|
||||
switch (id) {
|
||||
case CM_INFO: {
|
||||
GetFontString(s, TextMets, aFaceName);
|
||||
MessageBox(hwnd, s, "Font Info", MB_OK);
|
||||
break;
|
||||
}
|
||||
case CM_ROMAN: {
|
||||
Choice = Roman;
|
||||
InvalidateRect(hwnd, NULL, TRUE);
|
||||
break;
|
||||
}
|
||||
case CM_SWISS: {
|
||||
Choice = Swiss;
|
||||
InvalidateRect(hwnd, NULL, TRUE);
|
||||
break;
|
||||
}
|
||||
case CM_SYMBOL: {
|
||||
Choice = Symbol;
|
||||
InvalidateRect(hwnd, NULL, TRUE);
|
||||
break;
|
||||
}
|
||||
case CM_ANSI_FIXED_FONT: {
|
||||
if (TheFont) DeleteFont(TheFont);
|
||||
TheFont = GetStockFont(ANSI_FIXED_FONT);
|
||||
Choice = StockFont;
|
||||
InvalidateRect(hwnd, NULL, TRUE);
|
||||
break;
|
||||
}
|
||||
case CM_ANSI_VAR_FONT: {
|
||||
if (TheFont) DeleteFont(TheFont);
|
||||
TheFont = GetStockFont(ANSI_VAR_FONT);
|
||||
Choice = StockFont;
|
||||
InvalidateRect(hwnd, NULL, TRUE);
|
||||
break;
|
||||
}
|
||||
case CM_DEVICE_DEFAULT_FONT: {
|
||||
if (TheFont) DeleteFont(TheFont);
|
||||
TheFont = GetStockFont(DEVICE_DEFAULT_FONT);
|
||||
Choice = StockFont;
|
||||
InvalidateRect(hwnd, NULL, TRUE);
|
||||
break;
|
||||
}
|
||||
case CM_OEM_FIXED_FONT: {
|
||||
if (TheFont) DeleteFont(TheFont);
|
||||
TheFont = GetStockFont(OEM_FIXED_FONT);
|
||||
Choice = StockFont;
|
||||
InvalidateRect(hwnd, NULL, TRUE);
|
||||
break;
|
||||
}
|
||||
case CM_SYSTEM_FONT: {
|
||||
if (TheFont) DeleteFont(TheFont);
|
||||
TheFont = GetStockFont(SYSTEM_FONT);
|
||||
Choice = StockFont;
|
||||
InvalidateRect(hwnd, NULL, TRUE);
|
||||
break;
|
||||
}
|
||||
case CM_SYSTEM_FIXED_FONT: {
|
||||
if (TheFont) DeleteFont(TheFont);
|
||||
TheFont = GetStockFont(SYSTEM_FIXED_FONT);
|
||||
Choice = StockFont;
|
||||
InvalidateRect(hwnd, NULL, TRUE);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
c_WinGUI_EventHandlerDef(WM_PAINT, Main_Paint) {
|
||||
PAINTSTRUCT PaintStruct;
|
||||
HFONT OldFont;
|
||||
HDC PaintDC = BeginPaint(hwnd, &PaintStruct);
|
||||
if (Choice==StockFont) {
|
||||
OldFont = SelectFont(PaintDC, TheFont);
|
||||
GetTextFace(PaintDC, sizeof(aFaceName), aFaceName);
|
||||
GetTextMetrics(PaintDC, &TextMets);
|
||||
SetTextColor(PaintDC, RGB(rand() % 255, rand()%255, rand()%255));
|
||||
TextOut(PaintDC, 10, 10, aFaceName, strlen(aFaceName));
|
||||
TextOut(PaintDC, 10, 30, "Stock Fonts", 11);
|
||||
TextOut(PaintDC, 10, 50, "Ten Letters", 11);
|
||||
SelectFont(PaintDC, OldFont);
|
||||
}else {
|
||||
for (int i=0; i<=3; i++) {
|
||||
TheFont = GetFont(900 * i, FontChoice[Choice]);
|
||||
OldFont = SelectFont(PaintDC, TheFont);
|
||||
SetTextColor(PaintDC, RGB(rand() % 255, rand()%255, rand()%255));
|
||||
TextOut(PaintDC, 200, 200, "Ahoy!", 5);
|
||||
GetTextFace(PaintDC, sizeof(aFaceName), aFaceName);
|
||||
GetTextMetrics(PaintDC, &TextMets);
|
||||
SelectFont(PaintDC, OldFont);
|
||||
}
|
||||
TextOut(PaintDC, 10, 10, aFaceName, strlen(aFaceName));
|
||||
}
|
||||
EndPaint(hwnd, &PaintStruct);
|
||||
}
|
||||
|
||||
c_WinGUI_EventMapBegin(WndProc)
|
||||
c_WinGUI_EventMap(WM_CREATE, Main_Create);
|
||||
c_WinGUI_EventMap(WM_DESTROY, Main_Destroy);
|
||||
c_WinGUI_EventMap(WM_COMMAND, Main_Command);
|
||||
c_WinGUI_EventMap(WM_PAINT, Main_Paint);
|
||||
c_WinGUI_EventMapEnd()
|
||||
|
||||
|
||||
static
|
||||
BOOL Register(HINSTANCE hInstance) {
|
||||
WNDCLASS WndClass;
|
||||
WndClass.style = CS_HREDRAW | CS_VREDRAW;
|
||||
WndClass.lpfnWndProc = WndProc;
|
||||
WndClass.cbClsExtra = 0;
|
||||
WndClass.cbWndExtra = 0;
|
||||
WndClass.hInstance = hInstance;
|
||||
WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
|
||||
WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
|
||||
WndClass.hbrBackground = GetStockBrush(WHITE_BRUSH);
|
||||
WndClass.lpszMenuName = "Menu";
|
||||
WndClass.lpszClassName = WINDOW_CLASS_NAME;
|
||||
return RegisterClass(&WndClass);
|
||||
}
|
||||
|
||||
static
|
||||
HWND Create(HINSTANCE hInstance, int nCmdShow) {
|
||||
HWND hwnd = CreateWindow(WINDOW_CLASS_NAME, WINDOW_CLASS_NAME,
|
||||
WS_OVERLAPPEDWINDOW,
|
||||
CW_USEDEFAULT, CW_USEDEFAULT,
|
||||
CW_USEDEFAULT, CW_USEDEFAULT,
|
||||
NULL, NULL, hInstance, NULL
|
||||
);
|
||||
|
||||
if (hwnd == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ShowWindow(hwnd, nCmdShow);
|
||||
UpdateWindow(hwnd);
|
||||
return hwnd;
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------------------------------------------------------ */
|
||||
/* */
|
||||
|
||||
c_WinGUI_Main(){
|
||||
MSG msg;
|
||||
|
||||
if (!hPrevInstance) {
|
||||
if (!Register(hInstance)) {
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
WinApp.hInstance = hInstance;
|
||||
|
||||
|
||||
HWND MainHwnd = Create(hInstance, nShowCmd);
|
||||
if (!MainHwnd) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
WinApp.hwnd = MainHwnd;
|
||||
|
||||
while (GetMessage(&msg, NULL, 0, 0)) {
|
||||
TranslateMessage(&msg);
|
||||
DispatchMessage(&msg);
|
||||
}
|
||||
|
||||
|
||||
return (int)msg.wParam;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user