|
|
Microsoft Windows NT Build 328 10-12-1992
/****************************************************************************
PROGRAM: ShowUni.c
PURPOSE: Adds, deletes, creates and displays fonts
FUNCTIONS:
WinMain() - calls initialization function, processes message loop
EditfileInit() - initializes window data and registers window
EditfileWndProc() - processes messages
About() - processes messages for "About" dialog box
SelectFont() - select a font
****************************************************************************/
#include <windows.h>
#include <string.h>
#include "showuni.h"
#include <commdlg.h>
struct __range {
int low;
int high;
} range[] = {
{0x20, 0x7f}, //ASCII
{0xa0, 0xff}, //Latin
{0x100, 0x17f}, //European Latin
{0x180, 0x1f0}, //Extended Latin
{0x250, 0x2a8}, //Standard Phonetic
{0x2b0, 0x2e9}, //Modifier Letters
{0x300, 0x341}, //Generic Diacritical
{0x370, 0x3f5}, //Greek
{0x400, 0x486}, //Cyrillic
{0x490, 0x4cc}, //Extended Cyrillic
{0x5b0, 0x5f5}, //Hebrew
{0x20a0,0x20aa}, //Currency Symbols
{0x2100,0x2138}, //Letterlike Symbols
{0x2190,0x21ea}, //Arrows
{0x2200,0x22f1} }; //Math Operators
HANDLE hInst;
HFONT hFont;
TCHAR FontNameList[32][128]; /* list of added fonts */
INT nFontIndex = 0; /* position in FontList */
INT nLineSpace;
TEXTMETRIC TextMetric;
LOGFONT LogFont;
POINT ptCurrent = {0, 0};
TCHAR FontList[MAXFONT][32];
INT FontIndex = 0;
INT CurrentFont = 0;
DLGPROC lpDlg;
FONTENUMPROC lpEnumFunc;
TCHAR AppName[] = TEXT("ShowUnicode Sample Application");
TCHAR WindowTitle[80];
TCHAR OutBuffer[257];
int low=0x20, high=0x7f;
int CurrentButton=ID_ASCII;
/****************************************************************************
FUNCTION: WinMain(HANDLE, HANDLE, LPTSTR, int)
PURPOSE: calls initialization function, processes message loop
****************************************************************************/
int WINAPI WinMain(HANDLE hInstance, HANDLE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
HWND hWnd;
MSG msg;
if (!hPrevInstance)
if (!ShowUniInit(hInstance))
return (FALSE);
hInst = hInstance;
lstrcpy(WindowTitle, AppName);
lstrcat(WindowTitle, TEXT(" : Lucida Sans Unicode"));
hWnd = CreateWindow(TEXT("ShowUni"),
WindowTitle,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
if (!hWnd)
return (FALSE);
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
while (GetMessage(&msg, NULL, NULL, NULL)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (msg.wParam);
}
/****************************************************************************
FUNCTION: ShowUniInit(HANDLE)
PURPOSE: Initializes window data and registers window class
****************************************************************************/
INT ShowUniInit(HANDLE hInstance)
{
HANDLE hMemory;
PWNDCLASS pWndClass;
BOOL bSuccess;
hMemory = LocalAlloc(LPTR, sizeof(WNDCLASS));
if(!hMemory){
MessageBox(NULL, TEXT("<ShowUniInit> Not enough memory."), NULL, MB_OK | MB_ICONHAND);
return(FALSE);
}
pWndClass = (PWNDCLASS) LocalLock(hMemory);
pWndClass->hCursor = LoadCursor(NULL, IDC_ARROW);
pWndClass->hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDC_SHOWUNI));
pWndClass->lpszMenuName = MAKEINTRESOURCE(IDM_SHOWUNI);
pWndClass->lpszClassName = (LPTSTR) TEXT("ShowUni");
pWndClass->hbrBackground = GetStockObject(WHITE_BRUSH);
pWndClass->hInstance = hInstance;
pWndClass->style = NULL;
pWndClass->lpfnWndProc = ShowUniWndProc;
bSuccess = RegisterClass((LPWNDCLASS) pWndClass);
LocalUnlock(hMemory);
LocalFree(hMemory);
return (bSuccess);
}
/****************************************************************************
FUNCTION: ShowCharacters(HDC, INT, INT)
PURPOSE: display character set using current font
****************************************************************************/
VOID ShowCharacters(
HDC hDC,
int low,
int high
)
{
HFONT hOldFont;
TEXTMETRIC TextMetric;
UINT X;
UINT Y;
int i;
LPTSTR p;
GetTextMetrics(hDC, &TextMetric);
hFont = CreateFont( TextMetric.tmHeight, TextMetric.tmAveCharWidth, 0, 0,
FW_NORMAL, FALSE, FALSE, FALSE,
UNICODE_CHARSET,
OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY, DEFAULT_PITCH,
FontList[CurrentFont]);
for (i=low ; i<=high ; i++) {
OutBuffer[i-low] = (TCHAR)i;
}
if (!(hOldFont = SelectObject(hDC, hFont)))
return;
GetTextMetrics(hDC, &TextMetric);
nLineSpace = TextMetric.tmHeight + TextMetric.tmExternalLeading + 1;
X = ptCurrent.x;
Y = ptCurrent.y;
for (p=OutBuffer,i=high-low+1 ; i>64 ; i-=64,p+=64,Y+=nLineSpace) {
TextOut(hDC, X, Y, p, 64);
}
TextOut(hDC, X, Y, p, i);
SelectObject(hDC, hOldFont);
}
/****************************************************************************
FUNCTION: EnumFunc(LPLOGFONT, LPTEXTMETRIC, DWORD, LPARAM)
PURPOSE: Finds unicode fonts
****************************************************************************/
INT APIENTRY EnumFunc(
LPLOGFONT lpLogFont,
LPTEXTMETRIC lpTextMetric,
DWORD FontType,
LPARAM lpData)
{
if ((int)lpData == 0) {
if (lpLogFont->lfCharSet != UNICODE_CHARSET)
return 1;
lstrcpy((LPTSTR)FontList[FontIndex],
(LPTSTR)(lpLogFont->lfFaceName));
return (++FontIndex);
}
else
return 0;
}
/****************************************************************************
FUNCTION: GetFonts(HWND)
PURPOSE: Get available fonts
****************************************************************************/
VOID GetFonts(HWND hWnd)
{
#if 0
HDC hDC;
FontIndex = 0;
hDC = GetDC(hWnd);
lpEnumFunc = (FONTENUMPROC)MakeProcInstance((FARPROC)EnumFunc, hInst);
EnumFonts(hDC, (LPTSTR)NULL, lpEnumFunc, (LPARAM)NULL);
FreeProcInstance((FARPROC)lpEnumFunc);
ReleaseDC(hWnd, hDC);
#else
FontIndex = 1;
lstrcpy(FontList[0], TEXT("Lucida Sans Unicode"));
#endif
}
/****************************************************************************
FUNCTION: SelectFont(HWND, unsigned, WORD, LONG)
PURPOSE: Initializes window data and registers window class
****************************************************************************/
BOOL APIENTRY SelectFont(
HWND hDlg,
UINT message,
WPARAM wParam,
LONG lParam)
{
INT i;
INT index;
switch (message) {
case WM_INITDIALOG:
for (i=0; i<FontIndex; i++) { /* displays available fonts */
SendDlgItemMessage(hDlg, ID_TYPEFACE, LB_ADDSTRING,
NULL, (LONG) (LPTSTR) FontList[i]);
SendDlgItemMessage(hDlg, ID_TYPEFACE, LB_SETCURSEL,
0, 0L);
}
return (TRUE);
break;
case WM_COMMAND:
switch (LOWORD(wParam)) {
case IDOK:
okay:
index=SendDlgItemMessage(hDlg, ID_TYPEFACE,
LB_GETCURSEL, 0, 0L);
if (index == LB_ERR) {
MessageBox(hDlg, TEXT("No font selected"),
TEXT("Select Font"), MB_OK | MB_ICONEXCLAMATION);
break;
}
CurrentFont = index;
EndDialog(hDlg, 1);
break;
case IDCANCEL:
EndDialog(hDlg, 0);
break;
case ID_TYPEFACE:
switch (HIWORD(wParam)) {
case LBN_SELCHANGE:
index = SendDlgItemMessage(hDlg, ID_TYPEFACE,
LB_GETCURSEL, 0, 0L);
if (index == LB_ERR)
break;
break;
case LBN_DBLCLK:
goto okay;
break;
}
break;
default:
break;
}
break;
default:
break;
}
return (FALSE);
}
/****************************************************************************
FUNCTION: Range(HWND, unsigned, WORD, LONG)
PURPOSE: Selects a range of characters to display
****************************************************************************/
BOOL APIENTRY Range(
HWND hDlg,
UINT message,
WPARAM wParam,
LONG lParam)
{
BOOL f;
int i;
static int CurrentButtonTmp;
switch (message) {
case WM_INITDIALOG:
f = SetDlgItemInt(hDlg, ID_LOW, low, FALSE);
f = SetDlgItemInt(hDlg, ID_HIGH, high, FALSE);
CheckRadioButton(hDlg, ID_ASCII, ID_MATH, CurrentButton);
CurrentButtonTmp = CurrentButton;
return (TRUE);
break;
case WM_COMMAND:
switch (LOWORD(wParam)) {
case IDOK:
low = GetDlgItemInt(hDlg, ID_LOW, &f, FALSE);
high = GetDlgItemInt(hDlg, ID_HIGH, &f, FALSE);
if (high-low > 256) {
MessageBox(NULL, TEXT("Range too large - 256 max"),
NULL, MB_OK | MB_ICONHAND);
}
else {
CurrentButton = CurrentButtonTmp;
EndDialog(hDlg, TRUE);
}
break;
case IDCANCEL:
EndDialog(hDlg, FALSE);
break;
case ID_ASCII:
case ID_LATIN:
case ID_LATIN_E:
case ID_LATIN_X:
case ID_MODIFIER:
case ID_DIACRITICAL:
case ID_PHONETIC:
case ID_GREEK:
case ID_CYRILLIC:
case ID_CYRILLIC_X:
case ID_HEBREW:
case ID_CURRENCY:
case ID_LETTERS:
case ID_ARROWS:
case ID_MATH:
for (i=ID_ASCII ; i<=ID_MATH ; i++) {
if (IsDlgButtonChecked(hDlg, i)) {
f = SetDlgItemInt(hDlg, ID_LOW,
range[i-ID_ASCII].low, FALSE);
f = SetDlgItemInt(hDlg, ID_HIGH,
range[i-ID_ASCII].high, FALSE);
CurrentButtonTmp = i;
break;
}
}
break;
default:
break;
}
break;
default:
break;
}
return (FALSE);
}
/****************************************************************************
FUNCTION: ShowUniWndProc(HWND, unsigned, WORD, LONG)
PURPOSE: Processes messages
****************************************************************************/
LONG APIENTRY ShowUniWndProc(
HWND hWnd,
UINT message,
WPARAM wParam,
LONG lParam)
{
HDC hDC;
PAINTSTRUCT ps;
switch(message) {
case WM_CREATE:
GetFonts(hWnd);
break;
case WM_PAINT:
hDC = BeginPaint(hWnd, &ps);
ShowCharacters(hDC, low, high);
EndPaint(hWnd, &ps);
break;
case WM_COMMAND:
switch (LOWORD(wParam)) {
/* File Menu */
case IDM_EXIT:
DestroyWindow(hWnd);
break;
case IDM_ABOUT:
lpDlg = MakeProcInstance((DLGPROC)About, hInst);
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUT), hWnd, lpDlg);
FreeProcInstance(lpDlg);
break;
/* Show menu */
case IDM_CLEAR:
InvalidateRect(hWnd, (LPRECT)NULL, TRUE);
break;
case IDM_SHOWCHARS:
InvalidateRect(hWnd, (LPRECT)NULL, TRUE);
break;
case IDM_SHOWRANGE:
lpDlg = MakeProcInstance((DLGPROC)Range, hInst);
if (DialogBox(hInst, MAKEINTRESOURCE(IDD_RANGE), hWnd, lpDlg)) {
}
FreeProcInstance(lpDlg);
break;
/* Font menu */
case IDM_SELECTFONT:
lpDlg = MakeProcInstance((DLGPROC)SelectFont, hInst);
if (DialogBox(hInst, MAKEINTRESOURCE(IDD_SELECT), hWnd, lpDlg)) {
hFont = CreateFont( 10, 10, 0, 0,
FW_NORMAL, FALSE, FALSE, FALSE,
UNICODE_CHARSET,
OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY, DEFAULT_PITCH,
FontList[CurrentFont]);
SetFaceName(hWnd);
}
FreeProcInstance(lpDlg);
break;
}
break;
case WM_LBUTTONUP:
ptCurrent.x = LOWORD(lParam);
ptCurrent.y = HIWORD(lParam);
hDC = GetDC(hWnd);
ShowCharacters(hDC, low, high);
ReleaseDC(hWnd, hDC);
break;
case WM_FONTCHANGE:
GetFonts(hWnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return (DefWindowProc(hWnd, message, wParam, lParam));
}
return (0L);
}
/****************************************************************************
FUNCTION: SetFaceName(HWND)
PURPOSE: Retrieves current font's face name, places it in WindowTitle
****************************************************************************/
VOID SetFaceName(HWND hWnd)
{
TCHAR buf[80];
HDC hDC;
hDC = GetDC(hWnd);
SelectObject(hDC, hFont);
lstrcpy(WindowTitle, AppName);
lstrcat(WindowTitle, TEXT(" : "));
GetTextFace(hDC, 80, buf);
lstrcat(WindowTitle, buf);
SetWindowText(hWnd, (LPTSTR) WindowTitle);
ReleaseDC(hWnd, hDC);
}
/****************************************************************************
FUNCTION: About(HWND, unsigned, WORD, LONG)
PURPOSE: Processes messages for "About" dialog box
MESSAGES:
WM_INITDIALOG - initialize dialog box
WM_COMMAND - Input received
****************************************************************************/
BOOL APIENTRY About(
HWND hDlg,
UINT message,
WPARAM wParam,
LONG lParam)
{
switch (message) {
case WM_INITDIALOG:
return (TRUE);
case WM_COMMAND:
if (LOWORD(wParam) == IDOK) {
EndDialog(hDlg, TRUE);
return (TRUE);
}
return (TRUE);
}
return (FALSE);
UNREFERENCED_PARAMETER(lParam);
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.