65.9K
CodeProject is changing. Read more.
Home

CColorChooser an IDE style Color Picker

Oct 5, 2001

1 min read

viewsIcon

60040

downloadIcon

2034

CColorChooser an IDE style Color Picker

Motivation

Visual Basic is certainly not my cuppa tea, but the Visual Basic IDE does have some good ideas which applications can benefit from. One these is the Color Chooser popup window which allows the user to select a desired color. I've extended the control to include the Web Colors which are found on the new Visual Studio .NET IDE.

During a recent project I needed to design a color chooser and I turned to the VB IDE for 'help'.

Design

The window components contained in the project are show below:

Due to the lose coupling of the design CPaletteWnd, CSysColorWnd or CWenColorWnd can be used in isolation if so required in another project. The CColorChooser contains all the functionality and routes specific user messages back to the parent via PostMessage. Custom colors are persistent to the application and are serialized during CColorChooser construction and destruction (stored in the registy).

The project covers owner draw controls and have to create a custom control.

Implementation

  1. Include the add the following files to the project.
  2. ColorChooser.h & ColorChooser.cpp
    PaletteWnd.h & PaletteWnd.cpp
    WebColorWnd.h & WebColorWnd.cpp
    SysColorWnd.h & SysColorWnd.cpp
    
  3. Where the CColorChooser is to be implemented add the include file.
    #include "ColorChooser.h"
  4. Create a placeholder for the CColorChooser in the class
    class CYourView : public CView...
    {
    public:
    	CColorChooser*	m_pWndColorChooser;
  5. Initialize in the constructor
    CYourView:: CYourView()
    {
    	m_pWndColorChooser = NULL;
    
  6. My example pops the chooser up when the user right mouse clicks.
    void CPaletteTestView::OnRButtonUp(UINT nFlags, CPoint point) 
    {
    	if (m_pwndChooser == NULL)
    	{
    		ClientToScreen(&point);
    		m_pwndChooser = new CColorChooser(point, this, m_crCurr);
    
    	}
    
  7. When the user selects or loses focus I destroy the window and 'catch' the selected color respectively.
    LRESULT CPaletteTestView::OnColorChanged(WPARAM wParam, LPARAM lParam)
    {
    	m_crCurr = lParam; // Color is contained in lParam
    	delete m_pwndChooser;
    	m_pwndChooser = NULL;
    
    	RedrawWindow();
    	return 0;
    }
    
    LRESULT CPaletteTestView::OnColorChooserClose(WPARAM wParam, LPARAM lParam)
    {
    	delete m_pwndChooser;
    	m_pwndChooser = NULL;
    	return 0;
    }
    

This article forms a small part of the future article covering a property list control.

Any bugs,  enhancements or suggestions please don't hesitate to contact me.