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
- Include the add the following files to the project.
ColorChooser.h & ColorChooser.cpp
PaletteWnd.h & PaletteWnd.cpp
WebColorWnd.h & WebColorWnd.cpp
SysColorWnd.h & SysColorWnd.cpp
- Where the
CColorChooser
is to be implemented add the
include file.
#include "ColorChooser.h"
- Create a placeholder for the
CColorChooser
in the class
class CYourView : public CView...
{
public:
CColorChooser* m_pWndColorChooser;
- Initialize in the constructor
CYourView:: CYourView()
{
m_pWndColorChooser = NULL;
- 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);
}
- 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;
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.