⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 colorpickerdlg.cpp

📁 ColorPicker是一个基于对话框的应用程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// ColorPickerDlg.cpp : 实现文件
//

#include "stdafx.h"
#include "ColorPicker.h"
#include "ColorPickerDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

/*******************************************************************************
*	用于应用程序“关于”菜单项的 CAboutDlg 对话框	
*******************************************************************************/
class CAboutDlg : public CDialog
{
	DECLARE_MESSAGE_MAP()

public:
	CAboutDlg();

	enum { IDD = IDD_ABOUTBOX };

protected:
	virtual void DoDataExchange(CDataExchange* pDX);
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()


/*******************************************************************************
*	作用:		主对话框构造函数
*******************************************************************************/
CColorPickerDlg::CColorPickerDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CColorPickerDlg::IDD, pParent)
	, m_nRed(0)
	, m_nGreen(0)
	, m_nBlue(0)
	, m_nH(0)
	, m_nS(0)
	, m_nV(0)
	, m_nSliderRed(0)
	, m_nSliderGreen(0)
	, m_nSliderBlue(0)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

/*******************************************************************************
*	作用:		数据自动化函数
*******************************************************************************/
void CColorPickerDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_COLOR_AREA, m_ColorArea);
	DDX_Control(pDX, IDC_COLOR_BAND, m_ColorBand);
	DDX_Text(pDX, IDC_EDIT_RED, m_nRed);
	DDX_Text(pDX, IDC_EDIT_GREEN, m_nGreen);
	DDX_Text(pDX, IDC_EDIT_BLUE, m_nBlue);
	DDX_Text(pDX, IDC_EDIT_H, m_nH);
	DDX_Text(pDX, IDC_EDIT_S, m_nS);
	DDX_Text(pDX, IDC_EDIT_V, m_nV);
	DDX_Control(pDX, IDC_SLIDER_COLOR, m_SliderColor);
	DDX_Slider(pDX, IDC_SLIDER_RED, m_nSliderRed);
	DDX_Slider(pDX, IDC_SLIDER_GREEN, m_nSliderGreen);
	DDX_Slider(pDX, IDC_SLIDER_BLUE, m_nSliderBlue);
	DDX_Control(pDX, IDC_COLOR_PREV, m_ColorPrev);
}

BEGIN_MESSAGE_MAP(CColorPickerDlg, CDialog)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	//}}AFX_MSG_MAP
	ON_EN_CHANGE(IDC_EDIT_RED, &CColorPickerDlg::OnEnChangeEditRed)
	ON_WM_HSCROLL()
	ON_EN_CHANGE(IDC_EDIT_GREEN, &CColorPickerDlg::OnEnChangeEditGreen)
	ON_EN_CHANGE(IDC_EDIT_BLUE, &CColorPickerDlg::OnEnChangeEditBlue)
	ON_EN_CHANGE(IDC_EDIT_H, &CColorPickerDlg::OnEnChangeEditH)
	ON_EN_CHANGE(IDC_EDIT_S, &CColorPickerDlg::OnEnChangeEditS)
	ON_EN_CHANGE(IDC_EDIT_V, &CColorPickerDlg::OnEnChangeEditV)
	ON_WM_LBUTTONDOWN()
END_MESSAGE_MAP()

/*******************************************************************************
*	作用:		对话框初始化函数
*******************************************************************************/
BOOL CColorPickerDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// 将“关于...”菜单项添加到系统菜单中。

	// IDM_ABOUTBOX 必须在系统命令范围内。
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	
	//--------------------------------------------------------------------------
	// 添加内容

	// 改变窗口大小
	m_ColorArea.SetWindowPos(NULL, 0, 0, 256, 256, SWP_NOMOVE);
	m_ColorBand.SetWindowPos(NULL, 0, 0, 256, 40,  SWP_NOMOVE);
	m_SliderColor.SetWindowPos(NULL, 0, 0, 268, 20, SWP_NOMOVE);

	// 设置滑块取值范围
	m_SliderColor.SetRange(0, 1535);
	((CSliderCtrl*)GetDlgItem(IDC_SLIDER_RED))->SetRange(0, 255);
	((CSliderCtrl*)GetDlgItem(IDC_SLIDER_GREEN))->SetRange(0, 255);
	((CSliderCtrl*)GetDlgItem(IDC_SLIDER_BLUE))->SetRange(0, 255);

	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

void CColorPickerDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

/*******************************************************************************
*	作用:		绘制对话框
*******************************************************************************/
void CColorPickerDlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); // 用于绘制的设备上下文

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// 使图标在工作矩形中居中
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// 绘制图标
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}

	//--------------------------------------------------------------------------
	// 添加内容
	
	// 绘制颜色框
	DrawColorBand();

	// 更新颜色面板的颜色
	UpDateColorArea();
}

//当用户拖动最小化窗口时系统调用此函数取得光标显示。
//
HCURSOR CColorPickerDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}


/*******************************************************************************
*	作用:		绘制颜色框
*******************************************************************************/
void CColorPickerDlg::DrawColorBand(void)
{
	// 获取颜色框CDC
	CDC* pDC = m_ColorBand.GetDC();
	CPen* oldPen = NULL;
	
	int i;
	int k = 0;
	for (i = 0; i < 255; i += 6)
	{
		CPen pen(PS_SOLID, 1, RGB(255, 0, i));

		oldPen = pDC->SelectObject(&pen);
		pDC->MoveTo(k, 0);
		pDC->LineTo(k, 40);
		k++;
	}

	for (i = 252; i >= 0; i -= 6)
	{
		CPen pen(PS_SOLID, 1, RGB(i, 0, 255));

		pDC->SelectObject(&pen);
		pDC->MoveTo(k, 0);
		pDC->LineTo(k, 40);
		k++;
	}
	
	for (i = 6;i <= 255; i += 6)
	{
		CPen pen(PS_SOLID, 1, RGB(0, i, 255));

		pDC->SelectObject(&pen);
		pDC->MoveTo(k, 0);
		pDC->LineTo(k, 40);
		k++;
	}

	for (i = 252; i >= 0; i -= 6)
	{
		CPen pen(PS_SOLID, 1, RGB(0, 255, i));

		pDC->SelectObject(&pen);
		pDC->MoveTo(k, 0);
		pDC->LineTo(k, 40);
		k++;
	}

	for (i = 6; i <= 255; i += 6)
	{
		CPen pen(PS_SOLID, 1, RGB(i, 255, 0));

		pDC->SelectObject(&pen);
		pDC->MoveTo(k, 0);
		pDC->LineTo(k, 40);
		k++;
	}

	for (i = 252; i >= 0; i -= 6)
	{
		CPen pen(PS_SOLID, 1, RGB(255, i, 0));

		pDC->SelectObject(&pen);
		pDC->MoveTo(k, 0);
		pDC->LineTo(k, 40);
		k++;
	}

	pDC->SelectObject(oldPen);
}

/*******************************************************************************
*	作用:		更新颜色面板的颜色
*	备注:		以"红","绿","蓝"当前的取值为依据,更新面板
*******************************************************************************/
void CColorPickerDlg::UpDateColorArea(void)
{
	UpdateData(TRUE);

	CDC*	pDC = m_ColorArea.GetDC();	// 颜色面板的CDC
	CDC		memDC;						// 内存CDC
	CBitmap bitmap;						// 内存位图
	BITMAP	infoBitmap;					// 位图信息结构体

	// 创建内存CDC
	memDC.CreateCompatibleDC(pDC);
	// 创建设备相关位图
	bitmap.CreateCompatibleBitmap(pDC, 256, 256);
	// 获得位图信息
	bitmap.GetBitmap(&infoBitmap);

	// 是否支持32位颜色
	if (infoBitmap.bmBitsPixel != 32)
	{
		MessageBox(L"当前显示设备不支持32位颜色,程序自动退出!");
		PostMessage(WM_QUIT);
	}

	BYTE* pixels = new BYTE[256 * 256 * 4];	// 32位颜色点阵数组

	int rForRow, gForRow, bForRow, rForColumn, gForColumn, bForColumn;

	for(int y = 0; y < 256; y++)
	{
		rForRow = m_nRed - (m_nRed * y / 255);
		gForRow = m_nGreen - (m_nGreen * y / 255);
		bForRow = m_nBlue - (m_nBlue * y / 255);

		for(int x = 0; x < 256 * 4; x += 4)
		{
			rForColumn = 255 - y - (((255- y - rForRow) * x / 4) / 255);
			gForColumn = 255 - y - (((255- y - gForRow) * x / 4) / 255);
			bForColumn = 255 - y - (((255- y - bForRow) * x / 4) / 255);
			pixels[y * 256 * 4 + x]		= bForColumn;
			pixels[y * 256 * 4 + x + 1] = gForColumn;
			pixels[y * 256 * 4 + x + 2] = rForColumn;
			pixels[y * 256 * 4 + x + 3] = 255;
		}
	}
	
	// 设置位图的点阵信息
	bitmap.SetBitmapBits(256 * 256 * 4, pixels);
	memDC.SelectObject(bitmap);
	// 拷贝内存CDC中的内容
	pDC->BitBlt(0, 0, 256, 256, &memDC, 0, 0, SRCCOPY);

	ReleaseDC(pDC);
	SAFE_DELETE_ARRAY (pixels);

	// 更新颜色预览框
	UpdatePrev();
}

/*******************************************************************************
*	作用:		将RGB转换为HSV,并更新对应数据
*******************************************************************************/
void CColorPickerDlg::UpdateHSV(void)
{
	UpdateData(TRUE);

	float R = m_nRed   / 255.0f;
	float G = m_nGreen / 255.0f;
	float B = m_nBlue  / 255.0f;

	float H = 0.0f;
	float S = 0.0f;
	float V = 0.0f;

	float RGBmax = max( max( R ,G ),B ) ;
	float RGBmin = min( min( R ,G ),B ) ;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -