Commit daaa0834 authored by Nikolay Sivov's avatar Nikolay Sivov Committed by Alexandre Julliard

comdlg32/fontdlg: Allow font sizes outside of defaults set.

parent a48d9684
......@@ -177,6 +177,7 @@ typedef struct {
#define IDS_SAVE_AS 1204
#define IDS_OPEN_FILE 1205
#define IDS_SELECT_FOLDER 1206
#define IDS_FONT_SIZE_INPUT 1207
#define IDS_FAKEDOCTEXT 1300
......
......@@ -144,6 +144,7 @@ STRINGTABLE
IDS_SAVE_AS "Save As"
IDS_OPEN_FILE "Open File"
IDS_SELECT_FOLDER "Select Folder"
IDS_FONT_SIZE_INPUT "Font size has to be a number."
}
/*
......
......@@ -32,6 +32,7 @@
#include "commdlg.h"
#include "dlgs.h"
#include "wine/debug.h"
#include "wine/unicode.h"
#include "cderr.h"
#include "cdlg.h"
......@@ -531,10 +532,12 @@ static INT AddFontStyle( const ENUMLOGFONTEXW *lpElfex, const NEWTEXTMETRICEXW *
return 1 ;
}
static BOOL CFn_FitFontSize( HWND hDlg, int points)
static void CFn_FitFontSize( HWND hDlg, int points)
{
static const WCHAR fmtW[] = {'%','d',0};
WCHAR buffW[16];
int i,n;
BOOL ret = FALSE;
/* look for fitting font size in combobox3 */
n=SendDlgItemMessageW(hDlg, cmb3, CB_GETCOUNT, 0, 0);
for (i=0;i<n;i++)
......@@ -546,11 +549,13 @@ static BOOL CFn_FitFontSize( HWND hDlg, int points)
SendMessageW(hDlg, WM_COMMAND,
MAKEWPARAM(cmb3, CBN_SELCHANGE),
(LPARAM)GetDlgItem(hDlg,cmb3));
ret = TRUE;
break;
return;
}
}
return ret;
/* no default matching size, set text manually */
sprintfW(buffW, fmtW, points);
SetDlgItemTextW(hDlg, cmb3, buffW);
}
static BOOL CFn_FitFontStyle( HWND hDlg, LONG packedstyle )
......@@ -905,6 +910,31 @@ static LRESULT CFn_WMDrawItem(LPARAM lParam)
return TRUE;
}
static INT get_dialog_font_point_size(HWND hDlg, CHOOSEFONTW *cf)
{
BOOL invalid_size = FALSE;
INT i, size;
i = SendDlgItemMessageW(hDlg, cmb3, CB_GETCURSEL, 0, 0);
if (i != CB_ERR)
size = LOWORD(SendDlgItemMessageW(hDlg, cmb3, CB_GETITEMDATA , i, 0));
else
{
WCHAR buffW[8], *endptrW;
GetDlgItemTextW(hDlg, cmb3, buffW, sizeof(buffW)/sizeof(*buffW));
size = strtolW(buffW, &endptrW, 10);
invalid_size = size == 0 && *endptrW;
if (size == 0)
size = 10;
}
cf->iPointSize = 10 * size;
cf->lpLogFont->lfHeight = -MulDiv(cf->iPointSize, GetScreenDPI(), 720);
return invalid_size ? -1 : size;
}
/***********************************************************************
* CFn_WMCommand [internal]
*/
......@@ -978,6 +1008,8 @@ static LRESULT CFn_WMCommand(HWND hDlg, WPARAM wParam, LPARAM lParam, LPCHOOSEFO
LPLOGFONTW lpxx=lpcf->lpLogFont;
TRACE("WM_COMMAND/cmb2,3 =%08lX\n", lParam);
/* face name */
i=SendDlgItemMessageW(hDlg,cmb1,CB_GETCURSEL,0,0);
if (i==CB_ERR)
i=GetDlgItemTextW( hDlg, cmb1, str, 256 );
......@@ -993,6 +1025,8 @@ static LRESULT CFn_WMCommand(HWND hDlg, WPARAM wParam, LPARAM lParam, LPCHOOSEFO
lpxx->lfPitchAndFamily = HIWORD(l) >> 8;
}
lstrcpynW(lpxx->lfFaceName, str, sizeof(lpxx->lfFaceName)/sizeof(lpxx->lfFaceName[0]));
/* style */
i=SendDlgItemMessageW(hDlg, cmb2, CB_GETCURSEL, 0, 0);
if (i!=CB_ERR)
{
......@@ -1002,14 +1036,11 @@ static LRESULT CFn_WMCommand(HWND hDlg, WPARAM wParam, LPARAM lParam, LPCHOOSEFO
if ((lpxx->lfWeight=LOWORD(l)) > FW_MEDIUM)
lpcf->nFontType |= BOLD_FONTTYPE;
}
i=SendDlgItemMessageW(hDlg, cmb3, CB_GETCURSEL, 0, 0);
if( i != CB_ERR)
lpcf->iPointSize = 10 * LOWORD(SendDlgItemMessageW(hDlg, cmb3,
CB_GETITEMDATA , i, 0));
else
lpcf->iPointSize = 100;
lpxx->lfHeight = - MulDiv( lpcf->iPointSize ,
GetScreenDPI(), 720);
/* size */
get_dialog_font_point_size(hDlg, lpcf);
/* charset */
i=SendDlgItemMessageW(hDlg, cmb5, CB_GETCURSEL, 0, 0);
if (i!=CB_ERR)
lpxx->lfCharSet=SendDlgItemMessageW(hDlg, cmb5, CB_GETITEMDATA, i, 0);
......@@ -1056,6 +1087,18 @@ static LRESULT CFn_WMCommand(HWND hDlg, WPARAM wParam, LPARAM lParam, LPCHOOSEFO
break;
case IDOK:
{
WCHAR msgW[80];
INT pointsize;
pointsize = get_dialog_font_point_size(hDlg, lpcf);
if (pointsize == -1)
{
LoadStringW(COMDLG32_hInstance, IDS_FONT_SIZE_INPUT, msgW, sizeof(msgW)/sizeof(*msgW));
MessageBoxW(hDlg, msgW, NULL, MB_OK | MB_ICONINFORMATION);
return TRUE;
}
if ( (!(lpcf->Flags & CF_LIMITSIZE)) ||
( (lpcf->Flags & CF_LIMITSIZE) &&
(lpcf->iPointSize >= 10 * lpcf->nSizeMin) &&
......@@ -1063,18 +1106,18 @@ static LRESULT CFn_WMCommand(HWND hDlg, WPARAM wParam, LPARAM lParam, LPCHOOSEFO
EndDialog(hDlg, TRUE);
else
{
WCHAR buffer[80];
WCHAR format[80];
DWORD_PTR args[2];
LoadStringW(COMDLG32_hInstance, IDS_FONT_SIZE, format, sizeof(format)/sizeof(WCHAR));
args[0] = lpcf->nSizeMin;
args[1] = lpcf->nSizeMax;
FormatMessageW(FORMAT_MESSAGE_FROM_STRING|FORMAT_MESSAGE_ARGUMENT_ARRAY,
format, 0, 0, buffer, sizeof(buffer)/sizeof(*buffer),
format, 0, 0, msgW, sizeof(msgW)/sizeof(*msgW),
(__ms_va_list*)args);
MessageBoxW(hDlg, buffer, NULL, MB_OK);
MessageBoxW(hDlg, msgW, NULL, MB_OK);
}
return(TRUE);
}
case IDCANCEL:
EndDialog(hDlg, FALSE);
return(TRUE);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment