363 lines
11 KiB
C++
363 lines
11 KiB
C++
/*******************************************************************************
|
|
*
|
|
* (C) COPYRIGHT MICROSOFT CORPORATION, 1998
|
|
*
|
|
* TITLE: CONTRAST.CPP
|
|
*
|
|
* VERSION: 1.0
|
|
*
|
|
* AUTHOR: ShaunIv
|
|
*
|
|
* DATE: 1/11/2001
|
|
*
|
|
* DESCRIPTION: Small preview window for illustrating brightness and contrast settings
|
|
*
|
|
*******************************************************************************/
|
|
#include "precomp.h"
|
|
#pragma hdrstop
|
|
#include "contrast.h"
|
|
|
|
LRESULT CBrightnessContrast::OnCreate( WPARAM, LPARAM )
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
CBrightnessContrast::~CBrightnessContrast()
|
|
{
|
|
KillBitmaps();
|
|
}
|
|
|
|
CBrightnessContrast::CBrightnessContrast( HWND hWnd )
|
|
: m_hWnd(hWnd),
|
|
m_nIntent(0),
|
|
m_nBrightness(50),
|
|
m_nContrast(50),
|
|
m_hBmpPreviewImage(NULL)
|
|
{
|
|
for (int i=0;i<NUMPREVIEWIMAGES;i++)
|
|
{
|
|
m_PreviewBitmaps[i] = NULL;
|
|
}
|
|
}
|
|
|
|
LRESULT CBrightnessContrast::OnPaint(WPARAM, LPARAM)
|
|
{
|
|
WIA_PUSH_FUNCTION((TEXT("CBrightnessContrast::OnPaint")));
|
|
PAINTSTRUCT ps;
|
|
HDC hDC = BeginPaint(m_hWnd,&ps);
|
|
if (hDC)
|
|
{
|
|
if (m_hBmpPreviewImage)
|
|
{
|
|
RECT rcClient;
|
|
GetClientRect( m_hWnd, &rcClient );
|
|
|
|
//
|
|
// Create a halftone palette
|
|
//
|
|
HPALETTE hHalftonePalette = CreateHalftonePalette(hDC);
|
|
if (hHalftonePalette)
|
|
{
|
|
//
|
|
// Select the halftone palette and save the result
|
|
//
|
|
HPALETTE hOldPalette = SelectPalette( hDC, hHalftonePalette, FALSE );
|
|
RealizePalette( hDC );
|
|
SetBrushOrgEx( hDC, 0,0, NULL );
|
|
|
|
//
|
|
// Set halftone stretchblt mode
|
|
//
|
|
int nOldStretchBltMode = SetStretchBltMode(hDC,HALFTONE);
|
|
|
|
//
|
|
// Draw 3D Border
|
|
//
|
|
|
|
//
|
|
// Draw shadow
|
|
//
|
|
RECT rcBottomShadow, rcRightShadow;
|
|
MoveToEx(hDC,rcClient.left,rcClient.top,NULL);
|
|
LineTo(hDC,rcClient.right-(SHADOW_WIDTH+1),rcClient.top);
|
|
LineTo(hDC,rcClient.right-(SHADOW_WIDTH+1),rcClient.bottom-(SHADOW_WIDTH+1));
|
|
LineTo(hDC,rcClient.left,rcClient.bottom-(SHADOW_WIDTH+1));
|
|
LineTo(hDC,rcClient.left,rcClient.top);
|
|
|
|
rcBottomShadow.left=rcClient.left+SHADOW_WIDTH;
|
|
rcBottomShadow.right=rcClient.right+1;
|
|
rcBottomShadow.top=rcClient.bottom-SHADOW_WIDTH;
|
|
rcBottomShadow.bottom=rcClient.bottom+1;
|
|
|
|
//
|
|
// bottom edge:
|
|
//
|
|
FillRect(hDC,&rcBottomShadow,GetSysColorBrush(COLOR_3DSHADOW));
|
|
|
|
//
|
|
// Fill in bottom left corner:
|
|
//
|
|
rcBottomShadow.left=rcClient.left;
|
|
rcBottomShadow.right=rcClient.left+SHADOW_WIDTH;
|
|
rcBottomShadow.top=rcClient.bottom-SHADOW_WIDTH;
|
|
rcBottomShadow.bottom=rcClient.bottom+1;
|
|
|
|
FillRect(hDC,&rcBottomShadow,GetSysColorBrush(COLOR_3DFACE));
|
|
|
|
rcRightShadow.left=rcClient.right-SHADOW_WIDTH;
|
|
rcRightShadow.right=rcClient.right+1;
|
|
rcRightShadow.top=rcClient.top+SHADOW_WIDTH;
|
|
rcRightShadow.bottom=rcClient.bottom-SHADOW_WIDTH;
|
|
|
|
//
|
|
// right edge
|
|
//
|
|
FillRect(hDC,&rcRightShadow,GetSysColorBrush(COLOR_3DSHADOW));
|
|
|
|
rcRightShadow.left=rcClient.right-5;
|
|
rcRightShadow.right=rcClient.right+1;
|
|
rcRightShadow.top=rcClient.top;
|
|
rcRightShadow.bottom=rcClient.top+5;
|
|
|
|
//
|
|
// Top right corner
|
|
//
|
|
FillRect(hDC,&rcRightShadow,(HBRUSH)(COLOR_3DFACE+1));
|
|
|
|
//
|
|
// Paint Image
|
|
//
|
|
HDC hdcMem = CreateCompatibleDC(hDC);
|
|
if (hdcMem)
|
|
{
|
|
//
|
|
// Select and realize the halftone palette
|
|
//
|
|
HPALETTE hOldMemDCPalette = SelectPalette(hdcMem,hHalftonePalette,FALSE);
|
|
RealizePalette(hdcMem);
|
|
SetBrushOrgEx(hdcMem, 0,0, NULL );
|
|
|
|
//
|
|
// Select the old bitmap
|
|
//
|
|
HBITMAP hOldBitmap = (HBITMAP)SelectObject(hdcMem,m_hBmpPreviewImage);
|
|
|
|
//
|
|
// Paint the preview bitmap
|
|
//
|
|
BITMAP bm = {0};
|
|
if (GetObject(m_hBmpPreviewImage,sizeof(BITMAP),&bm))
|
|
{
|
|
StretchBlt(hDC,rcClient.left+2,rcClient.top+2,WiaUiUtil::RectWidth(rcClient)-9,WiaUiUtil::RectHeight(rcClient)-9,hdcMem,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
|
|
}
|
|
|
|
//
|
|
// Restore the palette
|
|
//
|
|
SelectPalette( hdcMem, hOldMemDCPalette, FALSE );
|
|
|
|
//
|
|
// Delete the DC
|
|
//
|
|
DeleteDC(hdcMem);
|
|
}
|
|
|
|
//
|
|
// Restore the old palette and delete the halftone palette
|
|
//
|
|
SelectPalette( hDC, hOldPalette, FALSE );
|
|
DeleteObject( hHalftonePalette );
|
|
}
|
|
|
|
//
|
|
// We're done
|
|
//
|
|
EndPaint(m_hWnd,&ps);
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
|
|
LRESULT CBrightnessContrast::SetBrightness(int nBrightness)
|
|
{
|
|
WIA_PUSH_FUNCTION((TEXT("CBrightnessContrast::SetBrightness")));
|
|
if (nBrightness >= 0 && nBrightness <= 100)
|
|
{
|
|
m_nBrightness = static_cast<BYTE>(nBrightness);
|
|
ApplySettings();
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
LRESULT CBrightnessContrast::SetContrast(int nContrast)
|
|
{
|
|
WIA_PUSH_FUNCTION((TEXT("CBrightnessContrast::SetContrast")));
|
|
if (m_nContrast >= 0 && m_nContrast <= 100)
|
|
{
|
|
m_nContrast = static_cast<BYTE>(nContrast);
|
|
ApplySettings();
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
LRESULT CBrightnessContrast::SetIntent(LONG nIntent)
|
|
{
|
|
WIA_PUSH_FUNCTION((TEXT("CBrightnessContrast::SetIntent")));
|
|
if (nIntent < NUMPREVIEWIMAGES && nIntent >= 0)
|
|
{
|
|
m_nIntent = nIntent;
|
|
ApplySettings();
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
LRESULT CBrightnessContrast::KillBitmaps()
|
|
{
|
|
WIA_PUSH_FUNCTION((TEXT("CBrightnessContrast::KillBitmaps")));
|
|
for (int i=0;i<NUMPREVIEWIMAGES;i++)
|
|
{
|
|
if (m_PreviewBitmaps[i])
|
|
{
|
|
DeleteObject( m_PreviewBitmaps[i] );
|
|
m_PreviewBitmaps[i] = NULL;
|
|
}
|
|
}
|
|
if (m_hBmpPreviewImage)
|
|
{
|
|
DeleteObject(m_hBmpPreviewImage);
|
|
m_hBmpPreviewImage = NULL;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
LRESULT CBrightnessContrast::ApplySettings()
|
|
{
|
|
WIA_PUSH_FUNCTION((TEXT("CBrightnessContrast::ApplySettings")));
|
|
if (m_PreviewBitmaps[m_nIntent])
|
|
{
|
|
if (m_hBmpPreviewImage)
|
|
{
|
|
DeleteObject(m_hBmpPreviewImage);
|
|
m_hBmpPreviewImage = NULL;
|
|
}
|
|
|
|
#ifdef DONT_USE_GDIPLUS
|
|
m_hBmpPreviewImage = reinterpret_cast<HBITMAP>(CopyImage( m_PreviewBitmaps[m_nIntent], IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION ));
|
|
#else
|
|
//
|
|
// If the window is enabled, use the real brightness and contrast settings
|
|
//
|
|
if (IsWindowEnabled(m_hWnd))
|
|
{
|
|
if (BCPWM_BW == m_nIntent)
|
|
{
|
|
m_GdiPlusHelper.SetThreshold( m_PreviewBitmaps[m_nIntent], m_hBmpPreviewImage, m_nBrightness );
|
|
}
|
|
else
|
|
{
|
|
m_GdiPlusHelper.SetBrightnessAndContrast( m_PreviewBitmaps[m_nIntent], m_hBmpPreviewImage, m_nBrightness, m_nContrast );
|
|
}
|
|
}
|
|
|
|
//
|
|
// Otherwise, use the nominal settings, to prevent feedback
|
|
//
|
|
else
|
|
{
|
|
if (BCPWM_BW == m_nIntent)
|
|
{
|
|
m_GdiPlusHelper.SetThreshold( m_PreviewBitmaps[m_nIntent], m_hBmpPreviewImage, 50 );
|
|
}
|
|
else
|
|
{
|
|
m_GdiPlusHelper.SetBrightnessAndContrast( m_PreviewBitmaps[m_nIntent], m_hBmpPreviewImage, 50, 50 );
|
|
}
|
|
}
|
|
#endif // !DONT_USE_GDIPLUS
|
|
}
|
|
InvalidateRect(m_hWnd,NULL,FALSE);
|
|
UpdateWindow(m_hWnd);
|
|
return 0;
|
|
}
|
|
|
|
BOOL CBrightnessContrast::RegisterClass( HINSTANCE hInstance )
|
|
{
|
|
WNDCLASS wc = {0};
|
|
wc.style = CS_DBLCLKS;
|
|
wc.cbWndExtra = sizeof(CBrightnessContrast*);
|
|
wc.lpfnWndProc = WndProc;
|
|
wc.hInstance = hInstance;
|
|
wc.hbrBackground = (HBRUSH)(COLOR_3DFACE+1);
|
|
wc.lpszClassName = BRIGHTNESS_CONTRAST_PREVIEW_WINDOW_CLASS;
|
|
BOOL res = (::RegisterClass(&wc) != 0);
|
|
return (res != 0);
|
|
}
|
|
|
|
LRESULT CBrightnessContrast::OnSetBrightness( WPARAM wParam, LPARAM lParam)
|
|
{
|
|
WIA_PUSH_FUNCTION((TEXT("CBrightnessContrast::OnSetBrightness")));
|
|
SetBrightness(static_cast<BYTE>(lParam));
|
|
return 0;
|
|
}
|
|
|
|
LRESULT CBrightnessContrast::OnSetContrast( WPARAM wParam, LPARAM lParam)
|
|
{
|
|
WIA_PUSH_FUNCTION((TEXT("CBrightnessContrast::OnSetContrast")));
|
|
SetContrast(static_cast<BYTE>(lParam));
|
|
return 0;
|
|
}
|
|
|
|
LRESULT CBrightnessContrast::OnSetIntent( WPARAM wParam, LPARAM lParam)
|
|
{
|
|
WIA_PUSH_FUNCTION((TEXT("CBrightnessContrast::OnSetIntent")));
|
|
SetIntent(static_cast<int>(lParam));
|
|
return 0;
|
|
}
|
|
|
|
LRESULT CBrightnessContrast::OnLoadBitmap( WPARAM wParam, LPARAM lParam )
|
|
{
|
|
WIA_PUSH_FUNCTION((TEXT("CBrightnessContrast::OnLoadBitmap")));
|
|
int nId = static_cast<int>(wParam);
|
|
if (nId < NUMPREVIEWIMAGES && nId >= 0)
|
|
{
|
|
if (m_PreviewBitmaps[nId])
|
|
{
|
|
DeleteObject(m_PreviewBitmaps[nId]);
|
|
m_PreviewBitmaps[nId] = NULL;
|
|
}
|
|
m_PreviewBitmaps[nId] = reinterpret_cast<HBITMAP>(lParam);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
LRESULT CBrightnessContrast::OnEnable( WPARAM wParam, LPARAM )
|
|
{
|
|
//
|
|
// Update the control's appearance when we are enabled or disabled
|
|
//
|
|
WIA_PUSH_FUNCTION((TEXT("CBrightnessContrast::OnEnable")));
|
|
if (wParam)
|
|
{
|
|
ApplySettings();
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
LRESULT CALLBACK CBrightnessContrast::WndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
|
|
{
|
|
SC_BEGIN_MESSAGE_HANDLERS(CBrightnessContrast)
|
|
{
|
|
SC_HANDLE_MESSAGE( WM_CREATE, OnCreate );
|
|
SC_HANDLE_MESSAGE( WM_ENABLE, OnEnable );
|
|
SC_HANDLE_MESSAGE( WM_PAINT, OnPaint );
|
|
SC_HANDLE_MESSAGE( BCPWM_SETBRIGHTNESS, OnSetBrightness );
|
|
SC_HANDLE_MESSAGE( BCPWM_SETCONTRAST, OnSetContrast );
|
|
SC_HANDLE_MESSAGE( BCPWM_SETINTENT, OnSetIntent);
|
|
SC_HANDLE_MESSAGE( BCPWM_LOADIMAGE, OnLoadBitmap);
|
|
}
|
|
SC_END_MESSAGE_HANDLERS();
|
|
}
|
|
|
|
|