157 lines
3.6 KiB
C++
157 lines
3.6 KiB
C++
// CustomColorDialog.cpp : implementation file
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include "CustomColorDialog.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CCustomColorDialog
|
|
|
|
IMPLEMENT_DYNAMIC(CCustomColorDialog, CColorDialog)
|
|
|
|
CCustomColorDialog::CCustomColorDialog(COLORREF clrInit, DWORD dwFlags, CWnd* pParentWnd) :
|
|
CColorDialog(clrInit, dwFlags, pParentWnd)
|
|
{
|
|
m_cc.Flags |= CC_ENABLETEMPLATE|CC_FULLOPEN|CC_SHOWHELP;
|
|
m_cc.hInstance = (HWND)AfxGetInstanceHandle();
|
|
m_cc.lpTemplateName = MAKEINTRESOURCE(IDD_CHOOSE_COLOR);
|
|
//MCC_ENABLETEMPLATE
|
|
|
|
m_bPickMode = false;
|
|
m_pickerCusror = ::LoadCursor(AfxGetResourceHandle(),MAKEINTRESOURCE(IDC_COLOR_PICKER));
|
|
}
|
|
|
|
CCustomColorDialog::~CCustomColorDialog()
|
|
{
|
|
DeleteObject(m_pickerCusror);
|
|
}
|
|
|
|
BEGIN_MESSAGE_MAP(CCustomColorDialog, CColorDialog)
|
|
//{{AFX_MSG_MAP(CCustomColorDialog)
|
|
ON_BN_CLICKED(IDC_PICK_COLOR, OnPickColor)
|
|
ON_WM_LBUTTONDOWN()
|
|
ON_WM_CREATE()
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
|
|
void CCustomColorDialog::OnPickColor()
|
|
{
|
|
CLogFile::WriteLine( "Pick color" );
|
|
PickMode( m_pickColor.GetCheck()==1 );
|
|
}
|
|
|
|
BOOL CCustomColorDialog::OnInitDialog()
|
|
{
|
|
CColorDialog::OnInitDialog();
|
|
|
|
m_pickColor.SubclassDlgItem( IDC_PICK_COLOR,this );
|
|
//m_pickColor.SubclassDlgItem( IDC_BUTTON2,this );
|
|
|
|
CBitmap bmp;
|
|
//ASSERT( ::LoadBitmap(AfxGetResourceHandle(),MAKEINTRESOURCE(IDB_WATER)) );
|
|
m_pickColor.SetBitmap( ::LoadBitmap(AfxGetResourceHandle(),MAKEINTRESOURCE(IDB_PICK_COLOR)) );
|
|
|
|
return TRUE; // return TRUE unless you set the focus to a control
|
|
// EXCEPTION: OCX Property Pages should return FALSE
|
|
}
|
|
|
|
void CCustomColorDialog::OnLButtonDown(UINT nFlags, CPoint point)
|
|
{
|
|
if (m_bPickMode)
|
|
{
|
|
CDC dcScreen;
|
|
CDC dc;
|
|
CBitmap bmp;
|
|
dcScreen.CreateDC("DISPLAY", NULL, NULL, NULL);
|
|
dc.CreateCompatibleDC( &dcScreen );
|
|
|
|
int width = GetDeviceCaps( dcScreen,HORZRES);
|
|
int height = GetDeviceCaps( dcScreen,VERTRES);
|
|
bmp.CreateCompatibleBitmap( &dcScreen,width,height );
|
|
if (bmp.m_hObject)
|
|
{
|
|
// Select the bitmaps into the compatible DC.
|
|
dc.SelectObject(bmp);
|
|
|
|
//Copy color data for the entire display into a
|
|
//bitmap that is selected into a compatible DC.
|
|
dc.BitBlt( 0,0,width,height, &dcScreen, 0,0, SRCCOPY );
|
|
|
|
uint *pImage = new uint[width*height*4];
|
|
|
|
BITMAPINFO bi;
|
|
ZeroStruct(bi);
|
|
bi.bmiHeader.biSize = sizeof(bi);
|
|
bi.bmiHeader.biWidth = width;
|
|
bi.bmiHeader.biHeight = -height;
|
|
bi.bmiHeader.biBitCount = 32;
|
|
bi.bmiHeader.biPlanes = 1;
|
|
bi.bmiHeader.biCompression = BI_RGB;
|
|
bi.bmiHeader.biXPelsPerMeter = width;
|
|
bi.bmiHeader.biYPelsPerMeter = height;
|
|
|
|
|
|
// Get RGBA raw memory.
|
|
GetDIBits( dc,bmp,0,height,pImage,&bi,DIB_RGB_COLORS );
|
|
|
|
CPoint p;
|
|
GetCursorPos( &p );
|
|
|
|
// get image color at clicked location.
|
|
uint c = pImage[p.y*width + p.x];
|
|
COLORREF col = c;
|
|
|
|
SetCurrentColor( RGB(GetBValue(col),GetGValue(col),GetRValue(col)) );
|
|
|
|
delete []pImage;
|
|
}
|
|
bmp.DeleteObject();
|
|
dc.DeleteDC();
|
|
dcScreen.DeleteDC();
|
|
|
|
// Pick Color.
|
|
//GetWindowColo
|
|
|
|
PickMode(false);
|
|
return;
|
|
}
|
|
|
|
CColorDialog::OnLButtonDown(nFlags, point);
|
|
}
|
|
|
|
void CCustomColorDialog::PickMode( bool bEnable )
|
|
{
|
|
if (m_bPickMode != bEnable)
|
|
{
|
|
m_bPickMode = bEnable;
|
|
if (m_bPickMode)
|
|
{
|
|
SetCapture();
|
|
SetCursor( m_pickerCusror );
|
|
m_pickColor.SetCheck(1);
|
|
}
|
|
else
|
|
{
|
|
m_pickColor.SetCheck(0);
|
|
ReleaseCapture();
|
|
}
|
|
}
|
|
}
|
|
|
|
int CCustomColorDialog::OnCreate(LPCREATESTRUCT lpCreateStruct)
|
|
{
|
|
if (CColorDialog::OnCreate(lpCreateStruct) == -1)
|
|
return -1;
|
|
|
|
//lpCreateStruct->
|
|
|
|
return 0;
|
|
}
|