Windows2000/private/windows/shell/accesory/mspaint/imageatt.cpp
2020-09-30 17:12:32 +02:00

1024 lines
28 KiB
C++

// imageatt.cpp : implementation file
#include "stdafx.h"
#include "pbrush.h"
#include "imageatt.h"
#include "hlpcntxt.h"
#include "pbrusdoc.h"
#include "bmobject.h"
#include "imgsuprt.h" // for InvalColorWnd()
#include "image.h"
#ifndef UNICODE
#include <sys\stat.h>
#endif
#include <wchar.h>
#include <tchar.h>
#include <winnls.h>
#ifdef _DEBUG
#undef THIS_FILE
static CHAR BASED_CODE THIS_FILE[] = __FILE__;
#endif
#include "memtrace.h"
#define FIXED_FLOATPT_MULTDIV 1000
#define DECIMAL_POSITIONS 2
/**** CImageAttr dialog **/
/*
There are a few things to note about the way this object/dialog functions.
It tries not to convert the currently displayed value unless it notices the
user has modified it. In all other cases, it works with PIXELS, the value
passed in. If the user modified the width or height, it does 1 conversion and
then works with pixels.
For the conversion to display the different unit values, it uses the saved
pixel value.
The reason for all of this is due to only n decimal place of accuracy in the
display
The member Vars m_lWidth and m_lHeight are in the current units (store in
the member variable m_eUnitsCurrent).
The member Vars m_lWidthPixels and m_lHeightPixels are always in Pixels and
these are what are used to convert for the display when changing the units.
*/
CImageAttr::CImageAttr(CWnd* pParent /*=NULL*/)
: CDialog(CImageAttr::IDD, pParent)
{
//{{AFX_DATA_INIT(CImageAttr)
m_cStringWidth = TEXT("");
m_cStringHeight = TEXT("");
//}}AFX_DATA_INIT
m_eUnitsCurrent = (eUNITS)theApp.m_iCurrentUnits;
bEditFieldModified = FALSE;
m_bMonochrome = FALSE;
m_lHeightPixels = 0l;
m_lWidthPixels = 0l;
m_lHeight = 0l;
m_lWidth = 0l;
}
void CImageAttr::DoDataExchange(CDataExchange* pDX)
{
// saving must be done before the generic dodataexchange below.
if (! pDX->m_bSaveAndValidate) // saving to dialog
{
FixedFloatPtToString( m_cStringWidth, m_lWidth );
FixedFloatPtToString( m_cStringHeight, m_lHeight );
}
CDialog::DoDataExchange( pDX );
//{{AFX_DATA_MAP(CImageAttr)
DDX_Text(pDX, IDC_WIDTH, m_cStringWidth);
DDV_MaxChars(pDX, m_cStringWidth, 5);
DDX_Text(pDX, IDC_HEIGHT, m_cStringHeight);
DDV_MaxChars(pDX, m_cStringHeight, 5);
//}}AFX_DATA_MAP
if (pDX->m_bSaveAndValidate) // retrieving from dialog
{
m_lWidth = StringToFixedFloatPt( m_cStringWidth );
m_lHeight = StringToFixedFloatPt( m_cStringHeight );
}
}
LONG CImageAttr::StringToFixedFloatPt( CString& sString )
{
int iInteger = 0;
int iDecimal = 0;
TCHAR chDecimal[2] = TEXT("."); // default to period in case GetLocaleInfo
// messes up somehow
GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_SDECIMAL, chDecimal, 2);
if (! sString.IsEmpty())
{
int iPos = sString.Find( chDecimal[0] );
LPTSTR szTmp = sString.GetBuffer( 1 );
iInteger = FIXED_FLOATPT_MULTDIV * Atoi( szTmp );
if (iPos++ >= 0)
{
LPTSTR szDecimal = szTmp + iPos;
if (lstrlen( szDecimal ) > DECIMAL_POSITIONS)
szDecimal[DECIMAL_POSITIONS] = 0;
iDecimal = Atoi( szDecimal ) * 10;
for (int i = lstrlen( szDecimal ); i < DECIMAL_POSITIONS; ++i)
iDecimal *= 10;
}
}
return ( iInteger + iDecimal );
}
void CImageAttr::FixedFloatPtToString( CString& sString, LONG lFixedFloatPt )
{
int iInteger = lFixedFloatPt / FIXED_FLOATPT_MULTDIV;
int iDecimal = ((lFixedFloatPt % FIXED_FLOATPT_MULTDIV) + 5) / 10;
TCHAR chDecimal[2] = TEXT("."); // default to period in case GetLocaleInfo
// messes up somehow
GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_SDECIMAL, chDecimal, 2);
LPTSTR psz = sString.GetBufferSetLength( 24 );
if (iDecimal)
wsprintf( psz, TEXT("%d%s%d"), iInteger, chDecimal,iDecimal );
else
wsprintf( psz, TEXT("%d"), iInteger );
sString.ReleaseBuffer();
}
BEGIN_MESSAGE_MAP(CImageAttr, CDialog)
ON_MESSAGE(WM_HELP, OnHelp)
ON_MESSAGE(WM_CONTEXTMENU, OnContextMenu)
//{{AFX_MSG_MAP(CImageAttr)
ON_BN_CLICKED(IDC_INCHES, OnInches)
ON_BN_CLICKED(IDC_CENTIMETERS, OnCentimeters)
ON_BN_CLICKED(IDC_PIXELS, OnPixels)
ON_EN_CHANGE(IDC_HEIGHT, OnChangeHeight)
ON_EN_CHANGE(IDC_WIDTH, OnChangeWidth)
ON_BN_CLICKED(IDC_DEFAULT, OnDefault)
ON_BN_CLICKED(IDC_USE_TRANS, OnUseTrans)
ON_BN_CLICKED(IDC_SELECT_COLOR, OnSelectColor)
ON_WM_PAINT()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/*** CImageAttr message handlers ******/
static DWORD ImageAttrHelpIds[] =
{
IDC_WIDTH_STATIC, IDH_PAINT_IMAGE_ATTR_WIDTH,
IDC_WIDTH, IDH_PAINT_IMAGE_ATTR_WIDTH,
IDC_HEIGHT_STATIC, IDH_PAINT_IMAGE_ATTR_HEIGHT,
IDC_HEIGHT, IDH_PAINT_IMAGE_ATTR_HEIGHT,
IDC_UNITS_GROUP, IDH_COMM_GROUPBOX,
IDC_INCHES, IDH_PAINT_IMAGE_ATTR_UNITS_INCHES,
IDC_CENTIMETERS, IDH_PAINT_IMAGE_ATTR_UNITS_CM,
IDC_PIXELS, IDH_PAINT_IMAGE_ATTR_UNITS_PELS,
IDC_COLORS_GROUP, IDH_COMM_GROUPBOX,
IDC_MONOCHROME, IDH_PAINT_IMAGE_ATTR_COLORS_BW,
IDC_COLORS, IDH_PAINT_IMAGE_ATTR_COLORS_COLORS,
IDC_DEFAULT, IDH_PAINT_IMAGE_ATTR_DEFAULT,
IDC_FILEDATE_STATIC, IDH_PAINT_IMAGE_ATTR_LASTSAVED,
IDC_FILESIZE_STATIC, IDH_PAINT_IMAGE_ATTR_SIZE,
IDC_USE_TRANS, IDH_PAINT_IMAGE_ATTR_USE_TRANSP,
IDC_SELECT_COLOR, IDH_PAINT_IMAGE_ATTR_SEL_COLOR,
IDC_TRANS_PAINT, IDH_PAINT_IMAGE_ATTR_PREVIEW,
0, 0
};
LONG
CImageAttr::OnHelp(WPARAM wParam, LPARAM lParam)
{
LONG lResult = 0;
::WinHelp((HWND)(((LPHELPINFO)lParam)->hItemHandle), TEXT("mspaint.hlp"),
HELP_WM_HELP, (ULONG_PTR)(LPTSTR)ImageAttrHelpIds);
return lResult;
}
LONG
CImageAttr::OnContextMenu(WPARAM wParam, LPARAM lParam)
{
LONG lResult = 0;
::WinHelp((HWND)wParam, TEXT("mspaint.hlp"),
HELP_CONTEXTMENU,(ULONG_PTR)(LPVOID)ImageAttrHelpIds);
return lResult;
}
void CImageAttr::PaintTransBox( COLORREF cr )
{
CWnd * pWnd = GetDlgItem(IDC_TRANS_PAINT);
CDC * pDC = pWnd->GetDC();
RECT rect;
pWnd->GetClientRect( &rect );
CBrush newBrush( m_crTrans & 0xFFFFFF); // disregard palette-relative
pDC->FillRect (&rect, &newBrush);
// CBrush * pOldBrush = pDC->SelectObject( &newBrush );
// pDC->Rectangle( &rect );
// DeleteObject( pDC->SelectObject( pOldBrush ) );
pWnd->ReleaseDC( pDC );
}
#define MAX_SEP_LEN 6
#define MAX_INT_LEN 16
// convert a number into a string with commas in the right place
CString CImageAttr::ReformatSizeString(DWORD dwNumber)
{
NUMBERFMT nmf;
CString strRet;
TCHAR szSep[MAX_SEP_LEN];
TCHAR szDec[MAX_SEP_LEN];
CString sNumber;
TCHAR szInt[MAX_INT_LEN];
ZeroMemory (&nmf, sizeof(nmf));
// Fill in the NUMBERFMT with defaults for the user locale,
// except for "fractional digits" being 0
GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_ILZERO,
szInt, MAX_INT_LEN);
nmf.LeadingZero = _ttol (szInt);
nmf.Grouping = 3;
nmf.lpDecimalSep = (LPTSTR)szDec;
nmf.lpThousandSep = (LPTSTR)szSep;
GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_SDECIMAL, nmf.lpDecimalSep,
MAX_SEP_LEN);
GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_STHOUSAND, nmf.lpThousandSep,
MAX_SEP_LEN);
GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_INEGNUMBER,
szInt,MAX_INT_LEN);
nmf.NegativeOrder = _ttol (szInt);
_ltot(dwNumber, sNumber.GetBuffer(20), 10);
sNumber.ReleaseBuffer();
int nChar = GetNumberFormat (LOCALE_USER_DEFAULT, 0, sNumber,
&nmf, (LPTSTR)NULL, 0);
if (nChar)
{
GetNumberFormat (LOCALE_USER_DEFAULT, 0, sNumber,
&nmf, strRet.GetBuffer(nChar), nChar);
strRet.ReleaseBuffer();
return strRet;
}
return CString(TEXT("0"));
}
BOOL CImageAttr::OnInitDialog()
{
CDialog::OnInitDialog();
CWnd * pFileDate = GetDlgItem(IDC_FILEDATE_STATIC);
CWnd * pFileSize = GetDlgItem(IDC_FILESIZE_STATIC);
CString cstrFileDate;
CString cstrFileSize;
if (((CPBApp *)AfxGetApp())->m_sCurFile.IsEmpty())
{
VERIFY(cstrFileDate.LoadString(IDS_FILEDATE_NA));
VERIFY(cstrFileSize.LoadString(IDS_FILESIZE_NA));
pFileDate->SetWindowText(cstrFileDate);
pFileSize->SetWindowText(cstrFileSize);
}
else
{
DWORD dwSize = 0L;
CString fn = ((CPBApp *)AfxGetApp())->m_sCurFile;
HANDLE hFile;
CString date;
CString time;
SYSTEMTIME sysTime;
FILETIME ftSaved;
FILETIME ftLocal;
int dSize;
// Open a handle to the file, use GetFileTime to
// get the FILETIME, convert to a SYSTEMTIME and
// call GetDateFormat and GetTimeFormat
hFile = ::CreateFile (fn,GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,OPEN_EXISTING,
0,NULL);
if (INVALID_HANDLE_VALUE != hFile)
{
// If your bitmap is bigger than 2GB, too bad.
dwSize = ::GetFileSize (hFile, NULL);
::GetFileTime (hFile, NULL, NULL, &ftSaved);
::FileTimeToLocalFileTime (&ftSaved, &ftLocal);
::FileTimeToSystemTime (&ftLocal, &sysTime);
dSize = ::GetDateFormat (LOCALE_USER_DEFAULT, DATE_SHORTDATE, &sysTime, NULL,
NULL, 0);
::GetDateFormat (LOCALE_USER_DEFAULT, DATE_SHORTDATE, &sysTime, NULL,
date.GetBuffer (dSize), dSize);
dSize = ::GetTimeFormat (LOCALE_USER_DEFAULT, TIME_NOSECONDS, &sysTime, NULL,
NULL, 0);
::GetTimeFormat (LOCALE_USER_DEFAULT, TIME_NOSECONDS, &sysTime, NULL,
time.GetBuffer (dSize), dSize);
date.ReleaseBuffer();
time.ReleaseBuffer();
VERIFY(cstrFileDate.LoadString(IDS_FILEDATE));
VERIFY(cstrFileSize.LoadString(IDS_FILESIZE));
TCHAR szFileDate[96];
TCHAR szFileSize[64];
// Display the date, followed by the time
date+=TEXT(" ");
date+=time;
::wsprintf( szFileDate, cstrFileDate, date );
::wsprintf( szFileSize, cstrFileSize, ReformatSizeString(dwSize) );
::CloseHandle (hFile);
pFileDate->SetWindowText(szFileDate);
pFileSize->SetWindowText(szFileSize);
}
else
{
VERIFY(cstrFileDate.LoadString(IDS_FILEDATE_NA));
VERIFY(cstrFileSize.LoadString(IDS_FILESIZE_NA));
pFileDate->SetWindowText(cstrFileDate);
pFileSize->SetWindowText(cstrFileSize);
}
}
int idButton = IDC_PIXELS;
if (m_eUnitsCurrent != ePIXELS)
idButton = (m_eUnitsCurrent == eINCHES)? IDC_INCHES: IDC_CENTIMETERS;
CheckRadioButton( IDC_INCHES, IDC_PIXELS, idButton );
CheckRadioButton( IDC_MONOCHROME, IDC_COLORS,
(m_bMonochrome? IDC_MONOCHROME: IDC_COLORS) );
// We enable the transparent color UI only if modifying a GIF
GetDlgItem (IDC_USE_TRANS )->EnableWindow (IFLT_GIF == theApp.m_nFltTypeUsed );
CheckDlgButton( IDC_USE_TRANS, g_bUseTrans);
CWnd* pSelectColorButton = GetDlgItem(IDC_SELECT_COLOR);
pSelectColorButton->EnableWindow(g_bUseTrans);
m_crTrans = crTrans;
return TRUE; // return TRUE unless you set the focus to a control
}
void CImageAttr::OnOK()
{
ConvertWidthHeight();
theApp.m_iCurrentUnits = m_eUnitsCurrent;
m_bMonochrome = (GetCheckedRadioButton( IDC_MONOCHROME, IDC_COLORS )
== IDC_MONOCHROME);
if (g_bUseTrans = IsDlgButtonChecked( IDC_USE_TRANS ))
{
crTrans = m_crTrans;
}
InvalColorWnd();
CDialog::OnOK();
}
void CImageAttr::OnDefault()
{
int nWidth, nHeight;
PBGetDefDims(nWidth, nHeight);
SetWidthHeight( nWidth, nHeight );
}
void CImageAttr::SetWidthHeight(UINT nWidthPixels, UINT nHeightPixels)
{
m_lWidthPixels = nWidthPixels * FIXED_FLOATPT_MULTDIV;
m_lHeightPixels = nHeightPixels * FIXED_FLOATPT_MULTDIV;
PelsToCurrentUnit();
// only call updatedata if dialog exists...
if (m_hWnd && ::IsWindow( m_hWnd ))
UpdateData( FALSE );
}
void CImageAttr::ConvertWidthHeight(void)
{
// if user modified the edit field Width/Height then get new data and
// convert to pixel format. Else use stored pixel format.
if (bEditFieldModified)
{
UpdateData( TRUE );
switch (m_eUnitsCurrent)
{
case eINCHES:
m_lWidthPixels = m_lWidth * theApp.ScreenDeviceInfo.ixPelsPerINCH;
m_lHeightPixels = m_lHeight * theApp.ScreenDeviceInfo.iyPelsPerINCH;
break;
case eCM:
m_lWidthPixels = m_lWidth * theApp.ScreenDeviceInfo.ixPelsPerDM / 10;
m_lHeightPixels = m_lHeight * theApp.ScreenDeviceInfo.iyPelsPerDM / 10;
break;
case ePIXELS:
default: // ePIXELS and all other assumed to be pixel
m_lWidthPixels = m_lWidth;
m_lHeightPixels = m_lHeight;
break;
}
bEditFieldModified = FALSE;
}
}
void CImageAttr::PelsToCurrentUnit()
{
switch (m_eUnitsCurrent)
{
case eINCHES:
m_lWidth = m_lWidthPixels / theApp.ScreenDeviceInfo.ixPelsPerINCH;
m_lHeight = m_lHeightPixels / theApp.ScreenDeviceInfo.iyPelsPerINCH;
break;
case eCM:
m_lWidth = m_lWidthPixels * 10 / theApp.ScreenDeviceInfo.ixPelsPerDM;
m_lHeight = m_lHeightPixels * 10 / theApp.ScreenDeviceInfo.iyPelsPerDM;
break;
case ePIXELS:
default:
//Pixels cannot be partial
//make sure whole number when converted to string (truncate! now).
m_lWidth = (m_lWidthPixels / FIXED_FLOATPT_MULTDIV) * FIXED_FLOATPT_MULTDIV;
m_lHeight = (m_lHeightPixels / FIXED_FLOATPT_MULTDIV) * FIXED_FLOATPT_MULTDIV;
break;
}
}
CSize CImageAttr::GetWidthHeight(void)
{
return CSize( (int)(m_lWidthPixels / FIXED_FLOATPT_MULTDIV),
(int)(m_lHeightPixels / FIXED_FLOATPT_MULTDIV) );
}
void CImageAttr::OnInches()
{
SetNewUnits( eINCHES );
}
void CImageAttr::OnCentimeters()
{
SetNewUnits( eCM );
}
void CImageAttr::OnPixels()
{
SetNewUnits( ePIXELS );
}
void CImageAttr::SetNewUnits( eUNITS NewUnit )
{
if (NewUnit == m_eUnitsCurrent)
return;
// must call getwidthheight before setting to new mode
ConvertWidthHeight(); // get in a common form of pixels.
m_eUnitsCurrent = NewUnit;
PelsToCurrentUnit();
UpdateData( FALSE );
}
void CImageAttr::OnChangeHeight()
{
bEditFieldModified = TRUE;
}
void CImageAttr::OnChangeWidth()
{
bEditFieldModified = TRUE;
}
/*** CZoomViewDlg dialog ******/
CZoomViewDlg::CZoomViewDlg(CWnd* pParent /*=NULL*/)
: CDialog(CZoomViewDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CZoomViewDlg)
//}}AFX_DATA_INIT
m_nCurrent = 0;
}
void CZoomViewDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CZoomViewDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CZoomViewDlg, CDialog)
ON_MESSAGE(WM_HELP, OnHelp)
ON_MESSAGE(WM_CONTEXTMENU, OnContextMenu)
//{{AFX_MSG_MAP(CZoomViewDlg)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/*** CZoomViewDlg message handlers ******/
static DWORD ZoomViewHelpIds[] =
{
IDC_CURRENT_ZOOM_STATIC, IDH_PAINT_ZOOM_CURRENT,
IDC_CURRENT_ZOOM, IDH_PAINT_ZOOM_CURRENT,
IDC_ZOOM_GROUP, IDH_PAINT_ZOOM_SET_GROUP,
IDC_ZOOM_100, IDH_PAINT_ZOOM_SET_GROUP,
IDC_ZOOM_200, IDH_PAINT_ZOOM_SET_GROUP,
IDC_ZOOM_400, IDH_PAINT_ZOOM_SET_GROUP,
IDC_ZOOM_600, IDH_PAINT_ZOOM_SET_GROUP,
IDC_ZOOM_800, IDH_PAINT_ZOOM_SET_GROUP,
0, 0
};
LONG
CZoomViewDlg::OnHelp(WPARAM wParam, LPARAM lParam)
{
LONG lResult = 0;
::WinHelp((HWND)(((LPHELPINFO)lParam)->hItemHandle), TEXT("mspaint.hlp"),
HELP_WM_HELP, (ULONG_PTR)(LPTSTR)ZoomViewHelpIds);
return lResult;
}
LONG
CZoomViewDlg::OnContextMenu(WPARAM wParam, LPARAM lParam)
{
LONG lResult = 0;
::WinHelp((HWND)wParam, TEXT("mspaint.hlp"),
HELP_CONTEXTMENU,(ULONG_PTR)(LPVOID)ZoomViewHelpIds);
return lResult;
}
BOOL CZoomViewDlg::OnInitDialog()
{
CDialog::OnInitDialog();
TCHAR* pZoom = TEXT("100%");
UINT nButton = IDC_ZOOM_100;
if (m_nCurrent < 8)
if (m_nCurrent < 6)
if (m_nCurrent < 4)
if (m_nCurrent < 2)
;
else
{
pZoom = TEXT("200%");
nButton = IDC_ZOOM_200;
}
else
{
pZoom = TEXT("400%");
nButton = IDC_ZOOM_400;
}
else
{
pZoom = TEXT("600%");
nButton = IDC_ZOOM_600;
}
else
{
pZoom = TEXT("800%");
nButton = IDC_ZOOM_800;
}
SetDlgItemText( IDC_CURRENT_ZOOM, pZoom );
CheckRadioButton( IDC_ZOOM_100, IDC_ZOOM_800, nButton );
return TRUE; // return TRUE unless you set the focus to a control
}
void CZoomViewDlg::OnOK()
{
m_nCurrent = GetCheckedRadioButton( IDC_ZOOM_100, IDC_ZOOM_800 ) - IDC_ZOOM_100;
if (m_nCurrent < 1)
m_nCurrent = 1;
else
m_nCurrent *= 2;
CDialog::OnOK();
}
/*** CFlipRotateDlg dialog ****/
CFlipRotateDlg::CFlipRotateDlg(CWnd* pParent /*=NULL*/)
: CDialog(CFlipRotateDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CFlipRotateDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
m_bHorz = TRUE;
m_bAngle = FALSE;
m_nAngle = 90;
}
void CFlipRotateDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CFlipRotateDlg)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CFlipRotateDlg, CDialog)
ON_MESSAGE(WM_HELP, OnHelp)
ON_MESSAGE(WM_CONTEXTMENU, OnContextMenu)
//{{AFX_MSG_MAP(CFlipRotateDlg)
ON_BN_CLICKED(IDC_BY_ANGLE, OnByAngle)
ON_BN_CLICKED(IDC_HORIZONTAL, OnNotByAngle)
ON_BN_CLICKED(IDC_VERTICAL, OnNotByAngle)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/*** CFlipRotateDlg message handlers ******/
static DWORD FlipRotateHelpIds[] =
{
IDC_PAINT_FLIP_GROUP, IDH_COMM_GROUPBOX,
IDC_HORIZONTAL, IDH_PAINT_IMAGE_FLIP_HORIZ,
IDC_VERTICAL, IDH_PAINT_IMAGE_FLIP_VERT,
IDC_BY_ANGLE, IDH_PAINT_IMAGE_FLIP_ROTATE,
IDC_90_DEG, IDH_PAINT_IMAGE_FLIP_ROTATE,
IDC_180_DEG, IDH_PAINT_IMAGE_FLIP_ROTATE,
IDC_270_DEG, IDH_PAINT_IMAGE_FLIP_ROTATE,
0, 0
};
LONG
CFlipRotateDlg::OnHelp(WPARAM wParam, LPARAM lParam)
{
LONG lResult = 0;
::WinHelp((HWND)(((LPHELPINFO)lParam)->hItemHandle), TEXT("mspaint.hlp"),
HELP_WM_HELP, (ULONG_PTR)(LPTSTR)FlipRotateHelpIds);
return lResult;
}
LONG
CFlipRotateDlg::OnContextMenu(WPARAM wParam, LPARAM lParam)
{
LONG lResult = 0;
::WinHelp((HWND)wParam, TEXT("mspaint.hlp"),
HELP_CONTEXTMENU,(ULONG_PTR)(LPVOID)FlipRotateHelpIds);
return lResult;
}
BOOL CFlipRotateDlg::OnInitDialog()
{
CDialog::OnInitDialog();
CheckRadioButton( IDC_90_DEG, IDC_270_DEG, IDC_90_DEG );
UINT uButton = (m_bAngle? IDC_BY_ANGLE: (m_bHorz? IDC_HORIZONTAL: IDC_VERTICAL));
CheckRadioButton( IDC_HORIZONTAL, IDC_BY_ANGLE, uButton );
if (uButton != IDC_BY_ANGLE)
OnNotByAngle();
return TRUE; // return TRUE unless you set the focus to a control
}
void CFlipRotateDlg::OnByAngle()
{
GetDlgItem( IDC_90_DEG )->EnableWindow( TRUE );
GetDlgItem( IDC_180_DEG )->EnableWindow( TRUE );
GetDlgItem( IDC_270_DEG )->EnableWindow( TRUE );
}
void CFlipRotateDlg::OnNotByAngle()
{
GetDlgItem( IDC_90_DEG )->EnableWindow( FALSE );
GetDlgItem( IDC_180_DEG )->EnableWindow( FALSE );
GetDlgItem( IDC_270_DEG )->EnableWindow( FALSE );
}
void CFlipRotateDlg::OnOK()
{
UINT uButton = GetCheckedRadioButton( IDC_HORIZONTAL, IDC_BY_ANGLE );
m_bHorz = (uButton == IDC_HORIZONTAL);
m_bAngle = (uButton == IDC_BY_ANGLE);
switch (GetCheckedRadioButton( IDC_90_DEG, IDC_270_DEG ))
{
case IDC_90_DEG:
m_nAngle = 90;
break;
case IDC_180_DEG:
m_nAngle = 180;
break;
case IDC_270_DEG:
m_nAngle = 270;
break;
}
CDialog::OnOK();
}
/**** CStretchSkewDlg dialog **/
CStretchSkewDlg::CStretchSkewDlg(CWnd* pParent /*=NULL*/)
: CDialog(CStretchSkewDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CStretchSkewDlg)
m_wSkewHorz = 0;
m_wSkewVert = 0;
m_iStretchVert = 100;
m_iStretchHorz = 100;
//}}AFX_DATA_INIT
//m_bStretchHorz = TRUE;
//m_bSkewHorz = TRUE;
}
void CStretchSkewDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CStretchSkewDlg)
DDX_Text(pDX, IDC_STRETCH_VERT_PERCENT, m_iStretchVert);
DDV_MinMaxInt(pDX, m_iStretchVert, 1, 500);
DDX_Text(pDX, IDC_STRETCH_HORZ_PERCENT, m_iStretchHorz);
DDV_MinMaxInt(pDX, m_iStretchHorz, 1, 500);
DDX_Text(pDX, IDC_SKEW_HORZ_DEGREES, m_wSkewHorz);
DDV_MinMaxInt(pDX, m_wSkewHorz, -89, 89);
DDX_Text(pDX, IDC_SKEW_VERT_DEGREES, m_wSkewVert);
DDV_MinMaxInt(pDX, m_wSkewVert, -89, 89);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CStretchSkewDlg, CDialog)
ON_MESSAGE(WM_HELP, OnHelp)
ON_MESSAGE(WM_CONTEXTMENU, OnContextMenu)
//{{AFX_MSG_MAP(CStretchSkewDlg)
/*
ON_BN_CLICKED(IDC_SKEW_HORZ, OnSkewHorz)
ON_BN_CLICKED(IDC_SKEW_VERT, OnSkewVert)
ON_BN_CLICKED(IDC_STRETCH_HORZ, OnStretchHorz)
ON_BN_CLICKED(IDC_STRETCH_VERT, OnStretchVert)
*/
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/*** CStretchSkewDlg message handlers ******/
static DWORD StretchSkewHelpIds[] =
{
IDC_STRETCH_GROUP, IDH_COMM_GROUPBOX,
IDC_STRETCH_HORZ_ICON, IDH_PAINT_IMAGE_STRETCH_HORIZ,
IDC_STRETCH_HORZ, IDH_PAINT_IMAGE_STRETCH_HORIZ,
IDC_STRETCH_HORZ_PERCENT, IDH_PAINT_IMAGE_STRETCH_HORIZ,
IDC_STRETCH_HORZ_SUFFIX, IDH_PAINT_IMAGE_STRETCH_HORIZ,
IDC_STRETCH_VERT_ICON, IDH_PAINT_IMAGE_STRETCH_VERT,
IDC_STRETCH_VERT, IDH_PAINT_IMAGE_STRETCH_VERT,
IDC_STRETCH_VERT_PERCENT, IDH_PAINT_IMAGE_STRETCH_VERT,
IDC_STRETCH_VERT_SUFFIX, IDH_PAINT_IMAGE_STRETCH_VERT,
IDC_SKEW_GROUP, IDH_COMM_GROUPBOX,
IDC_SKEW_HORZ_ICON, IDH_PAINT_IMAGE_SKEW_HOR,
IDC_SKEW_HORZ, IDH_PAINT_IMAGE_SKEW_HOR,
IDC_SKEW_HORZ_DEGREES, IDH_PAINT_IMAGE_SKEW_HOR,
IDC_SKEW_HORZ_SUFFIX, IDH_PAINT_IMAGE_SKEW_HOR,
IDC_SKEW_VERT_ICON, IDH_PAINT_IMAGE_SKEW_VERT,
IDC_SKEW_VERT, IDH_PAINT_IMAGE_SKEW_VERT,
IDC_SKEW_VERT_DEGREES, IDH_PAINT_IMAGE_SKEW_VERT,
IDC_SKEW_VERT_SUFFIX, IDH_PAINT_IMAGE_SKEW_VERT,
0, 0
};
LONG
CStretchSkewDlg::OnHelp(WPARAM wParam, LPARAM lParam)
{
LONG lResult = 0;
::WinHelp((HWND)(((LPHELPINFO)lParam)->hItemHandle), TEXT("mspaint.hlp"),
HELP_WM_HELP, (ULONG_PTR)(LPTSTR)StretchSkewHelpIds);
return lResult;
}
LONG
CStretchSkewDlg::OnContextMenu(WPARAM wParam, LPARAM lParam)
{
LONG lResult = 0;
::WinHelp((HWND)wParam, TEXT("mspaint.hlp"),
HELP_CONTEXTMENU,(ULONG_PTR)(LPVOID)StretchSkewHelpIds);
return lResult;
}
BOOL CStretchSkewDlg::OnInitDialog()
{
BOOL bEnableTrans;
CDialog::OnInitDialog();
CheckRadioButton( IDC_STRETCH_HORZ, IDC_STRETCH_VERT, IDC_STRETCH_HORZ );
CheckRadioButton( IDC_SKEW_HORZ , IDC_SKEW_VERT , IDC_SKEW_HORZ );
/* GetDlgItem( IDC_STRETCH_HORZ_PERCENT )->EnableWindow( m_iStretchHorz );
GetDlgItem( IDC_STRETCH_VERT_PERCENT )->EnableWindow( ! m_iStretchHorz );
GetDlgItem( IDC_SKEW_HORZ_DEGREES )->EnableWindow( m_bSkewHorz );
GetDlgItem( IDC_SKEW_VERT_DEGREES )->EnableWindow( ! m_bSkewHorz );
*/
return TRUE; // return TRUE unless you set the focus to a control
}
void CStretchSkewDlg::OnStretchHorz()
{
m_bStretchHorz = TRUE;
GetDlgItem( IDC_STRETCH_HORZ_PERCENT )->EnableWindow( TRUE );
GetDlgItem( IDC_STRETCH_VERT_PERCENT )->EnableWindow( FALSE );
CheckRadioButton( IDC_STRETCH_HORZ, IDC_STRETCH_VERT, IDC_STRETCH_HORZ );
}
void CStretchSkewDlg::OnStretchVert()
{
m_bStretchHorz = FALSE;
GetDlgItem( IDC_STRETCH_HORZ_PERCENT )->EnableWindow( FALSE );
GetDlgItem( IDC_STRETCH_VERT_PERCENT )->EnableWindow( TRUE );
CheckRadioButton( IDC_STRETCH_HORZ, IDC_STRETCH_VERT, IDC_STRETCH_VERT );
}
void CStretchSkewDlg::OnSkewHorz()
{
m_bSkewHorz = TRUE;
GetDlgItem( IDC_SKEW_HORZ_DEGREES )->EnableWindow( TRUE );
GetDlgItem( IDC_SKEW_VERT_DEGREES )->EnableWindow( FALSE );
CheckRadioButton( IDC_SKEW_HORZ, IDC_SKEW_VERT, IDC_SKEW_HORZ );
}
void CStretchSkewDlg::OnSkewVert()
{
m_bSkewHorz = FALSE;
GetDlgItem( IDC_SKEW_HORZ_DEGREES )->EnableWindow( FALSE );
GetDlgItem( IDC_SKEW_VERT_DEGREES )->EnableWindow( TRUE );
CheckRadioButton( IDC_SKEW_HORZ, IDC_SKEW_VERT, IDC_SKEW_VERT );
}
void CStretchSkewDlg::OnOK()
{
if (GetCheckedRadioButton( IDC_STRETCH_HORZ, IDC_STRETCH_VERT )
== IDC_STRETCH_HORZ)
m_iStretchVert = 0;
else
m_iStretchHorz = 0;
if (GetCheckedRadioButton( IDC_SKEW_HORZ, IDC_SKEW_VERT )
== IDC_SKEW_HORZ)
m_wSkewVert = 0;
else
m_wSkewHorz = 0;
CDialog::OnOK();
}
void CImageAttr::OnUseTrans()
{
CWnd* pSelectColorButton = GetDlgItem(IDC_SELECT_COLOR);
pSelectColorButton->EnableWindow(IsDlgButtonChecked(IDC_USE_TRANS));
}
extern INT_PTR CALLBACK AfxDlgProc(HWND, UINT, WPARAM, LPARAM);
static UINT_PTR CALLBACK /*LPCCHOOKPROC*/
SelectColorHook(HWND hColorDlg, UINT nMessage, WPARAM wParam, LPARAM lParam)
{
// Are we initializing the dialog window?
if ( nMessage == WM_INITDIALOG )
{
// Reset the common dialog title
CString strDialogTitle;
VERIFY(strDialogTitle.LoadString(IDS_SELECT_COLOR));
SetWindowText( hColorDlg, strDialogTitle );
}
// Pass All Messages Along to Common Dialog
return (UINT)AfxDlgProc(hColorDlg, nMessage, wParam, lParam );
}
void CImageAttr::OnSelectColor()
{
// for default color selection, disregard palette-relative
CColorDialog dlg( m_crTrans & 0xFFFFFF, CC_FULLOPEN );
dlg.m_cc.lpfnHook = SelectColorHook;
if (dlg.DoModal() != IDOK)
return;
PaintTransBox( m_crTrans = dlg.GetColor() );
}
void CImageAttr::OnPaint()
{
CPaintDC dc(this); // device context for painting
if (m_crTrans != TRANS_COLOR_NONE) // not default
PaintTransBox( m_crTrans );
}