static int CALLBACK check_height_family_enumproc(ENUMLOGFONTEXA *enumlf, NEWTEXTMETRICEXA *ntm, DWORD type, LPARAM lParam) { HDC hdc = GetDC(NULL); enumlf->elfLogFont.lfHeight = 0; EnumFontFamiliesExA(hdc, &enumlf->elfLogFont, (FONTENUMPROCA)check_height_font_enumproc, lParam, 0); ReleaseDC(NULL, hdc); return 1; }
static void test_TTGetEmbeddingType(void) { HFONT hfont, old_font; LOGFONTA logfont; ULONG status; LONG ret; HDC hdc; ret = TTGetEmbeddingType(NULL, NULL); ok(ret == E_HDCINVALID, "got %d\n", ret); status = 0xdeadbeef; ret = TTGetEmbeddingType(NULL, &status); ok(ret == E_HDCINVALID, "got %#x\n", ret); ok(status == 0xdeadbeef, "got %u\n", status); status = 0xdeadbeef; ret = TTGetEmbeddingType((HDC)0xdeadbeef, &status); ok(ret == E_NOTATRUETYPEFONT || broken(ret == E_ERRORACCESSINGFONTDATA) /* xp, vista */, "got %#x\n", ret); ok(status == 0xdeadbeef, "got %u\n", status); hdc = CreateCompatibleDC(0); ret = TTGetEmbeddingType(hdc, NULL); ok(ret == E_NOTATRUETYPEFONT, "got %#x\n", ret); status = 0xdeadbeef; ret = TTGetEmbeddingType(hdc, &status); ok(ret == E_NOTATRUETYPEFONT, "got %#x\n", ret); ok(status == 0xdeadbeef, "got %u\n", status); memset(&logfont, 0, sizeof(logfont)); logfont.lfHeight = 12; logfont.lfWeight = FW_NORMAL; strcpy(logfont.lfFaceName, "Tahoma"); hfont = CreateFontIndirectA(&logfont); ok(hfont != NULL, "got %p\n", hfont); old_font = SelectObject(hdc, hfont); status = 0; ret = TTGetEmbeddingType(hdc, &status); ok(ret == E_NONE, "got %#x\n", ret); ok(status != 0, "got %u\n", status); ret = TTGetEmbeddingType(hdc, NULL); ok(ret == E_PERMISSIONSINVALID, "got %#x\n", ret); SelectObject(hdc, old_font); DeleteObject(hfont); /* repeat for all system fonts */ logfont.lfCharSet = DEFAULT_CHARSET; logfont.lfFaceName[0] = 0; EnumFontFamiliesExA(hdc, &logfont, (FONTENUMPROCA)enum_font_proc, 0, 0); DeleteDC(hdc); }
static BOOL is_charset_font_installed(HDC hDC, BYTE CharSet) { LOGFONT lf; ZeroMemory(&lf, sizeof(lf)); lf.lfCharSet = DEFAULT_CHARSET; if (!EnumFontFamiliesExA(hDC, &lf, is_charset_font_proc, CharSet, 0)) return TRUE; return FALSE; }
static BOOL is_truetype_font_installed(HDC hDC, const char *name) { LOGFONT lf; ZeroMemory(&lf, sizeof(lf)); lf.lfCharSet = DEFAULT_CHARSET; lstrcpy(lf.lfFaceName, name); if (!EnumFontFamiliesExA(hDC, &lf, is_truetype_font_proc, 0, 0)) return TRUE; return FALSE; }
/* Callback for EnumFontFamiliesEx in populateFontFileNameMap. * Expects to be called for every charset of every font family. * If this is the first time we have been called for this family, * add a new mapping to the familyToFontListMap from this family to a * list of its members. To populate that list, further enumerate all faces * in this family for the matched charset. This assumes that all fonts * in a family support the same charset, which is a fairly safe assumption * and saves time as the call we make here to EnumFontFamiliesEx will * enumerate the members of this family just once each. * Because we set fmi->list to be the newly created list the call back * can safely add to that list without a search. */ static int CALLBACK EnumFamilyNamesA( ENUMLOGFONTEXA *lpelfe, /* pointer to logical-font data */ NEWTEXTMETRICEX *lpntme, /* pointer to physical-font data */ int FontType, /* type of font */ LPARAM lParam) /* application-defined data */ { GdiFontMapInfo *fmi = (GdiFontMapInfo*)lParam; JNIEnv *env = fmi->env; jstring familyLC; LOGFONTA lfa; /* Both Vista and XP return DEVICE_FONTTYPE for OTF fonts */ if (FontType != TRUETYPE_FONTTYPE && FontType != DEVICE_FONTTYPE) { return 1; } /* Windows lists fonts which have a vmtx (vertical metrics) table twice. * Once using their normal name, and again preceded by '@'. These appear * in font lists in some windows apps, such as wordpad. We don't want * these so we skip any font where the first character is '@' */ if (lpelfe->elfLogFont.lfFaceName[0] == '@') { return 1; } fmi->family = JNU_NewStringPlatform(env,lpelfe->elfLogFont.lfFaceName); if (fmi->family == NULL) { (*env)->ExceptionClear(env); return 1; } familyLC = (*env)->CallObjectMethod(env, fmi->family, fmi->toLowerCaseMID, fmi->locale); /* check if already seen this family with a different charset */ if ((*env)->CallBooleanMethod(env,fmi->familyToFontListMap, fmi->containsKeyMID, familyLC)) { return 1; } fmi->list = (*env)->NewObject(env, fmi->arrayListClass, fmi->arrayListCtr, 4); if (fmi->list == NULL) { (*env)->ExceptionClear(env); return 1; } (*env)->CallObjectMethod(env, fmi->familyToFontListMap, fmi->putMID, familyLC, fmi->list); /* printf("FAMILY=%s\n", lpelfe->elfLogFont.lfFaceName);fflush(stdout); */ memset(&lfa, 0, sizeof(lfa)); strcpy(lfa.lfFaceName, lpelfe->elfLogFont.lfFaceName); lfa.lfCharSet = lpelfe->elfLogFont.lfCharSet; EnumFontFamiliesExA(screenDC, &lfa, (FONTENUMPROCA)EnumFontFacesInFamilyProcA, lParam, 0L); return 1; }
BOOL IsFontAvailable(const char* font_name) { LOGFONTA lf = { 0 }; HDC hDC = GetDC(hMainDialog); if (font_name == NULL) return FALSE; lf.lfCharSet = DEFAULT_CHARSET; safe_strcpy(lf.lfFaceName, LF_FACESIZE, font_name); return EnumFontFamiliesExA(hDC, &lf, EnumFontFamExProc, 0, 0); }
static FX_BOOL RetrieveSpecificFont(LOGFONTA& lf) { PDF_FONTDATA fd; memset(&fd, 0, sizeof(PDF_FONTDATA)); HDC hDC = ::GetDC(NULL); EnumFontFamiliesExA(hDC, &lf, (FONTENUMPROCA)EnumFontFamExProc, (LPARAM)&fd, 0); ::ReleaseDC(NULL, hDC); if (fd.bFind) { memcpy(&lf, &fd.lf, sizeof(LOGFONTA)); } return fd.bFind; }
void ZLWin32PaintContext::fillFamiliesList(std::vector<std::string> &families) const { std::set<std::string> familiesSet; LOGFONTA font; font.lfCharSet = DEFAULT_CHARSET; font.lfFaceName[0] = '\0'; font.lfPitchAndFamily = 0; HDC dc = GetDC(0); EnumFontFamiliesExA(dc, &font, enumFamiliesProc, (LPARAM)&familiesSet, 0); ReleaseDC(0, dc); for (std::set<std::string>::const_iterator it = familiesSet.begin(); it != familiesSet.end(); ++it) { families.push_back(*it); } }
static int CALLBACK nr_type_w32_typefaces_enum_proc (LOGFONT *lfp, TEXTMETRIC *metrics, DWORD fontType, LPARAM lParam) { if (fontType == TRUETYPE_FONTTYPE) { LOGFONT lf; lf = *lfp; EnumFontFamiliesExA (hdc, &lf, (FONTENUMPROC) nr_type_w32_inner_enum_proc, lParam, 0); } return 1; }
static void nr_type_w32_init (void) { LOGFONT logfont; GSList *l; int pos; g_print ("Loading W32 type directory...\n"); hdc = CreateDC ("DISPLAY", NULL, NULL, NULL); familydict = g_hash_table_new (g_str_hash, g_str_equal); namedict = g_hash_table_new (g_str_hash, g_str_equal); /* read system font directory */ memset (&logfont, 0, sizeof (LOGFONT)); logfont.lfCharSet = DEFAULT_CHARSET; EnumFontFamiliesExA (hdc, &logfont, (FONTENUMPROC) nr_type_w32_typefaces_enum_proc, 0, 0); /* Fill in lists */ NRW32Families.length = g_slist_length (familylist); NRW32Families.names = g_new (unsigned char *, NRW32Families.length); pos = 0; for (l = familylist; l != NULL; l = l->next) { NRW32Families.names[pos] = (unsigned char *) l->data; pos += 1; } NRW32Typefaces.length = g_slist_length (namelist); NRW32Typefaces.names = g_new (unsigned char *, NRW32Typefaces.length); pos = 0; for (l = namelist; l != NULL; l = l->next) { NRW32Typefaces.names[pos] = (unsigned char *) l->data; pos += 1; } w32i = TRUE; }
static void test_height(void) { LOGFONTA lf; HFONT hFont, hFontSm; RECT rc1, rc2; HWND hwndStatus = CreateWindowA(SUBCLASS_NAME, NULL, WS_CHILD|WS_VISIBLE, 0, 0, 300, 20, g_hMainWnd, NULL, NULL, NULL); HDC hdc; GetClientRect(hwndStatus, &rc1); hFont = CreateFontA(32, 0, 0, 0, FW_DONTCARE, FALSE, FALSE, FALSE, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, FF_DONTCARE, "Tahoma"); g_wmsize_count = 0; SendMessageA(hwndStatus, WM_SETFONT, (WPARAM)hFont, TRUE); if (!g_wmsize_count) { skip("Status control not resized in win95, skipping broken tests.\n"); return; } ok(g_wmsize_count > 0, "WM_SETFONT should issue WM_SIZE\n"); GetClientRect(hwndStatus, &rc2); expect_rect(0, 0, 672, 42, rc2); /* GetTextMetrics returns invalid tmInternalLeading for this font */ g_wmsize_count = 0; SendMessageA(hwndStatus, WM_SETFONT, (WPARAM)hFont, TRUE); ok(g_wmsize_count > 0, "WM_SETFONT should issue WM_SIZE\n"); GetClientRect(hwndStatus, &rc2); expect_rect(0, 0, 672, 42, rc2); /* minheight < fontsize - no effects*/ SendMessageA(hwndStatus, SB_SETMINHEIGHT, 12, 0); SendMessageA(hwndStatus, WM_SIZE, 0, 0); GetClientRect(hwndStatus, &rc2); expect_rect(0, 0, 672, 42, rc2); /* minheight > fontsize - has an effect after WM_SIZE */ SendMessageA(hwndStatus, SB_SETMINHEIGHT, 60, 0); GetClientRect(hwndStatus, &rc2); expect_rect(0, 0, 672, 42, rc2); SendMessageA(hwndStatus, WM_SIZE, 0, 0); GetClientRect(hwndStatus, &rc2); expect_rect(0, 0, 672, 62, rc2); /* font changed to smaller than minheight - has an effect */ SendMessageA(hwndStatus, SB_SETMINHEIGHT, 30, 0); expect_rect(0, 0, 672, 62, rc2); SendMessageA(hwndStatus, WM_SIZE, 0, 0); GetClientRect(hwndStatus, &rc2); expect_rect(0, 0, 672, 42, rc2); hFontSm = CreateFontA(9, 0, 0, 0, FW_DONTCARE, FALSE, FALSE, FALSE, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, FF_DONTCARE, "Tahoma"); SendMessageA(hwndStatus, WM_SETFONT, (WPARAM)hFontSm, TRUE); GetClientRect(hwndStatus, &rc2); expect_rect(0, 0, 672, 32, rc2); /* test the height formula */ ZeroMemory(&lf, sizeof(lf)); SendMessageA(hwndStatus, SB_SETMINHEIGHT, 0, 0); hdc = GetDC(NULL); /* used only for some fonts (tahoma as example) */ g_ysize = GetSystemMetrics(SM_CYSIZE) + 2; if (g_ysize & 1) g_ysize--; /* The min height is always even */ g_dpisize = MulDiv(18, GetDeviceCaps(hdc, LOGPIXELSY), 96) + 2; if (g_dpisize & 1) g_dpisize--; /* The min height is always even */ trace("dpi=%d (min height: %d or %d) SM_CYSIZE: %d\n", GetDeviceCaps(hdc, LOGPIXELSY), g_ysize, g_dpisize, GetSystemMetrics(SM_CYSIZE)); EnumFontFamiliesExA(hdc, &lf, (FONTENUMPROCA)check_height_family_enumproc, (LPARAM)hwndStatus, 0); ReleaseDC(NULL, hdc); DestroyWindow(hwndStatus); DeleteObject(hFont); DeleteObject(hFontSm); }
/* Obtain all the fontname -> filename mappings. * This is called once and the results returned to Java code which can * use it for lookups to reduce or avoid the need to search font files. */ JNIEXPORT void JNICALL Java_sun_font_FontManager_populateFontFileNameMap (JNIEnv *env, jclass obj, jobject fontToFileMap, jobject fontToFamilyMap, jobject familyToFontListMap, jobject locale) { #define MAX_BUFFER (FILENAME_MAX+1) const wchar_t wname[MAX_BUFFER]; const char cname[MAX_BUFFER]; const char data[MAX_BUFFER]; DWORD type; LONG ret; HKEY hkeyFonts; DWORD dwNameSize; DWORD dwDataValueSize; DWORD nval; LPCSTR fontKeyName; DWORD dwNumValues, dwMaxValueNameLen, dwMaxValueDataLen; DWORD numValues = 0; jclass classID; jmethodID putMID; GdiFontMapInfo fmi; /* Check we were passed all the maps we need, and do lookup of * methods for JNI up-calls */ if (fontToFileMap == NULL || fontToFamilyMap == NULL || familyToFontListMap == NULL) { return; } classID = (*env)->FindClass(env, "java/util/HashMap"); if (classID == NULL) { return; } putMID = (*env)->GetMethodID(env, classID, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"); if (putMID == NULL) { return; } fmi.env = env; fmi.fontToFamilyMap = fontToFamilyMap; fmi.familyToFontListMap = familyToFontListMap; fmi.putMID = putMID; fmi.locale = locale; fmi.containsKeyMID = (*env)->GetMethodID(env, classID, "containsKey", "(Ljava/lang/Object;)Z"); if (fmi.containsKeyMID == NULL) { return; } fmi.arrayListClass = (*env)->FindClass(env, "java/util/ArrayList"); if (fmi.arrayListClass == NULL) { return; } fmi.arrayListCtr = (*env)->GetMethodID(env, fmi.arrayListClass, "<init>", "(I)V"); if (fmi.arrayListCtr == NULL) { return; } fmi.addMID = (*env)->GetMethodID(env, fmi.arrayListClass, "add", "(Ljava/lang/Object;)Z"); if (fmi.addMID == NULL) { return; } classID = (*env)->FindClass(env, "java/lang/String"); if (classID == NULL) { return; } fmi.toLowerCaseMID = (*env)->GetMethodID(env, classID, "toLowerCase", "(Ljava/util/Locale;)Ljava/lang/String;"); if (fmi.toLowerCaseMID == NULL) { return; } /* Enumerate fonts via GDI to build maps of fonts and families */ if (IS_NT) { LOGFONTW lfw; memset(&lfw, 0, sizeof(lfw)); lfw.lfCharSet = DEFAULT_CHARSET; /* all charsets */ wcscpy(lfw.lfFaceName, L""); /* one face per family (CHECK) */ EnumFontFamiliesExW(GetDC(NULL), &lfw, (FONTENUMPROCW)EnumFamilyNamesW, (LPARAM)(&fmi), 0L); } else { LOGFONT lfa; memset(&lfa, 0, sizeof(lfa)); lfa.lfCharSet = DEFAULT_CHARSET; /* all charsets */ strcpy(lfa.lfFaceName, ""); /* one face per family */ ret = EnumFontFamiliesExA(GetDC(NULL), &lfa, (FONTENUMPROCA)EnumFamilyNamesA, (LPARAM)(&fmi), 0L); } /* Use the windows registry to map font names to files */ fontKeyName = (IS_NT) ? FONTKEY_NT : FONTKEY_WIN; ret = RegOpenKeyEx(HKEY_LOCAL_MACHINE, fontKeyName, 0L, KEY_READ, &hkeyFonts); if (ret != ERROR_SUCCESS) { return; } if (IS_NT) { ret = RegQueryInfoKeyW(hkeyFonts, NULL, NULL, NULL, NULL, NULL, NULL, &dwNumValues, &dwMaxValueNameLen, &dwMaxValueDataLen, NULL, NULL); } else { ret = RegQueryInfoKeyA(hkeyFonts, NULL, NULL, NULL, NULL, NULL, NULL, &dwNumValues, &dwMaxValueNameLen, &dwMaxValueDataLen, NULL, NULL); } if (ret != ERROR_SUCCESS || dwMaxValueNameLen >= MAX_BUFFER || dwMaxValueDataLen >= MAX_BUFFER) { RegCloseKey(hkeyFonts); return; } for (nval = 0; nval < dwNumValues; nval++ ) { dwNameSize = MAX_BUFFER; dwDataValueSize = MAX_BUFFER; if (IS_NT) { ret = RegEnumValueW(hkeyFonts, nval, (LPWSTR)wname, &dwNameSize, NULL, &type, (LPBYTE)data, &dwDataValueSize); } else { ret = RegEnumValueA(hkeyFonts, nval, (LPSTR)cname, &dwNameSize, NULL, &type, (LPBYTE)data, &dwDataValueSize); } if (ret != ERROR_SUCCESS) { break; } if (type != REG_SZ) { /* REG_SZ means a null-terminated string */ continue; } if (IS_NT) { if (!RegistryToBaseTTNameW((LPWSTR)wname) ) { continue; /* not a TT font... */ } registerFontW(&fmi, fontToFileMap, (LPWSTR)wname, (LPWSTR)data); } else { if (!RegistryToBaseTTNameA(cname) ) { continue; /* not a TT font... */ } registerFontA(&fmi, fontToFileMap, cname, (LPCSTR)data); } } RegCloseKey(hkeyFonts); }
DIALOG_RESULT_TYPE CALLBACK ConsoleOptionsDlgProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam) { HWND hwnd; DWORD dw; char buffer[64]; LONG_PTR lp; static DWORD dwBack, dwUser, dwMessage; switch (message) { case WM_INITDIALOG: if (!CRegistryUtils::GetRegString(HKEY_CURRENT_USER, buffer, 63, REGISTRY_KEY, REGISTRY_VALUE_CONSOLE_FONT) || !strlen(buffer)) strcpy_s(buffer, 64, SCINTILLA_FONT_NAME); if (!CRegistryUtils::GetRegDWORD(HKEY_CURRENT_USER, &dw, REGISTRY_KEY, REGISTRY_VALUE_CONSOLE_SIZE) || dw <= 0) dw = SCINTILLA_FONT_SIZE; if (fontlist.size() <= 0) { LOGFONTA lf; memset(&lf, 0, sizeof(LOGFONTA)); lf.lfCharSet = DEFAULT_CHARSET; EnumFontFamiliesExA(::GetWindowDC(hwndDlg), &lf, EnumFontFamExProc, 0, 0); std::sort(fontlist.begin(), fontlist.end()); fontlist.erase(std::unique(fontlist.begin(), fontlist.end()), fontlist.end()); } hwnd = ::GetDlgItem(hwndDlg, IDC_COMBO_FONTS); if (hwnd) { RECT rect; ::GetWindowRect(hwnd, &rect); int len = fontlist.size(); int sel = 0; for (int idx = 0; idx < len; idx++) { if (!fontlist[idx].compare(buffer)) sel = idx; ::SendMessageA(hwnd, CB_ADDSTRING, 0, (LPARAM)(fontlist[idx].c_str())); } ::SendMessageA(hwnd, CB_SETCURSEL, sel, 0); ::SetWindowPos(hwnd, 0, 0, 0, rect.right - rect.left, 300, SWP_NOZORDER | SWP_NOMOVE); } hwnd = ::GetDlgItem(hwndDlg, IDC_COMBO_FONTSIZE); if (hwnd) { RECT rect; ::GetWindowRect(hwnd, &rect); for (int idx = 4; idx <= 28; idx++) { sprintf_s(buffer, 32, "%d", idx); ::SendMessageA(hwnd, CB_ADDSTRING, 0, (LPARAM)(buffer)); } ::SendMessageA(hwnd, CB_SETCURSEL, dw-4, 0); ::SetWindowPos(hwnd, 0, 0, 0, rect.right - rect.left, 200, SWP_NOZORDER | SWP_NOMOVE); } if (!CRegistryUtils::GetRegDWORD(HKEY_CURRENT_USER, &dwBack, REGISTRY_KEY, REGISTRY_VALUE_CONSOLE_BACK) || dwBack < 0) dwBack = SCINTILLA_BACK_COLOR; if (!CRegistryUtils::GetRegDWORD(HKEY_CURRENT_USER, &dwUser, REGISTRY_KEY, REGISTRY_VALUE_CONSOLE_USER) || dwUser < 0) dwUser = SCINTILLA_USER_TEXT_COLOR; if (!CRegistryUtils::GetRegDWORD(HKEY_CURRENT_USER, &dwMessage, REGISTRY_KEY, REGISTRY_VALUE_CONSOLE_MESSAGE) || dwMessage < 0) dwMessage = SCINTILLA_R_TEXT_COLOR; lp = ::GetWindowLongPtr(::GetDlgItem(hwndDlg, IDC_BBACK), GWL_STYLE); ::SetWindowLongPtr(::GetDlgItem(hwndDlg, IDC_BBACK), GWL_STYLE, lp | BS_OWNERDRAW); lp = ::GetWindowLongPtr(::GetDlgItem(hwndDlg, IDC_BUSER), GWL_STYLE); ::SetWindowLongPtr(::GetDlgItem(hwndDlg, IDC_BUSER), GWL_STYLE, lp | BS_OWNERDRAW); lp = ::GetWindowLongPtr(::GetDlgItem(hwndDlg, IDC_BMESSAGE), GWL_STYLE); ::SetWindowLongPtr(::GetDlgItem(hwndDlg, IDC_BMESSAGE), GWL_STYLE, lp | BS_OWNERDRAW); lp = ::GetWindowLongPtr(::GetDlgItem(hwndDlg, IDC_PREVIEW), GWL_STYLE); ::SetWindowLongPtr(::GetDlgItem(hwndDlg, IDC_PREVIEW), GWL_STYLE, lp | SS_OWNERDRAW); if (!CRegistryUtils::GetRegDWORD(HKEY_CURRENT_USER, &dw, REGISTRY_KEY, REGISTRY_VALUE_CONSOLE_WIDTH) || dw < 0) dw = DEFAULT_CONSOLE_WIDTH; sprintf_s(buffer, 64, "%d", dw); ::SetWindowTextA(::GetDlgItem(hwndDlg, IDC_CONSOLE_WIDTH), buffer); if (!CRegistryUtils::GetRegDWORD(HKEY_CURRENT_USER, &dw, REGISTRY_KEY, REGISTRY_VALUE_CONSOLE_AUTO_WIDTH) || dw < 0) dw = DEFAULT_CONSOLE_AUTO_WIDTH; ::SendMessage(::GetDlgItem(hwndDlg, IDC_CB_AUTO), BM_SETCHECK, dw ? BST_CHECKED : BST_UNCHECKED, 0); ::EnableWindow(::GetDlgItem(hwndDlg, IDC_CONSOLE_WIDTH), !dw); ::EnableWindow(::GetDlgItem(hwndDlg, IDAPPLY), 0); CenterWindow(hwndDlg, ::GetParent(hwndDlg)); break; case WM_DRAWITEM: { HBRUSH brush = 0; HFONT font = 0; LOGFONT lf; HPEN pen; HDC &dc = ((DRAWITEMSTRUCT*)lParam)->hDC; RECT &rect = (((DRAWITEMSTRUCT*)lParam)->rcItem); RECT rfill; switch (wParam) { case IDC_PREVIEW: { brush = ::CreateSolidBrush(dwBack); ::FillRect(dc, &rect, brush); memset(&lf, 0, sizeof(LOGFONT)); ::GetWindowText(::GetDlgItem(hwndDlg, IDC_COMBO_FONTS), lf.lfFaceName, 32); ::GetWindowTextA(::GetDlgItem(hwndDlg, IDC_COMBO_FONTSIZE), buffer, 32); dw = atoi(buffer); if (dw < 1) dw = 1; lf.lfHeight = -MulDiv(dw, GetDeviceCaps(GetWindowDC(hwndDlg), LOGPIXELSY), 72); font = ::CreateFontIndirect(&lf); HGDIOBJ oldFont = ::SelectObject(dc, font); SetTextColor(dc, dwUser); SetBkMode(dc, TRANSPARENT); RECT r2; ::CopyRect(&r2, &rect); ::DrawTextA(dc, "User text; ", -1, &r2, DT_TOP | DT_WORD_ELLIPSIS | DT_SINGLELINE | DT_CALCRECT); ::DrawTextA(dc, "User text; ", -1, &r2, DT_TOP | DT_WORD_ELLIPSIS | DT_SINGLELINE); int left = r2.right; ::CopyRect(&r2, &rect); r2.left = left; SetTextColor(dc, dwMessage); ::DrawTextA(dc, "message text", -1, &r2, DT_TOP | DT_WORD_ELLIPSIS | DT_SINGLELINE); ::SelectObject(dc, oldFont); ::DeleteObject(font); ::DeleteObject(brush); return FALSE; } case IDC_BBACK: brush = ::CreateSolidBrush(dwBack); break; case IDC_BUSER: brush = ::CreateSolidBrush(dwUser); break; case IDC_BMESSAGE: brush = ::CreateSolidBrush(dwMessage); break; } if (brush) { rfill.left = rect.left + 2; rfill.top = rect.top + 2; rfill.right = rect.right - 2; rfill.bottom = rect.bottom - 2; pen = ::CreatePen(PS_SOLID, 1, 0); MoveToEx(dc, rect.left, rect.top, 0); LineTo(dc, rect.right-1, rect.top); LineTo(dc, rect.right - 1, rect.bottom - 1); LineTo(dc, rect.left, rect.bottom - 1); LineTo(dc, rect.left, rect.top); ::FillRect(dc, &rfill, brush); ::DeleteObject(brush); ::DeleteObject(pen); } } break; case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_COMBO_FONTS: case IDC_COMBO_FONTSIZE: if (HIWORD(wParam) == CBN_SELCHANGE) { ::RedrawWindow(::GetDlgItem(hwndDlg, IDC_PREVIEW), 0, 0, RDW_INVALIDATE); ::EnableWindow(::GetDlgItem(hwndDlg, IDAPPLY), 1); } break; case IDC_BBACK: if (ColorDlg(hwndDlg, dwBack)) { ::RedrawWindow(::GetDlgItem(hwndDlg, IDC_BBACK), 0, 0, RDW_INVALIDATE); ::RedrawWindow(::GetDlgItem(hwndDlg, IDC_PREVIEW), 0, 0, RDW_INVALIDATE); ::EnableWindow(::GetDlgItem(hwndDlg, IDAPPLY), 1); } break; case IDC_BUSER: if (ColorDlg(hwndDlg, dwUser)) { ::RedrawWindow(::GetDlgItem(hwndDlg, IDC_BUSER), 0, 0, RDW_INVALIDATE); ::RedrawWindow(::GetDlgItem(hwndDlg, IDC_PREVIEW), 0, 0, RDW_INVALIDATE); ::EnableWindow(::GetDlgItem(hwndDlg, IDAPPLY), 1); } break; case IDC_BMESSAGE: if (ColorDlg(hwndDlg, dwMessage)) { ::RedrawWindow(::GetDlgItem(hwndDlg, IDC_BMESSAGE), 0, 0, RDW_INVALIDATE); ::RedrawWindow(::GetDlgItem(hwndDlg, IDC_PREVIEW), 0, 0, RDW_INVALIDATE); ::EnableWindow(::GetDlgItem(hwndDlg, IDAPPLY), 1); } break; case IDC_CONSOLE_WIDTH: if (HIWORD( wParam) == EN_CHANGE ) ::EnableWindow(::GetDlgItem(hwndDlg, IDAPPLY), 1); break; case IDC_CB_AUTO: ::EnableWindow(::GetDlgItem(hwndDlg, IDC_CONSOLE_WIDTH), ::SendMessage(::GetDlgItem(hwndDlg, IDC_CB_AUTO), BM_GETCHECK, 0, 0) != BST_CHECKED); ::EnableWindow(::GetDlgItem(hwndDlg, IDAPPLY), 1); break; case IDAPPLY: case IDOK: ::GetWindowTextA(::GetDlgItem(hwndDlg, IDC_COMBO_FONTSIZE), buffer, 64); dw = atoi(buffer); if (dw < 1) dw = 1; fn(ptr, SCI_STYLESETSIZE, STYLE_DEFAULT, dw); ::GetWindowTextA(::GetDlgItem(hwndDlg, IDC_COMBO_FONTS), buffer, 64); fn(ptr, SCI_STYLESETFONT, STYLE_DEFAULT, (sptr_t)buffer); fn(ptr, SCI_STYLESETFORE, 1, dwMessage); fn(ptr, SCI_STYLESETFORE, 0, dwUser); fn(ptr, SCI_STYLESETBACK, 0, dwBack); fn(ptr, SCI_STYLESETBACK, 1, dwBack); fn(ptr, SCI_STYLESETBACK, 32, dwBack); ::EnableWindow(::GetDlgItem(hwndDlg, IDAPPLY), 0); // caret color. for dark backgrounds, set caret to white. fn(ptr, SCI_SETCARETFORE, getCaretColor(dwBack), 0); if (LOWORD(wParam) == IDAPPLY) break; // set registry CRegistryUtils::SetRegString(HKEY_CURRENT_USER, buffer, REGISTRY_KEY, REGISTRY_VALUE_CONSOLE_FONT); CRegistryUtils::SetRegDWORD(HKEY_CURRENT_USER, dw, REGISTRY_KEY, REGISTRY_VALUE_CONSOLE_SIZE); CRegistryUtils::SetRegDWORD(HKEY_CURRENT_USER, dwBack, REGISTRY_KEY, REGISTRY_VALUE_CONSOLE_BACK); CRegistryUtils::SetRegDWORD(HKEY_CURRENT_USER, dwMessage, REGISTRY_KEY, REGISTRY_VALUE_CONSOLE_MESSAGE); CRegistryUtils::SetRegDWORD(HKEY_CURRENT_USER, dwUser, REGISTRY_KEY, REGISTRY_VALUE_CONSOLE_USER); ::GetWindowTextA(::GetDlgItem(hwndDlg, IDC_CONSOLE_WIDTH), buffer, 64); dw = atoi(buffer); CRegistryUtils::SetRegDWORD(HKEY_CURRENT_USER, dw, REGISTRY_KEY, REGISTRY_VALUE_CONSOLE_WIDTH); autowidth = ::SendMessage(::GetDlgItem(hwndDlg, IDC_CB_AUTO), BM_GETCHECK, 0, 0) == BST_CHECKED; dw = autowidth ? 1 : 0; CRegistryUtils::SetRegDWORD(HKEY_CURRENT_USER, dw, REGISTRY_KEY, REGISTRY_VALUE_CONSOLE_AUTO_WIDTH); UpdateConsoleWidth(true); EndDialog(hwndDlg, wParam); return TRUE; case IDCANCEL: SetConsoleDefaults(); EndDialog(hwndDlg, wParam); return TRUE; } break; } return FALSE; }