You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
560 lines
12 KiB
560 lines
12 KiB
//// window.cpp
|
|
//
|
|
// Maintains the text display panel
|
|
|
|
|
|
|
|
#include "precomp.hpp"
|
|
#include "global.h"
|
|
#include "winspool.h"
|
|
#include <Tchar.h>
|
|
#include "commdlg.h"
|
|
|
|
|
|
INT GetTotalPageCount()
|
|
{
|
|
return FamilyTest().GetPageCount()
|
|
+ FormatTest().GetPageCount()
|
|
+ BrushTest().GetPageCount();
|
|
}
|
|
|
|
|
|
|
|
void DrawTestPage(Graphics *graphics, INT page, REAL width, REAL height)
|
|
{
|
|
if (page < FamilyTest().GetPageCount())
|
|
{
|
|
FamilyTest().DrawPage(
|
|
graphics,
|
|
page,
|
|
width,
|
|
height
|
|
);
|
|
}
|
|
else
|
|
{
|
|
page -= FamilyTest().GetPageCount();
|
|
|
|
if (page < BrushTest().GetPageCount())
|
|
{
|
|
BrushTest().DrawPage(
|
|
graphics,
|
|
page,
|
|
width,
|
|
height
|
|
);
|
|
}
|
|
else
|
|
{
|
|
page -= BrushTest().GetPageCount();
|
|
|
|
if (page < FormatTest().GetPageCount())
|
|
{
|
|
FormatTest().DrawPage(
|
|
graphics,
|
|
page,
|
|
width,
|
|
height
|
|
);
|
|
}
|
|
else
|
|
{
|
|
page -= FormatTest().GetPageCount();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
//// Print tests
|
|
//
|
|
//
|
|
|
|
|
|
HDC StartPrintDoc(DWORD flags)
|
|
{
|
|
PRINTDLG printDialog;
|
|
|
|
memset(&printDialog, 0, sizeof(printDialog));
|
|
|
|
printDialog.lStructSize = sizeof(printDialog);
|
|
printDialog.Flags = flags | PD_RETURNDC | PD_NOPAGENUMS | PD_NOSELECTION ;
|
|
|
|
if (PrintDlg(&printDialog))
|
|
{
|
|
HDC dc = printDialog.hDC;
|
|
|
|
DEVMODE * dv;
|
|
|
|
dv = (DEVMODE *) GlobalLock(printDialog.hDevMode);
|
|
|
|
if (G.PSLevel2)
|
|
OpenPrinter((LPSTR) &dv->dmDeviceName[0], &G.ghPrinter, NULL);
|
|
|
|
if (dc != NULL)
|
|
{
|
|
DOCINFO documentInfo;
|
|
documentInfo.cbSize = sizeof(documentInfo);
|
|
documentInfo.lpszDocName = _T("autoText gdiPlus test");
|
|
documentInfo.lpszOutput = NULL;
|
|
documentInfo.lpszDatatype = NULL;
|
|
documentInfo.fwType = 0;
|
|
|
|
if (StartDoc(dc, &documentInfo))
|
|
{
|
|
return dc;
|
|
}
|
|
else
|
|
{
|
|
DeleteDC(dc);
|
|
}
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
void PrintAllTests()
|
|
{
|
|
HDC dc = StartPrintDoc(0);
|
|
|
|
if (dc)
|
|
{
|
|
INT page = 0;
|
|
INT pageCount = GetTotalPageCount();
|
|
|
|
while (page < pageCount)
|
|
{
|
|
if (StartPage(dc) > 0)
|
|
{
|
|
HANDLE h = 0;
|
|
|
|
if (G.PSLevel2)
|
|
h = G.ghPrinter;
|
|
|
|
Graphics graphics(dc, h);
|
|
|
|
graphics.SetPageUnit(UnitPixel);
|
|
DrawTestPage(
|
|
&graphics,
|
|
page,
|
|
REAL(GetDeviceCaps(dc, HORZRES)),
|
|
REAL(GetDeviceCaps(dc, VERTRES))
|
|
);
|
|
EndPage(dc);
|
|
}
|
|
|
|
page++;
|
|
}
|
|
|
|
EndDoc(dc);
|
|
DeleteDC(dc);
|
|
|
|
if (G.PSLevel2)
|
|
{
|
|
ClosePrinter(G.ghPrinter);
|
|
G.ghPrinter = 0;
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void PrintTest(INT pageNumber)
|
|
{
|
|
HDC dc = StartPrintDoc(0);
|
|
|
|
if (dc)
|
|
{
|
|
if (StartPage(dc) > 0)
|
|
{
|
|
HANDLE h = 0;
|
|
|
|
if (G.PSLevel2)
|
|
h = G.ghPrinter;
|
|
|
|
Graphics graphics(dc, h);
|
|
|
|
graphics.SetPageUnit(UnitPixel);
|
|
DrawTestPage(
|
|
&graphics,
|
|
pageNumber,
|
|
REAL(GetDeviceCaps(dc, HORZRES)),
|
|
REAL(GetDeviceCaps(dc, VERTRES))
|
|
);
|
|
EndPage(dc);
|
|
}
|
|
EndDoc(dc);
|
|
DeleteDC(dc);
|
|
|
|
if (G.PSLevel2)
|
|
{
|
|
ClosePrinter(G.ghPrinter);
|
|
G.ghPrinter = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void PrintFirstPages(DWORD flags)
|
|
{
|
|
HDC dc = StartPrintDoc(flags);
|
|
|
|
if (dc)
|
|
{
|
|
HANDLE h = 0;
|
|
|
|
if (G.PSLevel2)
|
|
h = G.ghPrinter;
|
|
|
|
Graphics graphics(dc, h);
|
|
|
|
graphics.SetPageUnit(UnitPixel);
|
|
|
|
if (StartPage(dc) > 0)
|
|
{
|
|
DrawTestPage(
|
|
&graphics,
|
|
0,
|
|
REAL(GetDeviceCaps(dc, HORZRES)),
|
|
REAL(GetDeviceCaps(dc, VERTRES))
|
|
);
|
|
EndPage(dc);
|
|
}
|
|
|
|
if (StartPage(dc) > 0)
|
|
{
|
|
DrawTestPage(
|
|
&graphics,
|
|
FamilyTest().GetPageCount(),
|
|
REAL(GetDeviceCaps(dc, HORZRES)),
|
|
REAL(GetDeviceCaps(dc, VERTRES))
|
|
);
|
|
EndPage(dc);
|
|
}
|
|
|
|
if (StartPage(dc) > 0)
|
|
{
|
|
DrawTestPage(
|
|
&graphics,
|
|
FamilyTest().GetPageCount()
|
|
+ FormatTest().GetPageCount(),
|
|
REAL(GetDeviceCaps(dc, HORZRES)),
|
|
REAL(GetDeviceCaps(dc, VERTRES))
|
|
);
|
|
EndPage(dc);
|
|
}
|
|
|
|
EndDoc(dc);
|
|
DeleteDC(dc);
|
|
|
|
if (G.PSLevel2)
|
|
{
|
|
ClosePrinter(G.ghPrinter);
|
|
G.ghPrinter = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
//// Paint - redraw part or all of client area
|
|
//
|
|
//
|
|
|
|
|
|
void PaintWindow(HWND hWnd) {
|
|
|
|
PAINTSTRUCT ps;
|
|
HDC hdc;
|
|
|
|
hdc = BeginPaint(hWnd, &ps);
|
|
|
|
Graphics graphics(hdc);
|
|
|
|
RectF clip(
|
|
REAL(ps.rcPaint.left),
|
|
REAL(ps.rcPaint.top),
|
|
REAL(ps.rcPaint.right-ps.rcPaint.left),
|
|
REAL(ps.rcPaint.bottom-ps.rcPaint.top)
|
|
);
|
|
|
|
if (ps.fErase)
|
|
{
|
|
graphics.FillRectangle(
|
|
&SolidBrush(Color(0xff, 0xff, 0xff)),
|
|
clip
|
|
);
|
|
}
|
|
|
|
RECT rcWnd;
|
|
GetClientRect(hWnd, &rcWnd);
|
|
|
|
if (G.RunAllTests)
|
|
{
|
|
for (INT i=0; i<GetTotalPageCount(); i++)
|
|
{
|
|
G.TestPage = i;
|
|
DrawTestPage(
|
|
&graphics,
|
|
G.TestPage,
|
|
REAL(rcWnd.right - rcWnd.left),
|
|
REAL(rcWnd.bottom - rcWnd.top)
|
|
);
|
|
|
|
graphics.FillRectangle(
|
|
&SolidBrush(Color(0xff, 0xff, 0xff)),
|
|
RectF(
|
|
REAL(rcWnd.left),
|
|
REAL(rcWnd.top),
|
|
REAL(rcWnd.right-ps.rcPaint.left),
|
|
REAL(rcWnd.bottom-ps.rcPaint.top)
|
|
)
|
|
);
|
|
}
|
|
G.RunAllTests = FALSE;
|
|
}
|
|
else
|
|
{
|
|
DrawTestPage(
|
|
&graphics,
|
|
G.TestPage,
|
|
REAL(rcWnd.right - rcWnd.left),
|
|
REAL(rcWnd.bottom - rcWnd.top)
|
|
);
|
|
}
|
|
|
|
EndPaint(hWnd, &ps);
|
|
|
|
|
|
|
|
if (G.AutoPrintRegress)
|
|
{
|
|
PrintFirstPages(PD_RETURNDEFAULT);
|
|
}
|
|
|
|
|
|
|
|
if ( G.AutoDisplayRegress
|
|
|| G.AutoPrintRegress)
|
|
{
|
|
SendMessage(hWnd, WM_CLOSE, 0, 0);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
//// TextWndProc - Main window message handler and dispatcher
|
|
//
|
|
//
|
|
|
|
|
|
LRESULT CALLBACK TextWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
|
|
|
|
HDC hdc;
|
|
|
|
switch (message) {
|
|
|
|
case WM_ERASEBKGND:
|
|
return 0; // Leave Paint to erase the background
|
|
|
|
|
|
case WM_PAINT:
|
|
PaintWindow(hWnd);
|
|
break;
|
|
|
|
|
|
case WM_DESTROY:
|
|
PostQuitMessage(0);
|
|
return 0;
|
|
|
|
|
|
case WM_COMMAND:
|
|
//INT command = LOWORD(wParam);
|
|
//INT notify = HIWORD(wParam);
|
|
//HWND item = HWND(lParam);
|
|
switch (LOWORD(wParam))
|
|
{
|
|
case ID_NEXT_TEST:
|
|
G.TestPage++;
|
|
if (G.TestPage >= GetTotalPageCount())
|
|
{
|
|
G.TestPage = 0;
|
|
}
|
|
InvalidateRect(hWnd, NULL, TRUE);
|
|
break;
|
|
|
|
case ID_PREV_TEST:
|
|
G.TestPage--;
|
|
if (G.TestPage < 0)
|
|
{
|
|
G.TestPage = GetTotalPageCount()-1;
|
|
}
|
|
InvalidateRect(hWnd, NULL, TRUE);
|
|
break;
|
|
|
|
case ID_PS_LEVEL1:
|
|
G.PSLevel2 = FALSE;
|
|
break;
|
|
|
|
case ID_PS_LEVEL2:
|
|
G.PSLevel2 = TRUE;
|
|
break;
|
|
|
|
case ID_FIRST_FAMILY:
|
|
G.TestPage = 0;
|
|
InvalidateRect(hWnd, NULL, TRUE);
|
|
break;
|
|
|
|
case ID_FIRST_BRUSH:
|
|
G.TestPage = FamilyTest().GetPageCount();
|
|
InvalidateRect(hWnd, NULL, TRUE);
|
|
break;
|
|
|
|
case ID_FIRST_FORMAT:
|
|
G.TestPage = FamilyTest().GetPageCount() + BrushTest().GetPageCount();
|
|
InvalidateRect(hWnd, NULL, TRUE);
|
|
break;
|
|
|
|
case ID_FILE_REGRESS:
|
|
G.TestPage = 0;
|
|
G.RunAllTests = TRUE;
|
|
InvalidateRect(hWnd, NULL, TRUE);
|
|
break;
|
|
|
|
case ID_FILE_PRINT_CURRENT_TEST:
|
|
PrintTest(G.TestPage);
|
|
break;
|
|
|
|
case ID_FILE_PRINT_FIRST_PAGE:
|
|
PrintFirstPages(0);
|
|
break;
|
|
|
|
case ID_FILE_PRINTALLTESTS:
|
|
PrintAllTests();
|
|
break;
|
|
|
|
case IDM_EXIT:
|
|
SendMessage(hWnd, WM_CLOSE, 0, 0);
|
|
break;
|
|
}
|
|
|
|
// Validate current test page number
|
|
|
|
if (G.TestPage < 0)
|
|
{
|
|
G.TestPage = 0;
|
|
}
|
|
else
|
|
{
|
|
if (G.TestPage >= GetTotalPageCount())
|
|
{
|
|
G.TestPage = GetTotalPageCount()-1;
|
|
}
|
|
}
|
|
return 0;
|
|
|
|
|
|
default:
|
|
if (G.Unicode) {
|
|
return DefWindowProcW(hWnd, message, wParam, lParam);
|
|
} else {
|
|
return DefWindowProcA(hWnd, message, wParam, lParam);
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//// CreateTextWindow - create window class and window
|
|
//
|
|
// Attempts to use a Unicode window, if this fails uses an ANSI
|
|
// window.
|
|
//
|
|
// For example the Unicode window will succeed on Windows NT and
|
|
// Windows CE, but fail on Windows 9x.
|
|
|
|
|
|
HWND CreateTextWindow() {
|
|
|
|
WNDCLASSA wcA;
|
|
WNDCLASSW wcW;
|
|
HWND hWnd;
|
|
|
|
// Try registering as a Unicode window
|
|
|
|
wcW.style = CS_HREDRAW | CS_VREDRAW;
|
|
wcW.lpfnWndProc = TextWndProc;
|
|
wcW.cbClsExtra = 0;
|
|
wcW.cbWndExtra = 0;
|
|
wcW.hInstance = G.Instance;
|
|
wcW.hIcon = LoadIconW(G.Instance, APPNAMEW);
|
|
wcW.hCursor = LoadCursorW(NULL, (WCHAR*)IDC_ARROW);
|
|
wcW.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
|
|
wcW.lpszMenuName = L"MAINMENU";
|
|
wcW.lpszClassName = APPNAMEW;
|
|
|
|
if (RegisterClassW(&wcW)) {
|
|
|
|
// Use a Unicode window
|
|
|
|
G.Unicode = TRUE;
|
|
|
|
hWnd = CreateWindowW(
|
|
APPNAMEW, APPTITLEW,
|
|
WS_OVERLAPPEDWINDOW,
|
|
CW_USEDEFAULT, 0,
|
|
CW_USEDEFAULT, 0,
|
|
NULL, NULL,
|
|
G.Instance,
|
|
NULL);
|
|
|
|
|
|
return hWnd;
|
|
|
|
} else {
|
|
|
|
// Must use an ANSI window.
|
|
|
|
wcA.style = CS_HREDRAW | CS_VREDRAW;
|
|
wcA.lpfnWndProc = TextWndProc;
|
|
wcA.cbClsExtra = 0;
|
|
wcA.cbWndExtra = 0;
|
|
wcA.hInstance = G.Instance;
|
|
wcA.hIcon = LoadIconA(G.Instance, APPNAMEA);
|
|
wcA.hCursor = LoadCursor(NULL, IDC_ARROW);
|
|
wcA.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
|
|
wcA.lpszMenuName = "MAINMENU";
|
|
wcA.lpszClassName = APPNAMEA;
|
|
|
|
if (!RegisterClassA(&wcA)) {
|
|
return NULL;
|
|
}
|
|
|
|
G.Unicode = FALSE;
|
|
|
|
hWnd = CreateWindowA(
|
|
APPNAMEA, APPTITLEA,
|
|
WS_OVERLAPPEDWINDOW,
|
|
CW_USEDEFAULT, 0,
|
|
CW_USEDEFAULT, 0,
|
|
NULL, NULL,
|
|
G.Instance,
|
|
NULL);
|
|
};
|
|
|
|
|
|
return hWnd;
|
|
}
|