Windows2003-3790/windows/advcore/gdiplus/test/pathtest/wndstuff.cpp
2020-09-30 16:53:55 +02:00

491 lines
15 KiB
C++

/******************************Module*Header*******************************\
* Module Name: wndstuff.cpp
*
* This file contains the code to support a simple window that has
* a menu with a single item called "Test". When "Test" is selected
* vTest(HWND) is called.
*
* Created: 09-Dec-1992 10:44:31
* Author: Kirk Olynyk [kirko]
*
* Copyright (c) 1991 Microsoft Corporation
*
\**************************************************************************/
// for Win95 compile
#undef UNICODE
#undef _UNICODE
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <objbase.h>
#include <commdlg.h>
#include "wndstuff.h"
#include "../gpinit.inc"
HINSTANCE ghInstance;
HWND ghwndMain;
HWND ghwndDebug;
HWND ghwndList;
HBRUSH ghbrWhite;
bool buttondown = false;
float flatness = 0.25f;
PtFlag ifs(INT f, PtFlag v)
{
return f ? v : PtNoFlag;
}
PtFlag CalcFlags(HWND hwnd)
{
return (PtFlag)(
ifs(GetMenuState(GetMenu(hwnd), MM_BEZIERMODE, MF_BYCOMMAND) & MF_CHECKED, PtBezierFlag) |
ifs(GetMenuState(GetMenu(hwnd), MM_OBEFOREMODE, MF_BYCOMMAND) & MF_CHECKED, PtOutlineBeforeFlag) |
ifs(GetMenuState(GetMenu(hwnd), MM_OAFTERMODE, MF_BYCOMMAND) & MF_CHECKED, PtOutlineAfterFlag) |
ifs(GetMenuState(GetMenu(hwnd), MM_SHOWDASHSTROKE, MF_BYCOMMAND) & MF_CHECKED, PtDashPatternFlag) |
ifs(GetMenuState(GetMenu(hwnd), MM_SHOWHATCHBRUSHSTROKE, MF_BYCOMMAND) & MF_CHECKED, PtHatchBrushFlag) |
ifs(GetMenuState(GetMenu(hwnd), MM_SHOWTEXTUREFILL, MF_BYCOMMAND) & MF_CHECKED, PtTextureFillFlag) |
ifs(GetMenuState(GetMenu(hwnd), MM_SHOWTRANSSOLIDFILL, MF_BYCOMMAND) & MF_CHECKED, PtTransSolidFillFlag) |
ifs(GetMenuState(GetMenu(hwnd), MM_SHOWTRANSGRADFILL, MF_BYCOMMAND) & MF_CHECKED, PtTransGradFillFlag) |
ifs(GetMenuState(GetMenu(hwnd), MM_SHOWBGGRADFILL, MF_BYCOMMAND) & MF_CHECKED, PTBackgroundGradFillFlag));}
void HandleCheckUncheck(INT flag, HWND hwnd)
{
if (GetMenuState(GetMenu(hwnd), flag, MF_BYCOMMAND) & MF_CHECKED)
CheckMenuItem(GetMenu(hwnd), flag, MF_UNCHECKED);
else
CheckMenuItem(GetMenu(hwnd), flag, MF_CHECKED);
InvalidateRect(hwnd, NULL, false);
}
/***************************************************************************\
* lMainWindowProc(hwnd, message, wParam, lParam)
*
* Processes all messages for the main window.
*
* History:
* 04-07-91 -by- KentD
* Wrote it.
\***************************************************************************/
LRESULT CALLBACK
lMainWindowProc(
HWND hwnd,
UINT message,
WPARAM wParam,
LPARAM lParam
)
{
INT xpos, ypos;
switch (message)
{
case WM_CREATE:
return true;
case WM_SIZE:
xpos = LOWORD(lParam);
ypos = HIWORD(lParam);
Resize(xpos, ypos);
InvalidateRect(hwnd, NULL, false);
return true;
case WM_LBUTTONDOWN:
buttondown = true;
return true;
case WM_LBUTTONUP:
if (!buttondown)
break;
buttondown = false;
xpos = LOWORD(lParam);
ypos = HIWORD(lParam);
RECT rect;
GetClientRect(hwnd, &rect);
AddPoint(xpos, ypos);
InvalidateRect(hwnd, NULL, false);
return true;
case WM_COMMAND: {
INT flag = LOWORD(wParam);
switch(flag)
{
case MM_SHOWDASHSTROKE:
HandleCheckUncheck(flag, hwnd);
return true;
case MM_SHOWHATCHBRUSHSTROKE:
HandleCheckUncheck(flag, hwnd);
return true;
case MM_SHOWTEXTUREFILL:
HandleCheckUncheck(flag, hwnd);
return true;
case MM_SHOWTRANSSOLIDFILL:
HandleCheckUncheck(flag, hwnd);
return true;
case MM_SHOWTRANSGRADFILL:
HandleCheckUncheck(flag, hwnd);
return true;
case MM_SHOWBGGRADFILL:
HandleCheckUncheck(flag, hwnd);
return true;
case MM_CHANGETEXTUREFILL: {
OPENFILENAME ofn; // common dialog box structure
char szFile[260]; // buffer for file name
szFile[0] = 0;
ZeroMemory(&ofn, sizeof(OPENFILENAME));
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = hwnd;
ofn.lpstrFile = szFile;
ofn.nMaxFile = sizeof(szFile);
ofn.lpstrFilter = "Images\0*.*\0";
ofn.nFilterIndex = 0;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = NULL;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
char curdir[260];
GetCurrentDirectory(sizeof(curdir), curdir);
if (GetOpenFileName(&ofn)==TRUE)
{
WCHAR wchar[256];
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, ofn.lpstrFile, -1, wchar, 256);
ChangeTexture(wchar);
SetCurrentDirectory(curdir);
InvalidateRect(hwnd, NULL, false);
}
else
{
printf("%d", CommDlgExtendedError());
}
return true;}
case MM_OPENFILE: {
OPENFILENAME ofn; // common dialog box structure
char szFile[260]; // buffer for file name
szFile[0] = 0;
ZeroMemory(&ofn, sizeof(OPENFILENAME));
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = hwnd;
ofn.lpstrFile = szFile;
ofn.nMaxFile = sizeof(szFile);
ofn.lpstrFilter = "All\0*.*\0Text\0*.TXT\0";
ofn.nFilterIndex = 1;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = NULL;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
char curdir[260];
GetCurrentDirectory(sizeof(curdir), curdir);
if (GetOpenFileName(&ofn)==TRUE)
{
OpenPath(ofn.lpstrFile);
SetCurrentDirectory(curdir);
InvalidateRect(hwnd, NULL, false);
}
else
{
printf("%d", CommDlgExtendedError());
}
return true;}
case MM_SAVEFILE: {
OPENFILENAME ofn; // common dialog box structure
char szFile[260]; // buffer for file name
szFile[0] = 0;
ZeroMemory(&ofn, sizeof(OPENFILENAME));
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = hwnd;
ofn.lpstrFile = szFile;
ofn.nMaxFile = sizeof(szFile);
ofn.lpstrFilter = "All\0*.*\0Text\0*.TXT\0";
ofn.nFilterIndex = 1;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = NULL;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_OVERWRITEPROMPT;
char curdir[260];
GetCurrentDirectory(sizeof(curdir), curdir);
if (GetOpenFileName(&ofn)==TRUE)
{
SavePath(ofn.lpstrFile);
SetCurrentDirectory(curdir);
InvalidateRect(hwnd, NULL, false);
}
else
{
printf("%d", CommDlgExtendedError());
}
return true;}
case MM_PRINT:
Print(hwnd, flatness, CalcFlags(hwnd));
return true;
case MM_CLOSEPATH:
ClosePath();
InvalidateRect(hwnd, NULL, false);
return true;
case MM_CLEARPATH:
ClearPath();
InvalidateRect(hwnd, NULL, false);
return true;
case MM_USEASCLIPPATH: {
ClipPath(CalcFlags(hwnd) & PtBezierFlag);
InvalidateRect(hwnd, NULL, false);
return true;}
case MM_CLEARCLIPPATH:
ClearClipPath();
InvalidateRect(hwnd, NULL, false);
return true;
case MM_LINEMODE:
CheckMenuItem(GetMenu(hwnd), MM_LINEMODE, MF_CHECKED);
CheckMenuItem(GetMenu(hwnd), MM_BEZIERMODE, MF_UNCHECKED);
InvalidateRect(hwnd, NULL, false);
return true;
case MM_BEZIERMODE:
CheckMenuItem(GetMenu(hwnd), MM_LINEMODE, MF_UNCHECKED);
CheckMenuItem(GetMenu(hwnd), MM_BEZIERMODE, MF_CHECKED);
InvalidateRect(hwnd, NULL, false);
return true;
case MM_OBEFOREMODE:
if (GetMenuState(GetMenu(hwnd), MM_OBEFOREMODE, MF_BYCOMMAND) & MF_CHECKED)
CheckMenuItem(GetMenu(hwnd), MM_OBEFOREMODE, MF_UNCHECKED);
else
CheckMenuItem(GetMenu(hwnd), MM_OBEFOREMODE, MF_CHECKED);
InvalidateRect(hwnd, NULL, false);
return true;
case MM_OAFTERMODE:
if (GetMenuState(GetMenu(hwnd), MM_OAFTERMODE, MF_BYCOMMAND) & MF_CHECKED)
CheckMenuItem(GetMenu(hwnd), MM_OAFTERMODE, MF_UNCHECKED);
else
CheckMenuItem(GetMenu(hwnd), MM_OAFTERMODE, MF_CHECKED);
InvalidateRect(hwnd, NULL, false);
return true;
case MM_FLATNESS_1:
case MM_FLATNESS_2:
case MM_FLATNESS_3:
case MM_FLATNESS_4: {
CheckMenuItem(GetMenu(hwnd), MM_FLATNESS_1, MF_UNCHECKED);
CheckMenuItem(GetMenu(hwnd), MM_FLATNESS_2, MF_UNCHECKED);
CheckMenuItem(GetMenu(hwnd), MM_FLATNESS_3, MF_UNCHECKED);
CheckMenuItem(GetMenu(hwnd), MM_FLATNESS_4, MF_UNCHECKED);
InvalidateRect(hwnd, NULL, false);
switch (LOWORD(wParam))
{
case MM_FLATNESS_1:
flatness = 10.0f;
CheckMenuItem(GetMenu(hwnd), MM_FLATNESS_1, MF_CHECKED);
return true;
case MM_FLATNESS_2:
flatness = 1.0f;
CheckMenuItem(GetMenu(hwnd), MM_FLATNESS_2, MF_CHECKED);
return true;
case MM_FLATNESS_3:
flatness = 0.25f;
CheckMenuItem(GetMenu(hwnd), MM_FLATNESS_3, MF_CHECKED);
return true;
case MM_FLATNESS_4:
flatness = 0.1f;
CheckMenuItem(GetMenu(hwnd), MM_FLATNESS_4, MF_CHECKED);
return true;
}
}
case MM_COLORMODE_NOCHANGE:
CheckMenuItem(GetMenu(hwnd), MM_COLORMODE_NOCHANGE, MF_CHECKED);
CheckMenuItem(GetMenu(hwnd), MM_COLORMODE_TRANS50, MF_UNCHECKED);
CheckMenuItem(GetMenu(hwnd), MM_COLORMODE_GRADTRANS, MF_UNCHECKED);
SetColorMode(0);
InvalidateRect(hwnd, NULL, false);
return true;
case MM_COLORMODE_TRANS50:
CheckMenuItem(GetMenu(hwnd), MM_COLORMODE_NOCHANGE, MF_UNCHECKED);
CheckMenuItem(GetMenu(hwnd), MM_COLORMODE_TRANS50, MF_CHECKED);
CheckMenuItem(GetMenu(hwnd), MM_COLORMODE_GRADTRANS, MF_UNCHECKED);
SetColorMode(1);
InvalidateRect(hwnd, NULL, false);
return true;
case MM_COLORMODE_GRADTRANS:
CheckMenuItem(GetMenu(hwnd), MM_COLORMODE_NOCHANGE, MF_UNCHECKED);
CheckMenuItem(GetMenu(hwnd), MM_COLORMODE_TRANS50, MF_UNCHECKED);
CheckMenuItem(GetMenu(hwnd), MM_COLORMODE_GRADTRANS, MF_CHECKED);
SetColorMode(2);
InvalidateRect(hwnd, NULL, false);
return true;
default:
break;
}
break;}
case WM_KEYUP:
if(!( ((CHAR)wParam=='q') ||
((CHAR)wParam=='Q') ) )
{
break;
}
case WM_DESTROY:
CleanUp();
DeleteObject(ghbrWhite);
PostQuitMessage(0);
return(DefWindowProc(hwnd, message, wParam, lParam));
case WM_PAINT:
DrawPath(hwnd, NULL, NULL, flatness, CalcFlags(hwnd));
return true;
default:
return(DefWindowProc(hwnd, message, wParam, lParam));
}
return(0);
}
/***************************************************************************\
* bInitApp()
*
* Initializes app.
*
* History:
* 04-07-91 -by- KentD
* Wrote it.
\***************************************************************************/
BOOL bInitApp(BOOL debug)
{
debug = FALSE;
WNDCLASS wc;
//ghbrWhite = CreateSolidBrush(RGB(0xFF,0xFF,0xFF));
wc.style = 0;
wc.lpfnWndProc = lMainWindowProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = ghInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
//wc.hbrBackground = ghbrWhite;
wc.hbrBackground = NULL;
wc.lpszMenuName = _T("MainMenu");
wc.lpszClassName = _T("TestClass");
if (!RegisterClass(&wc))
{
return(FALSE);
}
ghwndMain =
CreateWindowEx(
0,
_T("TestClass"),
_T("Win32 Test"),
WS_OVERLAPPED |
WS_CAPTION |
WS_THICKFRAME |
WS_MAXIMIZEBOX |
WS_BORDER |
WS_MINIMIZEBOX |
WS_CLIPCHILDREN |
WS_VISIBLE |
WS_SYSMENU,
80,
70,
500,
500,
NULL,
NULL,
ghInstance,
NULL);
if (ghwndMain == NULL)
{
return(FALSE);
}
SetFocus(ghwndMain);
return(TRUE);
}
/***************************************************************************\
* main(argc, argv[])
*
* Sets up the message loop.
*
* History:
* 04-07-91 -by- KentD
* Wrote it.
\***************************************************************************/
_cdecl
main(
INT argc,
PCHAR argv[])
{
MSG msg;
HACCEL haccel;
if (!gGdiplusInitHelper.IsValid())
{
return 0;
}
BOOL wantDebugWindow = FALSE;
CoInitialize(NULL);
// Parse arguments
for (argc--, argv++ ; argc && '-' == **argv ; argc--, argv++ )
{
switch ( *(++(*argv)) )
{
case 'd':
case 'D':
wantDebugWindow = TRUE;
break;
}
}
ghInstance = GetModuleHandle(NULL);
if (!bInitApp(wantDebugWindow))
{
return(0);
}
haccel = LoadAccelerators(ghInstance, MAKEINTRESOURCE(101));
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, haccel, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
CoUninitialize();
return(1);
}