This repository has been archived on 2024-12-16. You can view files and clone it, but cannot push or open issues or pull requests.
CodeBlocksPortable/WATCOM/samples/win/edit/efont.c

240 lines
6.6 KiB
C
Raw Permalink Normal View History

#include <windows.h>
#include <stdio.h>
#include <string.h>
#include "edit.h"
#include "win1632.h"
#define FONT_DATA 1L
#define FONT_SIZES 2L
static LPFINFO FontHead,FontTail;
static LPFINFO CurrFont;
static HFONT CFont;
/*
* MakeFont - make the current font
*/
static void MakeFont( HWND hwnd, int index, int size )
{
LPFINFO tmp;
if( CFont != NULL ) DeleteObject( CFont );
tmp = FontHead;
while( tmp->index != index ) tmp = tmp->next;
CFont = CreateFont(
tmp->sizes[ size ],
0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE,
tmp->charset,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,
tmp->pitch_family,
tmp->name );
if( hwnd != NULL ) {
SendDlgItemMessage( hwnd, FONT_SAMPLE, WM_SETFONT, (UINT)CFont, TRUE );
}
} /* MakeFont */
/*
* GetFont - get a new font
*/
BOOL _EXPORT FAR PASCAL GetFont( HWND hwnd, unsigned msg, UINT wparam,
LONG lparam )
{
int i;
int sel,sel2;
char str[128];
LPFINFO tmp;
WORD cmd;
lparam = lparam; //shut up the compiler for the Win32 version
switch( msg ) {
case WM_INITDIALOG:
tmp = FontHead;
while( tmp != NULL ) {
SendDlgItemMessage( hwnd, FONT_NAME, LB_ADDSTRING, 0,
(LONG) (LPSTR) tmp->name );
SendDlgItemMessage( hwnd, FONT_NAME, LB_SETCURSEL, 0, 0L );
tmp = tmp->next;
}
for( i=0; i < FontHead->size_count; i++ ) {
sprintf( str, "%d", FontHead->sizes[i]);
SendDlgItemMessage( hwnd, FONT_SIZE, LB_ADDSTRING,
0, (LONG) (LPSTR) str );
SendDlgItemMessage( hwnd, FONT_SIZE, LB_SETCURSEL, 0, 0L);
}
return( TRUE );
break;
case WM_COMMAND:
cmd = LOWORD( wparam );
if( ( cmd == FONT_NAME || cmd == FONT_SIZE ) &&
GET_WM_COMMAND_CMD( wparam, lparam ) == LBN_DBLCLK ) {
}
switch( cmd ) {
case IDOK:
sel = SendDlgItemMessage( hwnd, FONT_NAME, LB_GETCURSEL, 0, 0L );
sel2 = SendDlgItemMessage( hwnd, FONT_SIZE, LB_GETCURSEL, 0, 0L );
if( sel == LB_ERR || sel2 == LB_ERR ) {
EndDialog( hwnd, 0 );
} else {
MakeFont( NULL, sel, sel2 );
EndDialog( hwnd, 1 );
}
break;
case IDCANCEL:
EndDialog( hwnd, 0 );
break;
case FONT_SIZE:
if( GET_WM_COMMAND_CMD( wparam, lparam ) == LBN_SELCHANGE ) {
sel = SendDlgItemMessage( hwnd, FONT_NAME, LB_GETCURSEL, 0, 0L );
if( sel == LB_ERR) break;
sel2 = SendDlgItemMessage( hwnd, FONT_SIZE, LB_GETCURSEL, 0, 0L );
if( sel2 == LB_ERR ) break;
MakeFont( hwnd, sel, sel2 );
}
break;
case FONT_NAME:
if( GET_WM_COMMAND_CMD( wparam, lparam ) == LBN_SELCHANGE ) {
sel = SendDlgItemMessage( hwnd, FONT_NAME, LB_GETCURSEL, 0, 0L );
if( sel == LB_ERR ) break;
tmp = FontHead;
while( tmp->index != sel ) tmp = tmp->next;
SendDlgItemMessage( hwnd, FONT_SIZE, LB_RESETCONTENT, 0, 0L );
for( i=0; i< tmp->size_count; i++ ) {
sprintf( str, "%d", tmp->sizes[i] );
SendDlgItemMessage( hwnd, FONT_SIZE, LB_ADDSTRING,
0, (LONG) (LPSTR) str );
SendDlgItemMessage( hwnd, FONT_SIZE, LB_SETCURSEL, 0, 0L );
}
MakeFont( hwnd, sel, 0 );
}
break;
}
}
return (FALSE);
} /* GetFont */
/*
* FontSelect - select a new font
*/
void FontSelect( LPEDATA ed )
{
FARPROC fp;
if( CFont != NULL ) DeleteObject( CFont );
CFont = NULL;
fp = MakeProcInstance( (FARPROC)GetFont, ed->inst );
if( DialogBox( ed->inst, "GetFont", ed->hwnd, (DLGPROC)fp ) ) {
if( ed->font != NULL ) DeleteObject( ed->font );
ed->font = CFont;
SendMessage( ed->editwnd, WM_SETFONT, (UINT)ed->font, TRUE );
}
FreeProcInstance( fp );
} /* FontSelect */
/*
* EnumFontsProc - get all fonts
*/
int _EXPORT FAR PASCAL EnumFontsProc( LPLOGFONT logfont,
LPTEXTMETRIC textmetric, UINT fonttype, LPSTR data )
{
LOGFONT far *farfont;
LPFINFO curr;
short _FAR *newsize;
fonttype = fonttype; /* shut compiler up */
textmetric = textmetric;
switch( (WORD) data ) {
case FONT_DATA:
curr = MemAlloc( sizeof( font_info ) );
if( curr == NULL ) return( FALSE );
farfont = MK_FP32( logfont );
curr->charset = farfont->lfCharSet;
curr->pitch_family = farfont->lfPitchAndFamily;
#ifdef __NT__
strcpy( curr->name, farfont->lfFaceName );
#else
_fstrcpy( curr->name, farfont->lfFaceName );
#endif
if( FontTail == NULL ) {
FontHead = FontTail = curr;
curr->index = 0;
} else {
FontTail->next = curr;
curr->index = FontTail->index + 1;
FontTail = curr;
}
return( curr->index + 1 );
case FONT_SIZES:
newsize = MemRealloc( CurrFont->sizes,
sizeof( short ) * (CurrFont->size_count+1 ) );
if( newsize == NULL ) return( 0 );
CurrFont->sizes = newsize;
farfont = MK_FP32( logfont );
CurrFont->sizes[ CurrFont->size_count ] = farfont->lfHeight;
CurrFont->size_count++;
return( CurrFont->size_count );
default:
return( 0 );
break;
}
} /* EnumFontsProc */
/*
* GetAllFonts - get all fonts available
*/
void GetAllFonts( LPEDATA ed )
{
HDC hdc;
FARPROC fp;
LPFINFO tmp,next;
/*
* erase old list
*/
tmp = FontHead;
while( tmp != NULL ) {
next = tmp->next;
MemFree( tmp );
tmp = next;
}
fp = MakeProcInstance( (FARPROC)EnumFontsProc, ed->inst );
hdc = GetDC( ed->hwnd );
EnumFontFamilies( hdc, (LPSTR) 0, (FONTENUMPROC)fp,
(LPARAM) FONT_DATA );
/*
* get all sizes
*/
CurrFont = FontHead;
while( CurrFont != NULL ) {
CurrFont->size_count = 0;
EnumFontFamilies( hdc, CurrFont->name, (FONTENUMPROC)fp,
(LPARAM) FONT_SIZES );
CurrFont = CurrFont->next;
}
ReleaseDC( ed->hwnd, hdc );
FreeProcInstance( fp );
} /* GetAllFonts */