bool MainWindow::onMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) { switch(uMsg) { case WM_INITDIALOG: initBlocks(); return TRUE; case WM_DRAWITEM: { DRAWITEMSTRUCT* dws = reinterpret_cast<DRAWITEMSTRUCT*>(lParam); if(dws->itemAction == ODA_DRAWENTIRE) { Graphics* g = Graphics::FromHDC(dws->hDC); g->SetTextRenderingHint(TextRenderingHintAntiAlias); g->Clear(Color(255, 0, 0, 0)); drawCharacters(g); g->Flush(); delete g; } } return TRUE; case WM_CLOSE: { PostQuitMessage(0); EndDialog(mWindow, 0); } return TRUE; case WM_COMMAND: { if(HIWORD(wParam) == 0) { if(LOWORD(wParam) == ID_FILE_EXIT) { PostQuitMessage(0); EndDialog(mWindow, 0); return TRUE; } else if(LOWORD(wParam) == ID_FILE_SAVEAS) { std::vector<wchar_t> filePath(2048); OPENFILENAME ofn = { 0 }; ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = mWindow; ofn.hInstance = GetModuleHandle(nullptr); ofn.lpstrFilter = L"Font Information File\0*.fti\0\0"; ofn.lpstrFile = filePath.data(); ofn.nMaxFile = 2048; std::vector<wchar_t> curDir(2048); GetCurrentDirectory(2048, curDir.data()); ofn.lpstrInitialDir = curDir.data(); ofn.lpstrTitle = L"Select output location"; ofn.Flags |= OFN_PATHMUSTEXIST; ofn.lpstrDefExt = L"fti"; if(GetSaveFileName(&ofn) == FALSE) { return TRUE; } mOutFile = filePath.data(); saveToFile(); } } if(HIWORD(wParam) == BN_CLICKED) { if(LOWORD(wParam) == IDC_CP_ADD) { int32 index = ListBox_GetCurSel(GetDlgItem(mWindow, IDC_CP_AVAIL_LIST)); mCurrentBlock = mBlockVector[index]; RedrawWindow(GetDlgItem(mWindow, IDC_PREVIEW), nullptr, nullptr, RDW_INVALIDATE); ListBox_DeleteString(GetDlgItem(mWindow, IDC_CP_AVAIL_LIST), index); auto info = mBlockVector[index]; mBlockVector.erase(mBlockVector.begin() + index); mActiveBlocks.push_back(info); ListBox_AddString(GetDlgItem(mWindow, IDC_CP_USED), info.name->c_str()); } if(LOWORD(wParam) == IDC_FONT_SELECT) { LOGFONT logFont; CHOOSEFONT cf = { 0 }; cf.lStructSize = sizeof(CHOOSEFONT); cf.hwndOwner = mWindow; cf.hDC = nullptr; cf.lpLogFont = &logFont; cf.iPointSize = 120; BOOL res = ChooseFont(&cf); if(res == FALSE) { break; } HDC hDC = GetDC(nullptr); auto height = -MulDiv(logFont.lfHeight, GetDeviceCaps(hDC, LOGPIXELSY), 72); std::wstringstream fontDesc; fontDesc << logFont.lfFaceName << L", " << height << L" px, "; switch(logFont.lfWeight) { case FW_THIN: fontDesc << L"Thin"; break; case FW_EXTRALIGHT: fontDesc << L"Extra Light"; break; case FW_LIGHT: fontDesc << L"Light"; break; case FW_NORMAL: fontDesc << L"Regular"; break; case FW_MEDIUM: fontDesc << L"Medium"; break; case FW_SEMIBOLD: fontDesc << L"Semibold"; break; case FW_BOLD: fontDesc << L"Bold"; break; case FW_EXTRABOLD: fontDesc << L"Extra bold"; break; case FW_HEAVY: fontDesc << L"Heavy"; break; } Edit_SetText(GetDlgItem(mWindow, IDC_FONT_DESC), fontDesc.str().c_str()); delete mDefFont; mDefFont = new Font(hDC, &logFont); ReleaseDC(nullptr, hDC); mFontSize = height; RedrawWindow(GetDlgItem(mWindow, IDC_PREVIEW), nullptr, nullptr, RDW_INVALIDATE); } } } return TRUE; default: return FALSE; } return TRUE; }