Example #1
0
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;
}