- 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); hOldFont = SelectObject(hDC, pData->hCaptionFont);
GetTextMetrics(hDC, &tm); GetTextMetrics(hDC, &tm);
if (*pData->szFormat == 0) swprintf(szCaption, L"%s%s", pData->szTypeFaceName, pData->szFormat);
{
swprintf(szCaption, pData->szTypeFaceName);
}
else
{
swprintf(szCaption, L"%s (%s)", pData->szTypeFaceName, pData->szFormat);
}
TextOutW(hDC, 0, y, szCaption, wcslen(szCaption)); TextOutW(hDC, 0, y, szCaption, wcslen(szCaption));
y += tm.tmHeight + SPACING1; y += tm.tmHeight + SPACING1;
@ -147,6 +140,79 @@ Display_DrawText(HDC hDC, DISPLAYDATA* pData, int nYPos)
return y; 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 static LRESULT
Display_OnCreate(HWND hwnd) Display_OnCreate(HWND hwnd)
{ {
@ -154,12 +220,12 @@ Display_OnCreate(HWND hwnd)
const int nSizes[7] = {12, 18, 24, 36, 48, 60, 72}; const int nSizes[7] = {12, 18, 24, 36, 48, 60, 72};
int i; int i;
/* Initialize data structure */ /* Create data structure */
pData = malloc(sizeof(DISPLAYDATA)); pData = malloc(sizeof(DISPLAYDATA));
pData->nPageHeight = 0; ZeroMemory(pData, sizeof(DISPLAYDATA));
swprintf(pData->szTypeFaceName, L"");
swprintf(pData->szFormat, L""); /* Set the window's GWLP_USERDATA to our data structure */
swprintf(pData->szString, L""); SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)pData);
for (i = 0; i < MAX_SIZES; i++) 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, pData->hCaptionFont = CreateFontW(50, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE,
ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY, ANSI_CHARSET, OUT_DEFAULT_PRECIS,
DEFAULT_PITCH , L"Ms Shell Dlg"); CLIP_DEFAULT_PRECIS, PROOF_QUALITY,
DEFAULT_PITCH , L"Ms Shell Dlg");
pData->hSizeFont = CreateFontW(12, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, pData->hSizeFont = CreateFontW(12, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE,
ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY, ANSI_CHARSET, OUT_DEFAULT_PRECIS,
DEFAULT_PITCH , L"Ms Shell Dlg"); CLIP_DEFAULT_PRECIS, PROOF_QUALITY,
DEFAULT_PITCH , L"Ms Shell Dlg");
/* Set the window's GWLP_USERDATA to our data structure */ Display_SetString(hwnd, (LPARAM)L"Jackdaws love my big sphinx of quartz. 1234567890");
SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)pData); Display_SetTypeFace(hwnd, (LPARAM)L"Ms Shell Dlg");
return 0; return 0;
} }
@ -196,7 +264,7 @@ Display_OnPaint(HWND hwnd)
BeginPaint(hwnd, &ps); BeginPaint(hwnd, &ps);
/* Fill with white */ /* Erase background */
FillRect(ps.hdc, &ps.rcPaint, GetStockObject(WHITE_BRUSH)); FillRect(ps.hdc, &ps.rcPaint, GetStockObject(WHITE_BRUSH));
/* Draw the text */ /* Draw the text */
@ -216,7 +284,7 @@ Display_OnSize(HWND hwnd)
GetClientRect(hwnd, &rect); GetClientRect(hwnd, &rect);
/* Get the old pos */ /* Get the old scroll pos */
si.cbSize = sizeof(si); si.cbSize = sizeof(si);
si.fMask = SIF_POS; si.fMask = SIF_POS;
GetScrollInfo(hwnd, SB_VERT, &si); GetScrollInfo(hwnd, SB_VERT, &si);
@ -227,15 +295,15 @@ Display_OnSize(HWND hwnd)
si.nPage = rect.bottom; si.nPage = rect.bottom;
SetScrollInfo(hwnd, SB_VERT, &si, TRUE); SetScrollInfo(hwnd, SB_VERT, &si, TRUE);
/* Get the new pos */ /* Get the new scroll pos */
si.fMask = SIF_POS; si.fMask = SIF_POS;
GetScrollInfo(hwnd, SB_VERT, &si); GetScrollInfo(hwnd, SB_VERT, &si);
/* If the don't match ... */ /* If they don't match ... */
if (nOldPos != si.nPos) if (nOldPos != si.nPos)
{ {
/* ... scroll the window */ /* ... 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); UpdateWindow(hwnd);
} }
@ -278,7 +346,7 @@ Display_OnVScroll(HWND hwnd, WPARAM wParam)
nPos = min(nPos, si.nMax); nPos = min(nPos, si.nMax);
if (nPos != si.nPos) 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.cbSize = sizeof(si);
si.nPos = nPos; si.nPos = nPos;
si.fMask = SIF_POS; si.fMask = SIF_POS;
@ -289,75 +357,6 @@ Display_OnVScroll(HWND hwnd, WPARAM wParam)
return 0; 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 static LRESULT
Display_OnDestroy(HWND hwnd) Display_OnDestroy(HWND hwnd)
{ {
@ -385,8 +384,8 @@ Display_OnDestroy(HWND hwnd)
LRESULT CALLBACK LRESULT CALLBACK
DisplayProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) DisplayProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{ {
switch (message) switch (message)
{ {
case WM_CREATE: case WM_CREATE:
return Display_OnCreate(hwnd); return Display_OnCreate(hwnd);
@ -405,13 +404,13 @@ DisplayProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
case FVM_SETSTRING: case FVM_SETSTRING:
return Display_SetString(hwnd, lParam); return Display_SetString(hwnd, lParam);
case WM_DESTROY: case WM_DESTROY:
return Display_OnDestroy(hwnd); return Display_OnDestroy(hwnd);
default: default:
return DefWindowProcW(hwnd, message, wParam, lParam); return DefWindowProcW(hwnd, message, wParam, lParam);
} }
return 0; return 0;
} }

View file

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