446 lines
11 KiB
C++
446 lines
11 KiB
C++
/******************************Module*Header*******************************\
|
|
* Module Name: wndstuff.cpp
|
|
*
|
|
* Menu driven test environment.
|
|
*
|
|
* Created: 23 December 1999
|
|
* Author: Adrian Secchia [asecchia]
|
|
*
|
|
* Copyright (c) 1999 Microsoft Corporation
|
|
*
|
|
\**************************************************************************/
|
|
|
|
// for Win95 compile
|
|
#undef UNICODE
|
|
#undef _UNICODE
|
|
|
|
#include <windows.h>
|
|
#include <tchar.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <objbase.h>
|
|
|
|
#include "wndstuff.h"
|
|
|
|
HINSTANCE ghInstance;
|
|
HWND ghwndMain;
|
|
HBRUSH ghbrWhite;
|
|
WCHAR FileName[MAX_PATH]=L"winnt256.bmp";
|
|
|
|
#include <gdiplus.h>
|
|
|
|
#include "../gpinit.inc"
|
|
|
|
// Store the user requested state for the DrawImage test.
|
|
UINT uCategory;
|
|
UINT uResample;
|
|
UINT uRotation;
|
|
UINT uICM;
|
|
UINT uICMBack;
|
|
BOOL bPixelMode = FALSE;
|
|
UINT uWrapMode = 0;
|
|
|
|
|
|
ULONG _cdecl
|
|
DbgPrint(
|
|
CHAR* format,
|
|
...
|
|
)
|
|
|
|
{
|
|
va_list arglist;
|
|
va_start(arglist, format);
|
|
|
|
char buf[1024];
|
|
|
|
_vsnprintf(buf, 1024, format, arglist);
|
|
buf[1024-1]=0;
|
|
|
|
OutputDebugStringA(buf);
|
|
|
|
va_end(arglist);
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
/***************************************************************************\
|
|
* SetXXXX
|
|
*
|
|
* These routines set the state for the test. When the user selects
|
|
* an option from the menu, we store the state and mark the selection
|
|
* in the menu text.
|
|
* The DoTest routine queries the global variables (above) to determine
|
|
* which test to run and set the environment for the test.
|
|
\***************************************************************************/
|
|
|
|
VOID SetCategory(HWND hwnd, UINT uNewCategory)
|
|
{
|
|
HMENU hmenu = GetMenu(hwnd);
|
|
HMENU hmenu2 = GetSubMenu(hmenu, 2);
|
|
CheckMenuItem(hmenu2, uCategory, MF_BYCOMMAND | MF_UNCHECKED);
|
|
CheckMenuItem(hmenu2, uNewCategory, MF_BYCOMMAND | MF_CHECKED);
|
|
uCategory = uNewCategory;
|
|
}
|
|
|
|
VOID SetResample(HWND hwnd, UINT uNewResample)
|
|
{
|
|
HMENU hmenu = GetMenu(hwnd);
|
|
HMENU hmenu2 = GetSubMenu(hmenu, 3);
|
|
CheckMenuItem(hmenu2, uResample, MF_BYCOMMAND | MF_UNCHECKED);
|
|
CheckMenuItem(hmenu2, uNewResample, MF_BYCOMMAND | MF_CHECKED);
|
|
uResample = uNewResample;
|
|
}
|
|
|
|
VOID SetICM(HWND hwnd, UINT uNewICM)
|
|
{
|
|
HMENU hmenu = GetMenu(hwnd);
|
|
HMENU hmenu2 = GetSubMenu(hmenu, 5);
|
|
CheckMenuItem(hmenu2, uICM, MF_BYCOMMAND | MF_UNCHECKED);
|
|
CheckMenuItem(hmenu2, uNewICM, MF_BYCOMMAND | MF_CHECKED);
|
|
uICM = uNewICM;
|
|
}
|
|
|
|
VOID SetICMBack(HWND hwnd, UINT uNewICM)
|
|
{
|
|
HMENU hmenu = GetMenu(hwnd);
|
|
HMENU hmenu2 = GetSubMenu(hmenu, 5);
|
|
CheckMenuItem(hmenu2, uICMBack, MF_BYCOMMAND | MF_UNCHECKED);
|
|
CheckMenuItem(hmenu2, uNewICM, MF_BYCOMMAND | MF_CHECKED);
|
|
uICMBack = uNewICM;
|
|
}
|
|
|
|
VOID SetRotation(HWND hwnd, UINT uNewRotation)
|
|
{
|
|
HMENU hmenu = GetMenu(hwnd);
|
|
HMENU hmenu2 = GetSubMenu(hmenu, 6);
|
|
CheckMenuItem(hmenu2, uRotation, MF_BYCOMMAND | MF_UNCHECKED);
|
|
CheckMenuItem(hmenu2, uNewRotation, MF_BYCOMMAND | MF_CHECKED);
|
|
uRotation = uNewRotation;
|
|
}
|
|
|
|
VOID SetPixelOffsetMode(HWND hwnd, UINT uPixelMode)
|
|
{
|
|
HMENU hmenu = GetMenu(hwnd);
|
|
HMENU hmenu2 = GetSubMenu(hmenu, 4);
|
|
bPixelMode = !bPixelMode;
|
|
CheckMenuItem(hmenu2, uPixelMode, MF_BYCOMMAND | (bPixelMode?MF_CHECKED:MF_UNCHECKED));
|
|
}
|
|
|
|
|
|
VOID SetWrapMode(HWND hwnd, UINT uNewWrapMode)
|
|
{
|
|
HMENU hmenu = GetMenu(hwnd);
|
|
HMENU hmenu2 = GetSubMenu(hmenu, 4);
|
|
CheckMenuItem(hmenu2, uNewWrapMode, MF_BYCOMMAND | MF_CHECKED);
|
|
CheckMenuItem(hmenu2, uWrapMode, MF_BYCOMMAND | MF_UNCHECKED);
|
|
uWrapMode = uNewWrapMode;
|
|
}
|
|
|
|
|
|
inline BOOL
|
|
AnsiToUnicodeStr(
|
|
const CHAR* ansiStr,
|
|
WCHAR* unicodeStr,
|
|
INT unicodeSize
|
|
)
|
|
{
|
|
return MultiByteToWideChar(CP_ACP,
|
|
0,
|
|
ansiStr,
|
|
-1,
|
|
unicodeStr,
|
|
unicodeSize) > 0;
|
|
}
|
|
|
|
|
|
void OpenFileProc(HWND hwnd)
|
|
{
|
|
|
|
char locFileName[MAX_PATH];
|
|
OPENFILENAME ofn;
|
|
|
|
ZeroMemory(&ofn, sizeof(ofn));
|
|
|
|
ofn.lStructSize = sizeof(ofn);
|
|
ofn.hwndOwner = hwnd;
|
|
ofn.hInstance = ghInstance;
|
|
ofn.lpstrFile = locFileName;
|
|
ofn.nMaxFile = MAX_PATH;
|
|
ofn.lpstrTitle = "Open Image";
|
|
ofn.lpstrInitialDir = ".";
|
|
ofn.Flags = OFN_FILEMUSTEXIST;
|
|
locFileName[0] = '\0';
|
|
|
|
// Present the file/open dialog
|
|
|
|
if(GetOpenFileName(&ofn))
|
|
{
|
|
AnsiToUnicodeStr(locFileName, FileName, MAX_PATH);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/***************************************************************************\
|
|
* lMainWindowProc(hwnd, message, wParam, lParam)
|
|
*
|
|
* Processes all messages for the main window.
|
|
\***************************************************************************/
|
|
|
|
LONG_PTR
|
|
lMainWindowProc(
|
|
HWND hwnd,
|
|
UINT message,
|
|
WPARAM wParam,
|
|
LPARAM lParam
|
|
)
|
|
{
|
|
PAINTSTRUCT ps;
|
|
|
|
switch (message)
|
|
{
|
|
|
|
case WM_DEVMODECHANGE:
|
|
DbgPrint("Devmode change\n");
|
|
break;
|
|
|
|
case WM_DEVICECHANGE:
|
|
DbgPrint("Device change\n");
|
|
break;
|
|
|
|
case WM_DISPLAYCHANGE:
|
|
DbgPrint("Display change\n");
|
|
break;
|
|
|
|
case WM_CREATE:
|
|
break;
|
|
|
|
case WM_SIZE:
|
|
InvalidateRect(hwnd, NULL, FALSE);
|
|
break;
|
|
|
|
case WM_PAINT:
|
|
BeginPaint(hwnd, &ps);
|
|
DoTest(hwnd);
|
|
EndPaint(hwnd, &ps);
|
|
break;
|
|
|
|
|
|
case WM_COMMAND:
|
|
switch(LOWORD(wParam))
|
|
{
|
|
|
|
case IDM_OPENFILE:
|
|
OpenFileProc(hwnd);
|
|
InvalidateRect(hwnd, NULL, TRUE);
|
|
break;
|
|
|
|
case IDM_TEST:
|
|
InvalidateRect(hwnd, NULL, TRUE);
|
|
break;
|
|
|
|
// Choose the test.
|
|
case IDM_ALL:
|
|
case IDM_OUTCROP:
|
|
case IDM_OUTCROPR:
|
|
case IDM_SIMPLE:
|
|
case IDM_STRETCHROTATION:
|
|
case IDM_SHRINKROTATION:
|
|
case IDM_CROPROTATION:
|
|
case IDM_COPYCROP:
|
|
case IDM_DRAWICM:
|
|
case IDM_DRAWPALETTE:
|
|
case IDM_DRAWIMAGE2:
|
|
case IDM_STRETCHB:
|
|
case IDM_STRETCHS:
|
|
case IDM_PIXELCENTER:
|
|
case IDM_CACHEDBITMAP:
|
|
case IDM_CROPWT:
|
|
case IDM_HFLIP:
|
|
case IDM_VFLIP:
|
|
case IDM_SPECIALROTATE:
|
|
SetCategory(hwnd, LOWORD(wParam));
|
|
InvalidateRect(hwnd, NULL, TRUE);
|
|
break;
|
|
|
|
// Choose the world to device transformation
|
|
case IDM_ROT0:
|
|
case IDM_ROT10:
|
|
case IDM_ROT30:
|
|
case IDM_ROT45:
|
|
case IDM_ROT60:
|
|
case IDM_ROT90:
|
|
SetRotation(hwnd, LOWORD(wParam));
|
|
InvalidateRect(hwnd, NULL, TRUE);
|
|
break;
|
|
|
|
case IDM_ICM:
|
|
case IDM_NOICM:
|
|
SetICM(hwnd, LOWORD(wParam));
|
|
InvalidateRect(hwnd, NULL, TRUE);
|
|
break;
|
|
|
|
case IDM_ICM_BACK:
|
|
case IDM_ICM_NOBACK:
|
|
SetICMBack(hwnd, LOWORD(wParam));
|
|
InvalidateRect(hwnd, NULL, TRUE);
|
|
break;
|
|
|
|
|
|
// Choose the resample mode
|
|
case IDM_BILINEAR:
|
|
case IDM_BICUBIC:
|
|
case IDM_NEARESTNEIGHBOR:
|
|
case IDM_HIGHBILINEAR:
|
|
case IDM_HIGHBICUBIC:
|
|
SetResample(hwnd, LOWORD(wParam));
|
|
InvalidateRect(hwnd, NULL, TRUE);
|
|
break;
|
|
|
|
// Set the PixelOffsetMode
|
|
case IDM_PIXELMODE:
|
|
SetPixelOffsetMode(hwnd, LOWORD(wParam));
|
|
InvalidateRect(hwnd, NULL, TRUE);
|
|
break;
|
|
|
|
// Set the WrapMode
|
|
case IDM_WRAPMODETILE:
|
|
case IDM_WRAPMODEFLIPX:
|
|
case IDM_WRAPMODEFLIPY:
|
|
case IDM_WRAPMODEFLIPXY:
|
|
case IDM_WRAPMODECLAMP0:
|
|
case IDM_WRAPMODECLAMPFF:
|
|
SetWrapMode(hwnd, LOWORD(wParam));
|
|
InvalidateRect(hwnd, NULL, TRUE);
|
|
break;
|
|
|
|
case IDM_QUIT:
|
|
exit(0);
|
|
break;
|
|
|
|
default:
|
|
// The user selected an unimplemented menu item.
|
|
MessageBox(hwnd,
|
|
_T("Help me! - I've fallen and I can't get up!!!"),
|
|
_T(""),
|
|
MB_OK
|
|
);
|
|
break;
|
|
|
|
}
|
|
break;
|
|
|
|
case WM_DESTROY:
|
|
DeleteObject(ghbrWhite);
|
|
PostQuitMessage(0);
|
|
return(DefWindowProc(hwnd, message, wParam, lParam));
|
|
|
|
default:
|
|
return(DefWindowProc(hwnd, message, wParam, lParam));
|
|
}
|
|
|
|
return(0);
|
|
}
|
|
|
|
/***************************************************************************\
|
|
* bInitApp()
|
|
*
|
|
* Initializes the app.
|
|
\***************************************************************************/
|
|
|
|
BOOL bInitApp(VOID)
|
|
{
|
|
WNDCLASS wc;
|
|
|
|
// not quite so white background brush.
|
|
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.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_BORDER |
|
|
WS_THICKFRAME |
|
|
WS_MAXIMIZEBOX |
|
|
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.
|
|
\***************************************************************************/
|
|
|
|
_cdecl
|
|
main(
|
|
INT argc,
|
|
PCHAR argv[])
|
|
{
|
|
MSG msg;
|
|
HACCEL haccel;
|
|
CHAR* pSrc;
|
|
CHAR* pDst;
|
|
|
|
if (!gGdiplusInitHelper.IsValid())
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
ghInstance = GetModuleHandle(NULL);
|
|
if(!bInitApp()) { return 0; }
|
|
|
|
// Initialize the default menu selection.
|
|
SetCategory(ghwndMain, IDM_DRAWICM);
|
|
SetRotation(ghwndMain, IDM_ROT0);
|
|
SetResample(ghwndMain, IDM_BICUBIC);
|
|
SetICM(ghwndMain, IDM_NOICM);
|
|
SetPixelOffsetMode(ghwndMain, IDM_PIXELMODE);
|
|
SetICMBack(ghwndMain, IDM_ICM_NOBACK);
|
|
SetWrapMode(ghwndMain, IDM_WRAPMODETILE);
|
|
|
|
while(GetMessage (&msg, NULL, 0, 0))
|
|
{
|
|
if((ghwndMain == 0) || !IsDialogMessage(ghwndMain, &msg)) {
|
|
TranslateMessage(&msg) ;
|
|
DispatchMessage(&msg) ;
|
|
}
|
|
}
|
|
|
|
return 1;
|
|
}
|