File:  [WindowsNT SDKs] / mstools / samples / showuni / showuni.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Thu Aug 9 18:21:22 2018 UTC (7 years, 9 months ago) by root
Branches: msft, MAIN
CVS tags: ntsdk-oct-1992, HEAD
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);
}

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.