apply missing part of wordpad manual winesync

svn path=/trunk/; revision=32037
This commit is contained in:
Sylvain Petreolle 2008-01-28 17:51:00 +00:00
parent c0808d2c1c
commit 848daa0d10

View file

@ -1,7 +1,7 @@
/* /*
* Wordpad implementation - Printing and print preview functions * Wordpad implementation - Printing and print preview functions
* *
* Copyright 2007 by Alexander N. Sørnes <alex@thehandofagony.com> * Copyright 2007-2008 by Alexander N. Sørnes <alex@thehandofagony.com>
* *
* This library is free software; you can redistribute it and/or * This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public * modify it under the terms of the GNU Lesser General Public
@ -130,23 +130,23 @@ static HDC make_dc(void)
static LONG twips_to_centmm(int twips) static LONG twips_to_centmm(int twips)
{ {
return MulDiv(twips, 1000, 567); return MulDiv(twips, 1000, TWIPS_PER_CM);
} }
LONG centmm_to_twips(int mm) LONG centmm_to_twips(int mm)
{ {
return MulDiv(mm, 567, 1000); return MulDiv(mm, TWIPS_PER_CM, 1000);
} }
static LONG twips_to_pixels(int twips, int dpi) static LONG twips_to_pixels(int twips, int dpi)
{ {
float ret = ((float)twips / ((float)567 * 2.54)) * (float)dpi; float ret = ((float)twips / ((float)TWIPS_PER_CM * 2.54)) * (float)dpi;
return (LONG)ret; return (LONG)ret;
} }
static LONG devunits_to_twips(int units, int dpi) static LONG devunits_to_twips(int units, int dpi)
{ {
float ret = ((float)units / (float)dpi) * (float)567 * 2.54; float ret = ((float)units / (float)dpi) * (float)TWIPS_PER_CM * 2.54;
return (LONG)ret; return (LONG)ret;
} }
@ -254,6 +254,25 @@ static void char_from_pagenum(HWND hEditorWnd, FORMATRANGE *fr, int page)
} }
} }
static HWND get_ruler_wnd(HWND hMainWnd)
{
return GetDlgItem(GetDlgItem(hMainWnd, IDC_REBAR), IDC_RULER);
}
void redraw_ruler(HWND hRulerWnd)
{
RECT rc;
GetClientRect(hRulerWnd, &rc);
InvalidateRect(hRulerWnd, &rc, TRUE);
}
static void update_ruler(HWND hRulerWnd)
{
SendMessageW(hRulerWnd, WM_USER, 0, 0);
redraw_ruler(hRulerWnd);
}
static void print(LPPRINTDLGW pd, LPWSTR wszFileName) static void print(LPPRINTDLGW pd, LPWSTR wszFileName)
{ {
FORMATRANGE fr; FORMATRANGE fr;
@ -340,6 +359,7 @@ void dialog_printsetup(HWND hMainWnd)
margins.bottom = centmm_to_twips(ps.rtMargin.bottom); margins.bottom = centmm_to_twips(ps.rtMargin.bottom);
devMode = ps.hDevMode; devMode = ps.hDevMode;
devNames = ps.hDevNames; devNames = ps.hDevNames;
update_ruler(get_ruler_wnd(hMainWnd));
} }
} }
@ -394,6 +414,7 @@ void dialog_print(HWND hMainWnd, LPWSTR wszFileName)
devMode = pd.hDevMode; devMode = pd.hDevMode;
devNames = pd.hDevNames; devNames = pd.hDevNames;
print(&pd, wszFileName); print(&pd, wszFileName);
update_ruler(get_ruler_wnd(hMainWnd));
} }
} }
@ -456,6 +477,145 @@ BOOL preview_isactive(void)
return preview.page != 0; return preview.page != 0;
} }
static void add_ruler_units(HDC hdcRuler, RECT* drawRect, BOOL NewMetrics, long EditLeftmost)
{
static HDC hdc;
if(NewMetrics)
{
static HBITMAP hBitmap;
int i, x, y, RulerTextEnd;
int CmPixels;
int QuarterCmPixels;
HFONT hFont;
WCHAR FontName[] = {'M','S',' ','S','a','n','s',' ','S','e','r','i','f',0};
if(hdc)
{
DeleteDC(hdc);
DeleteObject(hBitmap);
}
hdc = CreateCompatibleDC(hdc);
CmPixels = twips_to_pixels(TWIPS_PER_CM, GetDeviceCaps(hdc, LOGPIXELSX));
QuarterCmPixels = (int)((float)CmPixels / 4.0);
hBitmap = CreateCompatibleBitmap(hdc, drawRect->right, drawRect->bottom);
SelectObject(hdc, hBitmap);
FillRect(hdc, drawRect, GetStockObject(WHITE_BRUSH));
hFont = CreateFontW(10, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, FontName);
SelectObject(hdc, hFont);
SetBkMode(hdc, TRANSPARENT);
SetTextAlign(hdc, TA_CENTER);
y = (int)(((float)drawRect->bottom - (float)drawRect->top) / 2.0) + 1;
RulerTextEnd = drawRect->right - EditLeftmost + 1;
for(i = 1, x = EditLeftmost; x < (drawRect->right - EditLeftmost + 1); i ++)
{
WCHAR str[3];
WCHAR format[] = {'%','d',0};
int x2 = x;
x2 += QuarterCmPixels;
if(x2 > RulerTextEnd)
break;
MoveToEx(hdc, x2, y, NULL);
LineTo(hdc, x2, y+2);
x2 += QuarterCmPixels;
if(x2 > RulerTextEnd)
break;
MoveToEx(hdc, x2, y - 3, NULL);
LineTo(hdc, x2, y + 3);
x2 += QuarterCmPixels;
if(x2 > RulerTextEnd)
break;
MoveToEx(hdc, x2, y, NULL);
LineTo(hdc, x2, y+2);
x += CmPixels;
if(x > RulerTextEnd)
break;
wsprintfW(str, format, i);
TextOutW(hdc, x, 5, str, lstrlenW(str));
}
DeleteObject(hFont);
}
BitBlt(hdcRuler, 0, 0, drawRect->right, drawRect->bottom, hdc, 0, 0, SRCAND);
}
static void paint_ruler(HWND hWnd, long EditLeftmost, BOOL NewMetrics)
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
HDC hdcPrint = make_dc();
RECT printRect = get_print_rect(hdcPrint);
RECT drawRect;
HBRUSH hBrush = CreateSolidBrush(GetSysColor(COLOR_MENU));
GetClientRect(hWnd, &drawRect);
FillRect(hdc, &drawRect, hBrush);
drawRect.top += 3;
drawRect.bottom -= 3;
drawRect.left = EditLeftmost;
drawRect.right = twips_to_pixels(printRect.right - margins.left, GetDeviceCaps(hdc, LOGPIXELSX));
FillRect(hdc, &drawRect, GetStockObject(WHITE_BRUSH));
drawRect.top--;
drawRect.bottom++;
DrawEdge(hdc, &drawRect, EDGE_SUNKEN, BF_RECT);
drawRect.left = drawRect.right - 1;
drawRect.right = twips_to_pixels(printRect.right + margins.right - margins.left, GetDeviceCaps(hdc, LOGPIXELSX));
DrawEdge(hdc, &drawRect, EDGE_ETCHED, BF_RECT);
drawRect.left = 0;
drawRect.top = 0;
add_ruler_units(hdc, &drawRect, NewMetrics, EditLeftmost);
SelectObject(hdc, GetStockObject(BLACK_BRUSH));
DeleteObject(hBrush);
DeleteDC(hdcPrint);
EndPaint(hWnd, &ps);
}
LRESULT CALLBACK ruler_proc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
static WNDPROC pPrevRulerProc;
static long EditLeftmost;
static BOOL NewMetrics;
switch(msg)
{
case WM_USER:
if(wParam)
{
EditLeftmost = ((POINTL*)wParam)->x;
pPrevRulerProc = (WNDPROC)lParam;
}
NewMetrics = TRUE;
break;
case WM_PAINT:
paint_ruler(hWnd, EditLeftmost, NewMetrics);
break;
default:
return CallWindowProcW(pPrevRulerProc, hWnd, msg, wParam, lParam);
}
return 0;
}
LRESULT print_preview(HWND hMainWnd) LRESULT print_preview(HWND hMainWnd)
{ {
FORMATRANGE fr; FORMATRANGE fr;