Example #1
0
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;
}
Example #2
0
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);
}
Example #3
0
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;
}
Example #4
0
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;
}
Example #5
0
/* 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;
}
Example #6
0
File: stdfn.c Project: ahe01/rufus
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);
}
Example #7
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);
	}
}
Example #9
0
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;
}
Example #10
0
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;
}
Example #11
0
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);
}
Example #12
0
/* 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);
}
Example #13
0
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;
}