- initialize display class with "Ms Shell Dlg"

- don't show display window until font is set
- use negative value for font size (patch by roytam1)

See issue #2260 for more details.

svn path=/trunk/; revision=26883
This commit is contained in:
Timo Kreuzer 2007-05-25 07:48:17 +00:00
parent 86ca0a4eba
commit 2b0336eaf8
2 changed files with 104 additions and 103 deletions

View file

@ -91,14 +91,7 @@ Display_DrawText(HDC hDC, DISPLAYDATA* pData, int nYPos)
hOldFont = SelectObject(hDC, pData->hCaptionFont);
GetTextMetrics(hDC, &tm);
if (*pData->szFormat == 0)
{
swprintf(szCaption, pData->szTypeFaceName);
}
else
{
swprintf(szCaption, L"%s (%s)", pData->szTypeFaceName, pData->szFormat);
}
swprintf(szCaption, L"%s%s", pData->szTypeFaceName, pData->szFormat);
TextOutW(hDC, 0, y, szCaption, wcslen(szCaption));
y += tm.tmHeight + SPACING1;
@ -147,6 +140,79 @@ Display_DrawText(HDC hDC, DISPLAYDATA* pData, int nYPos)
return y;
}
static LRESULT
Display_SetTypeFace(HWND hwnd, LPARAM lParam)
{
DISPLAYDATA* pData;
TEXTMETRIC tm;
HDC hDC;
RECT rect;
SCROLLINFO si;
int i;
/* Set the new type face name */
pData = (DISPLAYDATA*)GetWindowLongPtr(hwnd, GWLP_USERDATA);
snwprintf(pData->szTypeFaceName, MAX_TYPEFACENAME, (WCHAR*)lParam);
/* Create the new fonts */
hDC = GetDC(hwnd);
DeleteObject(pData->hCharSetFont);
pData->hCharSetFont = CreateFontW(-MulDiv(16, GetDeviceCaps(GetDC(NULL), LOGPIXELSY), 72),
0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE,
ANSI_CHARSET, OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS, PROOF_QUALITY,
DEFAULT_PITCH , pData->szTypeFaceName);
/* Get font format */
// FIXME: Get the real font format (OpenType?)
SelectObject(hDC, pData->hCharSetFont);
GetTextMetrics(hDC, &tm);
if ((tm.tmPitchAndFamily & TMPF_TRUETYPE) == TMPF_TRUETYPE)
{
swprintf(pData->szFormat, L" (TrueType)");
}
for (i = 0; i < MAX_SIZES; i++)
{
DeleteObject(pData->hFonts[i]);
pData->hFonts[i] = CreateFontW(-MulDiv(pData->nSizes[i], GetDeviceCaps(hDC, LOGPIXELSY), 72),
0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE,
ANSI_CHARSET, OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS, PROOF_QUALITY,
DEFAULT_PITCH , pData->szTypeFaceName);
}
/* Calculate new page dimensions */
pData->nPageHeight = Display_DrawText(hDC, pData, 0);
ReleaseDC(hwnd, hDC);
/* Set the vertical scrolling range and page size */
GetClientRect(hwnd, &rect);
si.cbSize = sizeof(si);
si.fMask = SIF_RANGE | SIF_PAGE | SIF_POS | SIF_TRACKPOS;
si.nMin = 0;
si.nMax = pData->nPageHeight;
si.nPage = rect.bottom;
si.nPos = 0;
si.nTrackPos = 0;
SetScrollInfo(hwnd, SB_VERT, &si, TRUE);
return 0;
}
static LRESULT
Display_SetString(HWND hwnd, LPARAM lParam)
{
DISPLAYDATA* pData;
pData = (DISPLAYDATA*)GetWindowLongPtr(hwnd, GWLP_USERDATA);
snwprintf(pData->szString, MAX_STRING, (WCHAR*)lParam);
// FIXME: redraw the window
return 0;
}
static LRESULT
Display_OnCreate(HWND hwnd)
{
@ -154,12 +220,12 @@ Display_OnCreate(HWND hwnd)
const int nSizes[7] = {12, 18, 24, 36, 48, 60, 72};
int i;
/* Initialize data structure */
/* Create data structure */
pData = malloc(sizeof(DISPLAYDATA));
pData->nPageHeight = 0;
swprintf(pData->szTypeFaceName, L"");
swprintf(pData->szFormat, L"");
swprintf(pData->szString, L"");
ZeroMemory(pData, sizeof(DISPLAYDATA));
/* Set the window's GWLP_USERDATA to our data structure */
SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)pData);
for (i = 0; i < MAX_SIZES; i++)
{
@ -167,15 +233,17 @@ Display_OnCreate(HWND hwnd)
}
pData->hCaptionFont = CreateFontW(50, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE,
ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY,
DEFAULT_PITCH , L"Ms Shell Dlg");
ANSI_CHARSET, OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS, PROOF_QUALITY,
DEFAULT_PITCH , L"Ms Shell Dlg");
pData->hSizeFont = CreateFontW(12, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE,
ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY,
DEFAULT_PITCH , L"Ms Shell Dlg");
ANSI_CHARSET, OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS, PROOF_QUALITY,
DEFAULT_PITCH , L"Ms Shell Dlg");
/* Set the window's GWLP_USERDATA to our data structure */
SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)pData);
Display_SetString(hwnd, (LPARAM)L"Jackdaws love my big sphinx of quartz. 1234567890");
Display_SetTypeFace(hwnd, (LPARAM)L"Ms Shell Dlg");
return 0;
}
@ -196,7 +264,7 @@ Display_OnPaint(HWND hwnd)
BeginPaint(hwnd, &ps);
/* Fill with white */
/* Erase background */
FillRect(ps.hdc, &ps.rcPaint, GetStockObject(WHITE_BRUSH));
/* Draw the text */
@ -216,7 +284,7 @@ Display_OnSize(HWND hwnd)
GetClientRect(hwnd, &rect);
/* Get the old pos */
/* Get the old scroll pos */
si.cbSize = sizeof(si);
si.fMask = SIF_POS;
GetScrollInfo(hwnd, SB_VERT, &si);
@ -227,15 +295,15 @@ Display_OnSize(HWND hwnd)
si.nPage = rect.bottom;
SetScrollInfo(hwnd, SB_VERT, &si, TRUE);
/* Get the new pos */
/* Get the new scroll pos */
si.fMask = SIF_POS;
GetScrollInfo(hwnd, SB_VERT, &si);
/* If the don't match ... */
/* If they don't match ... */
if (nOldPos != si.nPos)
{
/* ... scroll the window */
ScrollWindowEx(hwnd, 0, -(si.nPos - nOldPos), NULL, NULL, NULL, NULL, SW_INVALIDATE);
ScrollWindowEx(hwnd, 0, nOldPos - si.nPos, NULL, NULL, NULL, NULL, SW_INVALIDATE);
UpdateWindow(hwnd);
}
@ -278,7 +346,7 @@ Display_OnVScroll(HWND hwnd, WPARAM wParam)
nPos = min(nPos, si.nMax);
if (nPos != si.nPos)
{
ScrollWindowEx(hwnd, 0, -(nPos - si.nPos), NULL, NULL, NULL, NULL, SW_INVALIDATE);
ScrollWindowEx(hwnd, 0, si.nPos - nPos, NULL, NULL, NULL, NULL, SW_INVALIDATE);
si.cbSize = sizeof(si);
si.nPos = nPos;
si.fMask = SIF_POS;
@ -289,75 +357,6 @@ Display_OnVScroll(HWND hwnd, WPARAM wParam)
return 0;
}
static LRESULT
Display_SetTypeFace(HWND hwnd, LPARAM lParam)
{
DISPLAYDATA* pData;
TEXTMETRIC tm;
HDC hDC;
RECT rect;
SCROLLINFO si;
int i;
/* Set the new type face name */
pData = (DISPLAYDATA*)GetWindowLongPtr(hwnd, GWLP_USERDATA);
snwprintf(pData->szTypeFaceName, MAX_TYPEFACENAME, (WCHAR*)lParam);
/* Create the new fonts */
hDC = GetDC(hwnd);
pData->hCharSetFont = CreateFontW(-MulDiv(16, GetDeviceCaps(GetDC(NULL), LOGPIXELSY), 72), 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE,
ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY,
DEFAULT_PITCH , pData->szTypeFaceName);
/* Get font format */
SelectObject(hDC, pData->hCharSetFont);
GetTextMetrics(hDC, &tm);
if ((tm.tmPitchAndFamily & TMPF_TRUETYPE) == TMPF_TRUETYPE)
{
swprintf(pData->szFormat, L"TrueType");
}
for (i = 0; i < MAX_SIZES; i++)
{
pData->hFonts[i] = CreateFontW(MulDiv(pData->nSizes[i], GetDeviceCaps(hDC, LOGPIXELSY), 72),
0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE,
ANSI_CHARSET, OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS, PROOF_QUALITY,
DEFAULT_PITCH , pData->szTypeFaceName);
SelectObject(hDC, pData->hFonts[i]);
}
/* Calculate new page dimensions */
pData->nPageHeight = Display_DrawText(hDC, pData, 0);
ReleaseDC(hwnd, hDC);
/* Set the vertical scrolling range and page size */
GetClientRect(hwnd, &rect);
si.cbSize = sizeof(si);
si.fMask = SIF_RANGE | SIF_PAGE | SIF_POS | SIF_TRACKPOS;
si.nMin = 0;
si.nMax = pData->nPageHeight;
si.nPage = rect.bottom;
si.nPos = 0;
si.nTrackPos = 0;
SetScrollInfo(hwnd, SB_VERT, &si, TRUE);
return 0;
}
static LRESULT
Display_SetString(HWND hwnd, LPARAM lParam)
{
DISPLAYDATA* pData;
pData = (DISPLAYDATA*)GetWindowLongPtr(hwnd, GWLP_USERDATA);
snwprintf(pData->szString, MAX_STRING, (WCHAR*)lParam);
// FIXME: redraw the window
return 0;
}
static LRESULT
Display_OnDestroy(HWND hwnd)
{
@ -385,8 +384,8 @@ Display_OnDestroy(HWND hwnd)
LRESULT CALLBACK
DisplayProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
switch (message)
{
case WM_CREATE:
return Display_OnCreate(hwnd);
@ -405,13 +404,13 @@ DisplayProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
case FVM_SETSTRING:
return Display_SetString(hwnd, lParam);
case WM_DESTROY:
case WM_DESTROY:
return Display_OnDestroy(hwnd);
default:
return DefWindowProcW(hwnd, message, wParam, lParam);
}
default:
return DefWindowProcW(hwnd, message, wParam, lParam);
}
return 0;
return 0;
}

View file

@ -191,7 +191,7 @@ MainWnd_OnCreate(HWND hwnd)
0, /* Extended style */
g_szFontDisplayClassName, /* Classname */
L"", /* Title text */
WS_CHILD | WS_VSCROLL| WS_VISIBLE, /* Window style */
WS_CHILD | WS_VSCROLL, /* Window style */
0, /* X-pos */
HEADER_SIZE, /* Y-Pos */
550, /* Width */
@ -202,10 +202,12 @@ MainWnd_OnCreate(HWND hwnd)
NULL /* Window Creation data */
);
/* Init the display window with the font name */
LoadStringW(g_hInstance, IDS_STRING, szString, MAX_STRING);
SendMessage(hDisplay, FVM_SETSTRING, 0, (LPARAM)szString);
/* Init the display window with the font name */
SendMessage(hDisplay, FVM_SETTYPEFACE, 0, (LPARAM)g_szTypeFaceName);
ShowWindow(hDisplay, SW_SHOWNORMAL);
/* Create the quit button */
LoadStringW(g_hInstance, IDS_QUIT, szQuit, MAX_BUTTONNAME);