//----------------------------------------------------------------------------- // Name: FontMaker.cpp // // Desc: Defines the class behaviors for the application. // // Hist: 09.06.02 - Revised Fontmaker sample // // Copyright (c) Microsoft Corporation. All rights reserved. //----------------------------------------------------------------------------- #include "stdafx.h" #include "FontMaker.h" #include "Glyphs.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif CTextureFont g_Font; extern BOOL g_bIsGlyphSelected; extern int g_iSelectedGlyphNum; extern GLYPH_ATTR* g_pSelectedGylph; extern WCHAR g_cSelectedGlyph; //----------------------------------------------------------------------------- // CFontMakerApp //----------------------------------------------------------------------------- BEGIN_MESSAGE_MAP(CFontMakerApp, CWinApp) //{{AFX_MSG_MAP(CFontMakerApp) ON_COMMAND(IDM_FILE_NEWFONT, OnNewFontButton) ON_BN_CLICKED(IDC_EFFECTSOUTLINED_CHECK, OnEffectsCheck) ON_BN_CLICKED(IDC_EFFECTSSHADOWED_CHECK, OnEffectsCheck) ON_BN_CLICKED(IDC_EFFECTSBLURRED_CHECK, OnEffectsCheck) ON_BN_CLICKED(IDC_EFFECTSSCANLINES_CHECK, OnEffectsCheck) ON_BN_CLICKED(IDC_EFFECTSANTIALIAS_CHECK, OnEffectsCheck) ON_BN_CLICKED(IDC_GLYPHSFROMRANGE_RADIO, OnGlyphsFromRangeRadio) ON_EN_CHANGE(IDC_GLYPHSRANGEFROM_EDIT, OnChangeGlpyhsRangeEdit) ON_BN_CLICKED(IDC_GLYPHSFROMFILE_RADIO, OnGlyphsFromFileRadio) ON_EN_KILLFOCUS(IDC_GLYPHSFILE_EDIT, OnChangeGlyphsFileEdit) ON_BN_CLICKED(IDC_GLYPHSFILESELECTOR_BUTTON, OnGlyphsFileSelectorButton) ON_BN_CLICKED(IDC_GLYPHSCUSTOM_RADIO, OnGlyphsCustom) ON_BN_CLICKED(IDC_TEXTURESIZE_BUTTON, OnTextureSizeButton) ON_BN_CLICKED(IDC_MAGNIFY_BUTTON, OnMagnifyButton) ON_BN_CLICKED(IDC_GLYPH_SPECIAL, OnGlyphSpecial) ON_UPDATE_COMMAND_UI(IDC_MAGNIFY_BUTTON, OnUpdateButton) ON_COMMAND(IDM_FILE_LOADFONTFILE, OnLoadButton) ON_COMMAND(IDM_FILE_SAVEFONTFILES, OnSaveButton) ON_COMMAND(IDM_FILE_LOADFONTLAYOUT, OnLoadCustomFontButton) ON_COMMAND(IDM_FILE_EXIT, OnExit) ON_COMMAND(ID_APP_ABOUT, OnAbout) ON_COMMAND(ID_HELP, OnHelp) ON_EN_CHANGE(IDC_GLYPHSRANGETO_EDIT, OnChangeGlpyhsRangeEdit) ON_UPDATE_COMMAND_UI(IDC_TEXTURESIZE_BUTTON, OnUpdateButton) ON_UPDATE_COMMAND_UI(IDC_GLYPHSFILESELECTOR_BUTTON, OnUpdateButton) ON_UPDATE_COMMAND_UI(IDM_FILE_NEWFONT, OnUpdateButton) ON_UPDATE_COMMAND_UI(IDM_FILE_LOADFONTFILE, OnUpdateButton) ON_UPDATE_COMMAND_UI(IDM_FILE_LOADFONTLAYOUT, OnUpdateButton) ON_UPDATE_COMMAND_UI(IDM_FILE_SAVEFONTFILES, OnUpdateButton) ON_UPDATE_COMMAND_UI(IDM_FILE_EXIT, OnUpdateButton) ON_UPDATE_COMMAND_UI(ID_APP_ABOUT, OnUpdateButton) ON_UPDATE_COMMAND_UI(ID_HELP, OnUpdateButton) //}}AFX_MSG_MAP END_MESSAGE_MAP() //----------------------------------------------------------------------------- // The one and only CFontMakerApp object //----------------------------------------------------------------------------- CFontMakerApp theApp; //----------------------------------------------------------------------------- // Name: InitInstance() // Desc: App initialization //----------------------------------------------------------------------------- BOOL CFontMakerApp::InitInstance() { // Create the main frame window for the app CFontMakerFrameWnd* pFrameWnd = new CFontMakerFrameWnd; m_pMainWnd = pFrameWnd; // Associate the view with the frame CCreateContext context; context.m_pCurrentFrame = NULL; context.m_pCurrentDoc = NULL; context.m_pNewViewClass = RUNTIME_CLASS(CFontMakerView); context.m_pNewDocTemplate = NULL; // Create the frame and load resources (menu, accelerator, etc.) pFrameWnd->LoadFrame( IDR_MAINFRAME, WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE, NULL, &context ); // Call OnInitialUpdate() to be called for the view pFrameWnd->InitialUpdateFrame( NULL, TRUE ); // The one and only window has been initialized, so show and update it. m_pMainWnd->ShowWindow( SW_SHOW ); m_pMainWnd->UpdateWindow(); // Load the hourglass cursor m_hWaitCursor = LoadCursor( IDC_WAIT ); // Get access the the dialog controls and the view m_pDialogBar = pFrameWnd->GetDialogBar(); m_pView = (CFontMakerView*)pFrameWnd->GetActiveView(); // Initially, no font is selected m_pDialogBar->GetDlgItem( IDC_FONTNAME_STATIC )->SetWindowText( _T("") ); m_pDialogBar->GetDlgItem( IDC_FONTSTYLE_STATIC )->SetWindowText( _T("") ); m_pDialogBar->GetDlgItem( IDC_FONTSIZE_STATIC )->SetWindowText( _T("") ); return TRUE; } //----------------------------------------------------------------------------- // Name: OnUpdateButton() // Desc: This function is needed to override some internal mucking with button // states. Without it, button and menu enabling will make you crazy. //----------------------------------------------------------------------------- void CFontMakerApp::OnUpdateButton( CCmdUI* pCmdUI ) { BOOL bEnable; switch( pCmdUI->m_nID ) { // Controls which are active all the time case IDM_FILE_NEWFONT: case IDM_FILE_LOADFONTLAYOUT: case IDM_FILE_LOADFONTFILE: case IDM_FILE_EXIT: case ID_APP_ABOUT: case ID_HELP: bEnable = TRUE; break; case IDC_TEXTURESIZE_BUTTON: case IDM_FILE_SAVEFONTFILES: case IDC_MAGNIFY_BUTTON: bEnable = g_Font.m_hFont ? TRUE : FALSE; if ( !bEnable ) bEnable = g_Font.m_pCustomFilename ? TRUE : FALSE; break; // Controls which are active only when a font is available default: bEnable = g_Font.m_hFont ? TRUE : FALSE; break; } pCmdUI->Enable( bEnable ); } BOOL g_bFirstTime = TRUE; //----------------------------------------------------------------------------- // Name: OnNewFontButton() // Desc: Called when the user hits the "New Font" button, this loads the font // and enables all the other windows controls. //----------------------------------------------------------------------------- void CFontMakerApp::OnNewFontButton() { // Initialize the LOGFONT structure. It's static so it's state is remembered if ( g_Font.m_LogFont.lfHeight == 0 ) { // first time init strcpy( g_Font.m_LogFont.lfFaceName, "Arial" ); // Arial font for a default g_Font.m_LogFont.lfHeight = 16; // 16 height font for a default g_Font.m_LogFont.lfWeight = 400; // 400 = normal, 700 = bold, etc. g_Font.m_LogFont.lfItalic = 0; // 0 = normal, 255 = italic g_Font.m_LogFont.lfQuality = ANTIALIASED_QUALITY; } // convert to point size for dialog purposes HDC hDC = GetDC( m_pMainWnd->m_hWnd ); // Current point size unit=1/10 pts INT iPointSize = g_Font.m_LogFont.lfHeight * 10; g_Font.m_LogFont.lfHeight= -MulDiv( iPointSize, GetDeviceCaps( hDC, LOGPIXELSY ), 720 ); ReleaseDC( m_pMainWnd->m_hWnd, hDC ); // Create the CHOOSEFONT structure static CHOOSEFONT cf = {0}; cf.lStructSize = sizeof(CHOOSEFONT); cf.lpLogFont = &g_Font.m_LogFont; cf.Flags = CF_INITTOLOGFONTSTRUCT | CF_SCREENFONTS; cf.nFontType = SCREEN_FONTTYPE; if ( 0 == ChooseFont( &cf ) ) return; g_Font.m_pCustomFilename = NULL; // NOT using point sizes, but cell heights g_Font.m_LogFont.lfHeight = cf.iPointSize/10; // Reset the selected glpyh UpdateSelectedGlyph( FALSE ); if( FAILED( CalculateAndRenderGlyphs() ) ) { // Could not create new font MessageBox( m_pMainWnd->m_hWnd, "Could not create the requested font!", "Error", MB_ICONERROR|MB_OK ); return; } char tempName[256]; sprintf( tempName, "%s_%d", g_Font.m_LogFont.lfFaceName, cf.iPointSize/10 ); // remove any spaces in the font name for (unsigned int i=0,j=0; iGetDlgItem( IDC_FONT_GROUPBOX )->EnableWindow( TRUE ); m_pDialogBar->GetDlgItem( IDC_FONTNAME_LABEL )->EnableWindow( TRUE ); m_pDialogBar->GetDlgItem( IDC_FONTSTYLE_LABEL )->EnableWindow( TRUE ); m_pDialogBar->GetDlgItem( IDC_FONTSIZE_LABEL )->EnableWindow( TRUE ); m_pDialogBar->GetDlgItem( IDC_FONTNAME_STATIC )->EnableWindow( TRUE ); m_pDialogBar->GetDlgItem( IDC_FONTSTYLE_STATIC )->EnableWindow( TRUE ); m_pDialogBar->GetDlgItem( IDC_FONTSIZE_STATIC )->EnableWindow( TRUE ); m_pDialogBar->GetDlgItem( IDC_EFFECTSOUTLINED_CHECK )->EnableWindow( TRUE ); m_pDialogBar->GetDlgItem( IDC_EFFECTSSHADOWED_CHECK )->EnableWindow( TRUE ); m_pDialogBar->GetDlgItem( IDC_EFFECTSBLURRED_CHECK )->EnableWindow( TRUE ); m_pDialogBar->GetDlgItem( IDC_EFFECTSSCANLINES_CHECK )->EnableWindow( TRUE ); m_pDialogBar->GetDlgItem( IDC_EFFECTSANTIALIAS_CHECK )->EnableWindow( TRUE ); m_pDialogBar->GetDlgItem( IDC_BLUR_EDIT )->EnableWindow( TRUE ); m_pDialogBar->GetDlgItem( IDC_SCANLINES_EDIT )->EnableWindow( TRUE ); if ( g_Font.m_bAntialiasEffect ) { ((CButton*)m_pDialogBar->GetDlgItem( IDC_EFFECTSANTIALIAS_CHECK ))->SetCheck( TRUE ); } else { ((CButton*)m_pDialogBar->GetDlgItem( IDC_EFFECTSANTIALIAS_CHECK ))->SetCheck( FALSE ); } str.Format( "%d", g_Font.m_nBlur ); m_pDialogBar->GetDlgItem( IDC_BLUR_EDIT )->SetWindowText( str ); str.Format( "%d", g_Font.m_nScanlines ); m_pDialogBar->GetDlgItem( IDC_SCANLINES_EDIT )->SetWindowText( str ); str.Format( "%s", g_Font.m_LogFont.lfFaceName ); m_pDialogBar->GetDlgItem( IDC_FONTNAME_STATIC )->SetWindowText( str ); if( g_Font.m_LogFont.lfItalic ) str.Format( "Italic", g_Font.m_LogFont.lfWeight < 550 ? "" : "Bold " ); else str.Format( "%s", g_Font.m_LogFont.lfWeight < 550 ? "Regular" : "Bold" ); m_pDialogBar->GetDlgItem( IDC_FONTSTYLE_STATIC )->SetWindowText( str ); str.Format( "%ld", cf.iPointSize/10 ); m_pDialogBar->GetDlgItem( IDC_FONTSIZE_STATIC )->SetWindowText( str ); // Set texture properties m_pDialogBar->GetDlgItem( IDC_TEXTURE_GROUPBOX )->EnableWindow( TRUE ); m_pDialogBar->GetDlgItem( IDC_TEXTUREWIDTH_LABEL )->EnableWindow( TRUE ); m_pDialogBar->GetDlgItem( IDC_TEXTUREHEIGHT_LABEL )->EnableWindow( TRUE ); m_pDialogBar->GetDlgItem( IDC_TEXTUREWIDTH_STATIC )->EnableWindow( TRUE ); m_pDialogBar->GetDlgItem( IDC_TEXTUREHEIGHT_STATIC )->EnableWindow( TRUE ); m_pDialogBar->GetDlgItem( IDC_TEXTURESIZE_BUTTON )->EnableWindow( TRUE ); SetTextureSize( g_Font.m_dwTextureWidth, g_Font.m_dwTextureHeight ); // Set glyph range properties m_pDialogBar->GetDlgItem( IDC_GLYPHS_GROUPBOX )->EnableWindow( TRUE ); m_pDialogBar->GetDlgItem( IDC_GLYPHSFROMRANGE_RADIO )->EnableWindow( TRUE ); m_pDialogBar->GetDlgItem( IDC_GLYPHSFROMFILE_RADIO )->EnableWindow( TRUE ); m_pDialogBar->GetDlgItem( IDC_GLYPHSRANGEFROM_EDIT )->EnableWindow( TRUE ); m_pDialogBar->GetDlgItem( IDC_GLYPHSRANGETO_EDIT )->EnableWindow( TRUE ); m_pDialogBar->GetDlgItem( IDC_GLYPHSRANGEFROM_LABEL )->EnableWindow( TRUE ); m_pDialogBar->GetDlgItem( IDC_GLYPHSRANGETO_LABEL )->EnableWindow( TRUE ); m_pDialogBar->GetDlgItem( IDC_GLYPHSFILE_EDIT )->EnableWindow( FALSE ); m_pDialogBar->GetDlgItem( IDC_GLYPHSFILESELECTOR_BUTTON )->EnableWindow( FALSE ); m_pDialogBar->GetDlgItem( IDC_GLYPHSCUSTOM_RADIO )->EnableWindow( TRUE ); // Set a default range of glyphs to use ((CButton*)m_pDialogBar->GetDlgItem( IDC_GLYPHSFROMRANGE_RADIO ))->SetCheck( TRUE ); m_pDialogBar->GetDlgItem( IDC_GLYPHSRANGEFROM_EDIT )->SetWindowText( "32" ); m_pDialogBar->GetDlgItem( IDC_GLYPHSRANGETO_EDIT )->SetWindowText( "127" ); g_Font.ExtractValidGlyphsFromRange( 32, 127 ); m_pDialogBar->GetDlgItem( IDC_INSERTGLYPH_LABEL )->EnableWindow( TRUE ); m_pDialogBar->GetDlgItem( IDC_INSERTGLYPH_EDIT )->EnableWindow( TRUE ); } else { CString str; str.Format( "%s", g_Font.m_LogFont.lfFaceName ); m_pDialogBar->GetDlgItem( IDC_FONTNAME_STATIC )->SetWindowText( str ); if ( g_Font.m_LogFont.lfItalic ) str.Format( "Italic", g_Font.m_LogFont.lfWeight < 550 ? "" : "Bold " ); else str.Format( "%s", g_Font.m_LogFont.lfWeight < 550 ? "Regular" : "Bold" ); m_pDialogBar->GetDlgItem( IDC_FONTSTYLE_STATIC )->SetWindowText( str ); str.Format( "%ld", cf.iPointSize/10 ); m_pDialogBar->GetDlgItem( IDC_FONTSIZE_STATIC )->SetWindowText( str ); } g_bFirstTime = FALSE; } //----------------------------------------------------------------------------- // Name: OnGlyphsFromRangeRadio() // Desc: User will be specifying a glyph range manually //----------------------------------------------------------------------------- void CFontMakerApp::OnGlyphsFromRangeRadio() { m_pDialogBar->GetDlgItem( IDC_GLYPHSRANGEFROM_LABEL )->EnableWindow( TRUE ); m_pDialogBar->GetDlgItem( IDC_GLYPHSRANGETO_LABEL )->EnableWindow( TRUE ); m_pDialogBar->GetDlgItem( IDC_GLYPHSRANGEFROM_EDIT )->EnableWindow( TRUE ); m_pDialogBar->GetDlgItem( IDC_GLYPHSRANGETO_EDIT )->EnableWindow( TRUE ); m_pDialogBar->GetDlgItem( IDC_GLYPHSFILE_EDIT )->EnableWindow( FALSE ); m_pDialogBar->GetDlgItem( IDC_GLYPHSFILESELECTOR_BUTTON )->EnableWindow( FALSE ); ((CButton*)m_pDialogBar->GetDlgItem( IDC_GLYPHSFROMFILE_RADIO ))->SetCheck( false ); ((CButton*)m_pDialogBar->GetDlgItem( IDC_GLYPHSFROMRANGE_RADIO ))->SetCheck( true ); ((CButton*)m_pDialogBar->GetDlgItem( IDC_GLYPHSCUSTOM_RADIO ))->SetCheck( false ); OnChangeGlpyhsRangeEdit(); } //----------------------------------------------------------------------------- // Name: OnChangeGlpyhsRangeEdit() // Desc: User changed the range of glpyhs //----------------------------------------------------------------------------- void CFontMakerApp::OnChangeGlpyhsRangeEdit() { if( NULL == g_Font.m_hFont ) return; CEdit* pGlyphRangeFromEdit = (CEdit*)m_pDialogBar->GetDlgItem( IDC_GLYPHSRANGEFROM_EDIT ); CEdit* pGlyphRangeToEdit = (CEdit*)m_pDialogBar->GetDlgItem( IDC_GLYPHSRANGETO_EDIT ); CString strFrom; CString strTo; pGlyphRangeFromEdit->GetWindowText( strFrom ); pGlyphRangeToEdit->GetWindowText( strTo ); WORD wFrom = (WORD)max( 0, atoi( strFrom ) ); WORD wTo = (WORD)min( 65535, atoi( strTo ) ); g_Font.ExtractValidGlyphsFromRange( wFrom, wTo ); // Draw the new font glyphs CalculateAndRenderGlyphs(); } void CFontMakerApp::OnGlyphsCustom() { ((CButton*)m_pDialogBar->GetDlgItem( IDC_GLYPHSFROMFILE_RADIO ))->SetCheck( false ); ((CButton*)m_pDialogBar->GetDlgItem( IDC_GLYPHSFROMRANGE_RADIO ))->SetCheck( false ); ((CButton*)m_pDialogBar->GetDlgItem( IDC_GLYPHSCUSTOM_RADIO ))->SetCheck( true ); } //----------------------------------------------------------------------------- // Name: OnGlyphsFromFileRadio() // Desc: User want to extract glyphs that are used in a text file //----------------------------------------------------------------------------- void CFontMakerApp::OnGlyphsFromFileRadio() { m_pDialogBar->GetDlgItem( IDC_GLYPHSRANGEFROM_LABEL )->EnableWindow( FALSE ); m_pDialogBar->GetDlgItem( IDC_GLYPHSRANGETO_LABEL )->EnableWindow( FALSE ); m_pDialogBar->GetDlgItem( IDC_GLYPHSRANGEFROM_EDIT )->EnableWindow( FALSE ); m_pDialogBar->GetDlgItem( IDC_GLYPHSRANGETO_EDIT )->EnableWindow( FALSE ); m_pDialogBar->GetDlgItem( IDC_GLYPHSFILE_EDIT )->EnableWindow( TRUE ); m_pDialogBar->GetDlgItem( IDC_GLYPHSFILESELECTOR_BUTTON )->EnableWindow( TRUE ); ((CButton*)m_pDialogBar->GetDlgItem( IDC_GLYPHSFROMFILE_RADIO ))->SetCheck( true ); ((CButton*)m_pDialogBar->GetDlgItem( IDC_GLYPHSFROMRANGE_RADIO ))->SetCheck( false ); ((CButton*)m_pDialogBar->GetDlgItem( IDC_GLYPHSCUSTOM_RADIO ))->SetCheck( false ); OnChangeGlyphsFileEdit(); } //----------------------------------------------------------------------------- // Name: OnChangeGlyphsFileEdit() // Desc: Handle change in name of file to extract glyphs from //----------------------------------------------------------------------------- void CFontMakerApp::OnChangeGlyphsFileEdit() { CEdit* pGlyphFileNameEdit = (CEdit*)m_pDialogBar->GetDlgItem( IDC_GLYPHSFILE_EDIT ); CString strFileName; pGlyphFileNameEdit->GetWindowText( strFileName ); if( strFileName.IsEmpty() ) return; g_Font.ExtractValidGlyphsFromFile( (const TCHAR*)strFileName ); // Draw the new font glyphs CalculateAndRenderGlyphs(); } //----------------------------------------------------------------------------- // Name: OnGlyphsFileSelectorButton() // Desc: Handle change in name of file to extract glyphs from //----------------------------------------------------------------------------- void CFontMakerApp::OnGlyphsFileSelectorButton() { static TCHAR strFileName[MAX_PATH] = _T(""); static TCHAR strFileName2[MAX_PATH] = _T(""); static TCHAR strInitialDir[MAX_PATH] = _T("c:\\"); // Display the OpenFileName dialog. Then, try to load the specified file OPENFILENAME ofn = { sizeof(OPENFILENAME), NULL, NULL, _T("Text files (.txt)\0*.txt\0\0"), NULL, 0, 1, strFileName, MAX_PATH, strFileName2, MAX_PATH, strInitialDir, _T("Open Text File"), OFN_FILEMUSTEXIST, 0, 1, NULL, 0, NULL, NULL }; if( TRUE == GetOpenFileName( &ofn ) ) { m_pDialogBar->GetDlgItem( IDC_GLYPHSFILE_EDIT )->SetWindowText( ofn.lpstrFile); OnChangeGlyphsFileEdit(); } } //----------------------------------------------------------------------------- // Name: OnEffectsCheck() // Desc: User changed font rendering options //----------------------------------------------------------------------------- void CFontMakerApp::OnEffectsCheck() { g_Font.m_bOutlineEffect = ((CButton*)m_pDialogBar->GetDlgItem( IDC_EFFECTSOUTLINED_CHECK ))->GetCheck(); g_Font.m_bShadowEffect = ((CButton*)m_pDialogBar->GetDlgItem( IDC_EFFECTSSHADOWED_CHECK ))->GetCheck(); g_Font.m_bAntialiasEffect = ((CButton*)m_pDialogBar->GetDlgItem( IDC_EFFECTSANTIALIAS_CHECK ))->GetCheck(); bool bValveEffects = false; if ( g_Font.m_bOutlineEffect || g_Font.m_bShadowEffect ) { m_pDialogBar->GetDlgItem( IDC_EFFECTSBLURRED_CHECK )->EnableWindow( false ); m_pDialogBar->GetDlgItem( IDC_EFFECTSSCANLINES_CHECK )->EnableWindow( false ); ((CButton*)m_pDialogBar->GetDlgItem( IDC_EFFECTSBLURRED_CHECK ))->SetCheck( false ); ((CButton*)m_pDialogBar->GetDlgItem( IDC_EFFECTSSCANLINES_CHECK ))->SetCheck( false ); } else { m_pDialogBar->GetDlgItem( IDC_EFFECTSBLURRED_CHECK )->EnableWindow( true ); m_pDialogBar->GetDlgItem( IDC_EFFECTSSCANLINES_CHECK )->EnableWindow( true ); bValveEffects = true; } if ( bValveEffects && ((CButton*)m_pDialogBar->GetDlgItem( IDC_EFFECTSBLURRED_CHECK ))->GetCheck() ) { CEdit* pBlurEdit = (CEdit*)m_pDialogBar->GetDlgItem( IDC_BLUR_EDIT ); CString strBlur; pBlurEdit->GetWindowText( strBlur ); g_Font.m_nBlur = max( 2, atoi( strBlur ) ); strBlur.Format( "%d", g_Font.m_nBlur ); pBlurEdit->SetWindowText( strBlur ); } else { g_Font.m_nBlur = 0; } if ( bValveEffects && ((CButton*)m_pDialogBar->GetDlgItem( IDC_EFFECTSSCANLINES_CHECK ))->GetCheck() ) { CEdit* pScanlineEdit = (CEdit*)m_pDialogBar->GetDlgItem( IDC_SCANLINES_EDIT ); CString strScanlines; pScanlineEdit->GetWindowText( strScanlines ); g_Font.m_nScanlines = max( 2, atoi( strScanlines ) ); strScanlines.Format( "%d", g_Font.m_nScanlines ); pScanlineEdit->SetWindowText( strScanlines ); } else { g_Font.m_nScanlines = 0; } // Draw the new font glyphs CalculateAndRenderGlyphs(); } //----------------------------------------------------------------------------- // Name: OnMagnifyButton() // Desc: User wants to run the Windows "magnify" tool //----------------------------------------------------------------------------- void CFontMakerApp::OnMagnifyButton() { // Run the Windows "magnify" tool WinExec( "magnify.exe", TRUE ); } //----------------------------------------------------------------------------- // Name: class CTextureSizeDlg // Desc: Simple dialog to change the font texture size //----------------------------------------------------------------------------- class CTextureSizeDlg : public CDialog { public: CTextureSizeDlg(); // Dialog Data //{{AFX_DATA(CTextureSizeDlg) enum { IDD = IDD_TEXTURESIZE }; //}}AFX_DATA // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CTextureSizeDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL // Implementation protected: //{{AFX_MSG(CTextureSizeDlg) // No message handlers //}}AFX_MSG DECLARE_MESSAGE_MAP() }; CTextureSizeDlg::CTextureSizeDlg() : CDialog(CTextureSizeDlg::IDD) { //{{AFX_DATA_INIT(CTextureSizeDlg) //}}AFX_DATA_INIT } void CTextureSizeDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CTextureSizeDlg) DDX_Text( pDX, IDC_WIDTH, g_Font.m_dwTextureWidth ); DDV_MinMaxInt( pDX, g_Font.m_dwTextureWidth, 16, 2048 ); DDX_Text( pDX, IDC_HEIGHT, g_Font.m_dwTextureHeight ); DDV_MinMaxInt( pDX, g_Font.m_dwTextureHeight, 16, 2048 ); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CTextureSizeDlg, CDialog) //{{AFX_MSG_MAP(CTextureSizeDlg) //}}AFX_MSG_MAP END_MESSAGE_MAP() void CFontMakerApp::SetTextureSize( int width, int height ) { g_Font.m_dwTextureWidth = width; g_Font.m_dwTextureHeight = height; CString str; str.Format( "%ld", g_Font.m_dwTextureWidth ); m_pDialogBar->GetDlgItem( IDC_TEXTUREWIDTH_STATIC )->SetWindowText( str ); str.Format( "%ld", g_Font.m_dwTextureHeight ); m_pDialogBar->GetDlgItem( IDC_TEXTUREHEIGHT_STATIC )->SetWindowText( str ); } //----------------------------------------------------------------------------- // Name: OnTextureSizeButton() // Desc: User wants to change the font texture size //----------------------------------------------------------------------------- void CFontMakerApp::OnTextureSizeButton() { if ( !g_Font.m_hFont && !g_Font.m_pCustomFilename ) return; CTextureSizeDlg dlgTextureSize; dlgTextureSize.DoModal(); SetTextureSize( g_Font.m_dwTextureWidth, g_Font.m_dwTextureHeight ); // Draw the new font glyphs CalculateAndRenderGlyphs(); } void CFontMakerApp::InsertGlyph() { CEdit* pGlyphInsert = (CEdit*)m_pDialogBar->GetDlgItem( IDC_INSERTGLYPH_EDIT ); CString strInsert; pGlyphInsert->GetWindowText( strInsert ); WORD wGlyph = atoi( strInsert ); if ( wGlyph < 0 ) wGlyph = 0; else if ( wGlyph > 65535 ) wGlyph = 65535; g_Font.InsertGlyph( wGlyph ); } //----------------------------------------------------------------------------- // Name: UpdateSelectedGlyph() // Desc: User changed (via mouse or keyboard) which glyph is selected //----------------------------------------------------------------------------- void CFontMakerApp::UpdateSelectedGlyph( BOOL bGlyphSelected, int iSelectedGlyph ) { // Handle case where no glyph is selected g_bIsGlyphSelected = FALSE; g_iSelectedGlyphNum = 0; g_pSelectedGylph = NULL; g_cSelectedGlyph = L'\0'; if ( bGlyphSelected ) { for ( DWORD i=0; i<=g_Font.m_cMaxGlyph; i++ ) { if ( g_Font.m_TranslatorTable[i] == iSelectedGlyph ) { g_bIsGlyphSelected = TRUE; g_iSelectedGlyphNum = iSelectedGlyph; g_pSelectedGylph = &g_Font.m_pGlyphs[iSelectedGlyph]; g_cSelectedGlyph = (WCHAR)i; break; } } } // Enable/disable/set-text-of the appropriate controls if ( g_bIsGlyphSelected ) { CString str; str.Format( "%d", g_cSelectedGlyph ); m_pDialogBar->GetDlgItem( IDC_GLYPH_VALUE_STATIC )->SetWindowText( str ); str.Format( "%d", g_pSelectedGylph->x ); m_pDialogBar->GetDlgItem( IDC_GLYPH_X_STATIC )->SetWindowText( str ); str.Format( "%d", g_pSelectedGylph->y ); m_pDialogBar->GetDlgItem( IDC_GLYPH_Y_STATIC )->SetWindowText( str ); str.Format( "%d", g_pSelectedGylph->w ); m_pDialogBar->GetDlgItem( IDC_GLYPH_W_STATIC )->SetWindowText( str ); str.Format( "%d", g_pSelectedGylph->h ); m_pDialogBar->GetDlgItem( IDC_GLYPH_H_STATIC )->SetWindowText( str ); str.Format( "%d", g_pSelectedGylph->a ); m_pDialogBar->GetDlgItem( IDC_GLYPH_A_STATIC )->SetWindowText( str ); str.Format( "%d", g_pSelectedGylph->b ); m_pDialogBar->GetDlgItem( IDC_GLYPH_B_STATIC )->SetWindowText( str ); str.Format( "%d", g_pSelectedGylph->c ); m_pDialogBar->GetDlgItem( IDC_GLYPH_C_STATIC )->SetWindowText( str ); ((CButton*)m_pDialogBar->GetDlgItem( IDC_GLYPH_SPECIAL ))->SetCheck( g_Font.m_ValidGlyphs[g_cSelectedGlyph] == 2 ); } else { CString str(""); m_pDialogBar->GetDlgItem( IDC_GLYPH_VALUE_STATIC )->SetWindowText( str ); m_pDialogBar->GetDlgItem( IDC_GLYPH_X_STATIC )->SetWindowText( str ); m_pDialogBar->GetDlgItem( IDC_GLYPH_Y_STATIC )->SetWindowText( str ); m_pDialogBar->GetDlgItem( IDC_GLYPH_W_STATIC )->SetWindowText( str ); m_pDialogBar->GetDlgItem( IDC_GLYPH_H_STATIC )->SetWindowText( str ); m_pDialogBar->GetDlgItem( IDC_GLYPH_A_STATIC )->SetWindowText( str ); m_pDialogBar->GetDlgItem( IDC_GLYPH_B_STATIC )->SetWindowText( str ); m_pDialogBar->GetDlgItem( IDC_GLYPH_C_STATIC )->SetWindowText( str ); ((CButton*)m_pDialogBar->GetDlgItem( IDC_GLYPH_SPECIAL ))->SetCheck( FALSE ); } m_pDialogBar->GetDlgItem( IDC_SELECTEDGLYPH_GROUPBOX )->EnableWindow( g_bIsGlyphSelected ); m_pDialogBar->GetDlgItem( IDC_GLYPH_VALUE_LABEL )->EnableWindow( g_bIsGlyphSelected ); m_pDialogBar->GetDlgItem( IDC_GLYPH_X_LABEL )->EnableWindow( g_bIsGlyphSelected ); m_pDialogBar->GetDlgItem( IDC_GLYPH_Y_LABEL )->EnableWindow( g_bIsGlyphSelected ); m_pDialogBar->GetDlgItem( IDC_GLYPH_W_LABEL )->EnableWindow( g_bIsGlyphSelected ); m_pDialogBar->GetDlgItem( IDC_GLYPH_H_LABEL )->EnableWindow( g_bIsGlyphSelected ); m_pDialogBar->GetDlgItem( IDC_GLYPH_A_LABEL )->EnableWindow( g_bIsGlyphSelected ); m_pDialogBar->GetDlgItem( IDC_GLYPH_B_LABEL )->EnableWindow( g_bIsGlyphSelected ); m_pDialogBar->GetDlgItem( IDC_GLYPH_C_LABEL )->EnableWindow( g_bIsGlyphSelected ); m_pDialogBar->GetDlgItem( IDC_GLYPH_VALUE_STATIC )->EnableWindow( g_bIsGlyphSelected ); m_pDialogBar->GetDlgItem( IDC_GLYPH_X_STATIC )->EnableWindow( g_bIsGlyphSelected ); m_pDialogBar->GetDlgItem( IDC_GLYPH_Y_STATIC )->EnableWindow( g_bIsGlyphSelected ); m_pDialogBar->GetDlgItem( IDC_GLYPH_W_STATIC )->EnableWindow( g_bIsGlyphSelected ); m_pDialogBar->GetDlgItem( IDC_GLYPH_H_STATIC )->EnableWindow( g_bIsGlyphSelected ); m_pDialogBar->GetDlgItem( IDC_GLYPH_A_STATIC )->EnableWindow( g_bIsGlyphSelected ); m_pDialogBar->GetDlgItem( IDC_GLYPH_B_STATIC )->EnableWindow( g_bIsGlyphSelected ); m_pDialogBar->GetDlgItem( IDC_GLYPH_C_STATIC )->EnableWindow( g_bIsGlyphSelected ); m_pDialogBar->GetDlgItem( IDC_GLYPH_SPECIAL )->EnableWindow( g_bIsGlyphSelected ); } //----------------------------------------------------------------------------- // Name: OnGlyphSpecial() // Desc: User changed the status of the selected glyph //----------------------------------------------------------------------------- void CFontMakerApp::OnGlyphSpecial() { if( g_bIsGlyphSelected ) { if( ((CButton*)m_pDialogBar->GetDlgItem( IDC_GLYPH_SPECIAL ))->GetCheck() ) g_Font.m_ValidGlyphs[g_cSelectedGlyph] = 2; else g_Font.m_ValidGlyphs[g_cSelectedGlyph] = 1; // Draw the font glyphs, which may have changed layout CalculateAndRenderGlyphs(); } } //----------------------------------------------------------------------------- // Name: OnLoadButton() // Desc: User wants to load a font file //----------------------------------------------------------------------------- void CFontMakerApp::OnLoadButton() { CHAR strVBFFileName[MAX_PATH]; sprintf( strVBFFileName, "%s.vbf", g_Font.m_strFontName ); OPENFILENAME ofnVBF; // common dialog box structure ZeroMemory( &ofnVBF, sizeof(OPENFILENAME) ); ofnVBF.lStructSize = sizeof(OPENFILENAME); ofnVBF.hwndOwner = m_pMainWnd->m_hWnd; ofnVBF.lpstrFilter = "Font files (*.vbf)\0*.vbf\0\0"; ofnVBF.nFilterIndex = 1; ofnVBF.lpstrFile = strVBFFileName; ofnVBF.nMaxFile = sizeof(strVBFFileName); ofnVBF.lpstrFileTitle = NULL; ofnVBF.nMaxFileTitle = 0; ofnVBF.lpstrInitialDir = NULL; ofnVBF.lpstrTitle = "Load Font (VBF) File..."; ofnVBF.Flags = OFN_PATHMUSTEXIST | OFN_EXPLORER | OFN_READONLY; // Display the Load dialog box for the VBF file if ( FALSE == GetOpenFileName( &ofnVBF ) ) return; if ( FAILED( g_Font.ReadFontInfoFile( strVBFFileName ) ) ) { m_pMainWnd->MessageBox( "Could not load the Valve bitmap font info file.", "Error", MB_ICONERROR|MB_OK ); return; } } //----------------------------------------------------------------------------- // OnLoadCustomFontButton //----------------------------------------------------------------------------- void CFontMakerApp::OnLoadCustomFontButton() { CHAR strVCFFileName[MAX_PATH]; strVCFFileName[0] = '\0'; OPENFILENAME ofnVCF; // common dialog box structure ZeroMemory( &ofnVCF, sizeof(OPENFILENAME) ); ofnVCF.lStructSize = sizeof(OPENFILENAME); ofnVCF.hwndOwner = m_pMainWnd->m_hWnd; ofnVCF.lpstrFilter = "Custom Font files (*.vcf)\0*.vcf\0\0"; ofnVCF.nFilterIndex = 1; ofnVCF.lpstrFile = strVCFFileName; ofnVCF.nMaxFile = sizeof(strVCFFileName); ofnVCF.lpstrFileTitle = NULL; ofnVCF.nMaxFileTitle = 0; ofnVCF.lpstrInitialDir = NULL; ofnVCF.lpstrTitle = "Load Custom Font (VCF) File..."; ofnVCF.Flags = OFN_PATHMUSTEXIST | OFN_EXPLORER | OFN_READONLY; // Display the Load dialog box for the VBF file if ( FALSE == GetOpenFileName( &ofnVCF ) ) return; if ( FAILED( g_Font.ReadCustomFontFile( strVCFFileName ) ) ) { m_pMainWnd->MessageBox( "Could not load the Valve bitmap custom font file.", "Error", MB_ICONERROR|MB_OK ); return; } // Reset the selected glpyh UpdateSelectedGlyph( FALSE ); if ( FAILED( CalculateAndRenderGlyphs() ) ) { // Could not create new font MessageBox( m_pMainWnd->m_hWnd, "Could not create the requested font!", "Error", MB_ICONERROR|MB_OK ); return; } m_pDialogBar->GetDlgItem( IDC_FONT_GROUPBOX )->EnableWindow( FALSE ); m_pDialogBar->GetDlgItem( IDC_FONTNAME_LABEL )->EnableWindow( TRUE ); m_pDialogBar->GetDlgItem( IDC_FONTSTYLE_LABEL )->EnableWindow( TRUE ); m_pDialogBar->GetDlgItem( IDC_FONTSIZE_LABEL )->EnableWindow( TRUE ); m_pDialogBar->GetDlgItem( IDC_FONTNAME_STATIC )->EnableWindow( TRUE ); m_pDialogBar->GetDlgItem( IDC_FONTSTYLE_STATIC )->EnableWindow( FALSE ); m_pDialogBar->GetDlgItem( IDC_FONTSIZE_STATIC )->EnableWindow( TRUE ); m_pDialogBar->GetDlgItem( IDC_EFFECTSOUTLINED_CHECK )->EnableWindow( FALSE ); m_pDialogBar->GetDlgItem( IDC_EFFECTSSHADOWED_CHECK )->EnableWindow( FALSE ); m_pDialogBar->GetDlgItem( IDC_EFFECTSBLURRED_CHECK )->EnableWindow( FALSE ); m_pDialogBar->GetDlgItem( IDC_EFFECTSSCANLINES_CHECK )->EnableWindow( FALSE ); m_pDialogBar->GetDlgItem( IDC_EFFECTSANTIALIAS_CHECK )->EnableWindow( FALSE ); m_pDialogBar->GetDlgItem( IDC_BLUR_EDIT )->EnableWindow( FALSE ); m_pDialogBar->GetDlgItem( IDC_SCANLINES_EDIT )->EnableWindow( FALSE ); CString str; str.Format( "%s", g_Font.m_strFontName ); m_pDialogBar->GetDlgItem( IDC_FONTNAME_STATIC )->SetWindowText( str ); str.Format( "%d", g_Font.m_maxCustomCharHeight ); m_pDialogBar->GetDlgItem( IDC_FONTSIZE_STATIC )->SetWindowText( str ); // Set texture properties m_pDialogBar->GetDlgItem( IDC_TEXTURE_GROUPBOX )->EnableWindow( TRUE ); m_pDialogBar->GetDlgItem( IDC_TEXTUREWIDTH_LABEL )->EnableWindow( TRUE ); m_pDialogBar->GetDlgItem( IDC_TEXTUREHEIGHT_LABEL )->EnableWindow( TRUE ); m_pDialogBar->GetDlgItem( IDC_TEXTUREWIDTH_STATIC )->EnableWindow( TRUE ); m_pDialogBar->GetDlgItem( IDC_TEXTUREHEIGHT_STATIC )->EnableWindow( TRUE ); m_pDialogBar->GetDlgItem( IDC_TEXTURESIZE_BUTTON )->EnableWindow( TRUE ); SetTextureSize( g_Font.m_dwTextureWidth, g_Font.m_dwTextureHeight ); // Set glyph range properties m_pDialogBar->GetDlgItem( IDC_GLYPHS_GROUPBOX )->EnableWindow( FALSE ); m_pDialogBar->GetDlgItem( IDC_GLYPHSFROMRANGE_RADIO )->EnableWindow( FALSE ); m_pDialogBar->GetDlgItem( IDC_GLYPHSFROMFILE_RADIO )->EnableWindow( FALSE ); m_pDialogBar->GetDlgItem( IDC_GLYPHSRANGEFROM_EDIT )->EnableWindow( FALSE ); m_pDialogBar->GetDlgItem( IDC_GLYPHSRANGETO_EDIT )->EnableWindow( FALSE ); m_pDialogBar->GetDlgItem( IDC_GLYPHSRANGEFROM_LABEL )->EnableWindow( FALSE ); m_pDialogBar->GetDlgItem( IDC_GLYPHSRANGETO_LABEL )->EnableWindow( FALSE ); m_pDialogBar->GetDlgItem( IDC_GLYPHSFILE_EDIT )->EnableWindow( FALSE ); m_pDialogBar->GetDlgItem( IDC_GLYPHSFILESELECTOR_BUTTON )->EnableWindow( FALSE ); m_pDialogBar->GetDlgItem( IDC_GLYPHSCUSTOM_RADIO )->EnableWindow( TRUE ); ((CButton*)m_pDialogBar->GetDlgItem( IDC_GLYPHSFROMRANGE_RADIO ))->SetCheck( FALSE ); ((CButton*)m_pDialogBar->GetDlgItem( IDC_GLYPHSFROMFILE_RADIO ))->SetCheck( FALSE ); ((CButton*)m_pDialogBar->GetDlgItem( IDC_GLYPHSCUSTOM_RADIO ))->SetCheck( TRUE ); m_pDialogBar->GetDlgItem( IDC_INSERTGLYPH_LABEL )->EnableWindow( FALSE ); m_pDialogBar->GetDlgItem( IDC_INSERTGLYPH_EDIT )->EnableWindow( FALSE ); } //----------------------------------------------------------------------------- // Name: OnSaveButton() // Desc: User wants to save the font files //----------------------------------------------------------------------------- void CFontMakerApp::OnSaveButton() { CHAR strTGAFileName[MAX_PATH]; CHAR strVBFFileName[MAX_PATH]; if ( !g_Font.m_hFont && !g_Font.m_pCustomFilename ) return; sprintf( strTGAFileName, "%s.tga", g_Font.m_strFontName ); OPENFILENAME ofnTGA; // common dialog box structure ZeroMemory( &ofnTGA, sizeof(OPENFILENAME) ); ofnTGA.lStructSize = sizeof(OPENFILENAME); ofnTGA.hwndOwner = m_pMainWnd->m_hWnd; ofnTGA.lpstrFilter = "Targa files (*.tga)\0*.tga\0\0"; ofnTGA.nFilterIndex = 1; ofnTGA.lpstrFile = strTGAFileName; ofnTGA.nMaxFile = sizeof(strTGAFileName); ofnTGA.lpstrFileTitle = NULL; ofnTGA.nMaxFileTitle = 0; ofnTGA.lpstrInitialDir = NULL; ofnTGA.lpstrTitle = "Save Font Texture Image (TGA) File..."; ofnTGA.Flags = OFN_PATHMUSTEXIST | OFN_OVERWRITEPROMPT | OFN_EXPLORER; // Display the Save As dialog box for the TGA file if ( FALSE == GetSaveFileName( &ofnTGA ) ) return; // use the tga name, but replace the extension CHAR *ptr; CHAR temp[MAX_PATH]; int len; strcpy( temp, strTGAFileName ); len = strlen( temp ); if ( len > 4 && temp[len-4] == '.' ) { temp[len-3] = 'v'; temp[len-2] = 'b'; temp[len-1] = 'f'; // strip the path ptr = strrchr( temp, '\\' ); if ( ptr ) { strcpy( strVBFFileName, ptr+1 ); } else { strcpy( strVBFFileName, temp ); } } else { sprintf( strVBFFileName, "%s.vbf", g_Font.m_strFontName ); } // place the VBF files in the materials directory CHAR materialsDir[MAX_PATH]; strcpy( materialsDir, strTGAFileName ); strlwr( materialsDir ); ptr = strstr( materialsDir, "\\content\\hl2x\\materialsrc\\" ); if ( ptr ) { // need the final dirs, skip past CHAR *ptr2 = ptr + strlen( "\\content\\hl2x\\materialsrc\\" ); strcpy( temp, ptr2 ); *ptr = '\0'; strcat( materialsDir, "\\game\\hl2x\\materials\\" ); strcat( materialsDir, temp ); // strip terminal filename ptr = materialsDir + strlen( materialsDir ) - 1; while ( ptr > materialsDir ) { if ( *ptr == '\\' ) { *ptr = '\0'; break; } ptr--; } } else { materialsDir[0] = '\0'; } // Initialize OPENFILENAME OPENFILENAME ofnVBF; // common dialog box structure ZeroMemory( &ofnVBF, sizeof(OPENFILENAME) ); ofnVBF.lStructSize = sizeof(OPENFILENAME); ofnVBF.hwndOwner = m_pMainWnd->m_hWnd; ofnVBF.lpstrFilter = "Font files (*.vbf)\0*.vbf\0\0"; ofnVBF.nFilterIndex = 1; ofnVBF.lpstrFile = strVBFFileName; ofnVBF.nMaxFile = sizeof(strVBFFileName); ofnVBF.lpstrFileTitle = NULL; ofnVBF.nMaxFileTitle = 0; ofnVBF.lpstrInitialDir = materialsDir[0] ? materialsDir : NULL; ofnVBF.lpstrTitle = "Save Valve Bitmap Font (VBF) File..."; ofnVBF.Flags = OFN_PATHMUSTEXIST | OFN_OVERWRITEPROMPT | OFN_EXPLORER; // Display the Save As dialog box for the ABC file if ( FALSE == GetSaveFileName( &ofnVBF ) ) return; // Make sure the names are valid if ( !lstrcmp( strVBFFileName, strTGAFileName ) ) { m_pMainWnd->MessageBox( "Cannot have VBF and TGA filenames be the same!\nFiles not saved.", "Error", MB_ICONERROR|MB_OK ); return; } // Add an extension, if there was not one if ( 0 == ofnVBF.nFileExtension ) lstrcat( strVBFFileName, ".vbf" ); if ( 0 == ofnTGA.nFileExtension ) lstrcat( strTGAFileName, ".tga" ); // Save the valve bitmap font info file (.vbf) if ( FAILED( g_Font.WriteFontInfoFile( strVBFFileName ) ) ) { m_pMainWnd->MessageBox( "Could not write the Valve bitmap font info file.", "Error", MB_ICONERROR|MB_OK ); return; } // blur or scanline effects require special processing to ensure // they can be used in additive mode bool bAdditiveMode = ( g_Font.m_nBlur || g_Font.m_nScanlines ); // a custom font requires special processing bool bCustomFont = g_Font.m_pCustomFilename != NULL; // Save the font image file (.tga) if ( FAILED( g_Font.WriteFontImageFile( strTGAFileName, bAdditiveMode, bCustomFont ) ) ) { m_pMainWnd->MessageBox( "Could not write the font texture image file.", "Error", MB_ICONERROR|MB_OK ); } } //----------------------------------------------------------------------------- // Name: OnAbout() // Desc: Display about box //----------------------------------------------------------------------------- void CFontMakerApp::OnAbout() { CDialog dlg(IDD_ABOUT); dlg.DoModal(); } //----------------------------------------------------------------------------- // Name: OnHelp() // Desc: Display app help //----------------------------------------------------------------------------- void CFontMakerApp::OnHelp() { HKEY hRegKey; if( ERROR_SUCCESS == RegOpenKeyEx( HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\XboxSDK"), 0, KEY_QUERY_VALUE, &hRegKey ) ) { DWORD dwSize = MAX_PATH; CHAR InstallPath[MAX_PATH]; if( ERROR_SUCCESS == RegQueryValueEx( hRegKey, _T("InstallPath"), NULL, NULL, (unsigned char *)InstallPath, &dwSize ) ) { CString path = InstallPath; path += _T("\\doc\\xboxsdk.chm::/xbox_jbh_tool_fontmaker.htm"); ::HtmlHelp( m_pMainWnd->GetSafeHwnd(), path, HH_DISPLAY_TOPIC, NULL ); RegCloseKey( hRegKey ); return; } RegCloseKey( hRegKey ); } MessageBox( m_pMainWnd->GetSafeHwnd(), "Unable to find the Xbox SDK Help file xboxsdk.chm.", "Help file error", MB_ICONEXCLAMATION | MB_OK | MB_TASKMODAL ); } //----------------------------------------------------------------------------- // Name: OnExit() // Desc: User chose to exit the app //----------------------------------------------------------------------------- void CFontMakerApp::OnExit() { // Send a close message to the main window m_pMainWnd->SendMessage( WM_CLOSE ); } //----------------------------------------------------------------------------- // Name: ExitInstance() // Desc: Do some cleanup before exitting the app //----------------------------------------------------------------------------- int CFontMakerApp::ExitInstance() { DestroyCursor( m_hWaitCursor ); return CWinApp::ExitInstance(); } //----------------------------------------------------------------------------- // Name: CalculateAndRenderGlyphs() // Desc: User changed the status of the selected glyph //----------------------------------------------------------------------------- HRESULT CFontMakerApp::CalculateAndRenderGlyphs() { HRESULT hr; // This may take some time, so display a wait cursor HCURSOR hOldCursor = GetCursor(); SetCursor( m_hWaitCursor ); // Draw the font glyphs, which may have changed layout if( FAILED( hr = g_Font.CalculateAndRenderGlyphs() ) ) return hr; // Re-select the current glyph since the font data may have changed theApp.UpdateSelectedGlyph( g_bIsGlyphSelected, g_iSelectedGlyphNum ); // Inform the view of the new font glyphs m_pView->OnNewFontGlyphs(); // Restore the cursor SetCursor( hOldCursor ); return S_OK; }