Color Dialog with Persistent Custom Colors

The MFC CColorDialog class encapulates the standard Color common dialog box. This dialog allows you to select a standard color, pick from a list of custom colors, or expand the dialog to create a color.

However, although you can define a custom color, the MFC implmentation does not save your custom colors for later use.

The following class, derived from CColorDialog, lets you do just this.

// ColorDialog.h : header file
// (c) 1997 Roger Onslow

#ifndef _CMyColorDialog_
#define _CMyColorDialog_

///////////////////////////////////////////////////////////////////////////
//
// CMyColorDialog dialog

class AFX_EXT_CLASS CMyColorDialog : public CColorDialog {
     DECLARE_DYNCREATE(CMyColorDialog);
     // Construction
public:
     CMyColorDialog( COLORREF clrInit = 0, DWORD dwFlags = 0, CWnd*
pParentWnd = NULL );
     // Statics
protected:
     enum { NCUSTCOLORS = 16 };
     static COLORREF c_CustColors[NCUSTCOLORS];
     static COLORREF c_LastCustColors[NCUSTCOLORS];
     static bool c_NeedToInitCustColors;
protected:
     static void InitCustColors();
     static void SaveCustColors();
     // Dialog Data
protected:
     //{{AFX_DATA(CMyColorDialog)
     //}}AFX_DATA
     // Overrides
protected:
     // ClassWizard generate virtual function overrides
     //{{AFX_VIRTUAL(CMyColorDialog)
public:
     virtual int DoModal();
protected:
     virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
     //}}AFX_VIRTUAL
     // Implementation
protected:
     // Generated message map functions
     //{{AFX_MSG(CMyColorDialog)
     //}}AFX_MSG
     DECLARE_MESSAGE_MAP()
};

#endif








///////////////////////////////////////////////////////////////////////////
// ColorDialog.cpp - auto load/save of custom colors CColorDialog extension
// (c) 1997 Roger Onslow

#include "stdafx.h"
#include "ColorDialog.h"

#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif

///////////////////////////////////////////////////////////////////////////
//
// CMyColorDialog property page

IMPLEMENT_DYNCREATE(CMyColorDialog, CColorDialog)

bool CMyColorDialog::c_NeedToInitCustColors = true;
COLORREF CMyColorDialog::c_CustColors[];
COLORREF CMyColorDialog::c_LastCustColors[];

#define SECTION _T("Custom Colors")

void CMyColorDialog::InitCustColors() {
     for (int i = 0; i < NCUSTCOLORS; i++) {
          CString entry; entry.Format("%d",i);
          c_LastCustColors[i] = c_CustColors[i] =
		::AfxGetApp()->GetProfileInt(SECTION,entry,RGB(255,255,255));
     }
     c_NeedToInitCustColors= false;
}

void CMyColorDialog::SaveCustColors() {
     for (int i = 0; i < NCUSTCOLORS; i++) {
          if (c_LastCustColors[i] != c_CustColors[i]) {
               CString entry; entry.Format("%d",i);
               if (c_CustColors[i] == RGB(255,255,255)) {
                    ::AfxGetApp()->WriteProfileString(SECTION,entry,NULL);
               } else {
                    ::AfxGetApp()->WriteProfileInt(SECTION, entry,c_CustColors[i]);
               }
               c_LastCustColors[i] = c_CustColors[i];
          }
     }
}

CMyColorDialog::CMyColorDialog( COLORREF clrInit, DWORD dwFlags, 
		CWnd* pParentWnd) : CColorDialog(clrInit,dwFlags,pParentWnd)
{
     //{{AFX_DATA_INIT(CMyColorDialog)
     //}}AFX_DATA_INIT
     if (c_NeedToInitCustColors) {
          InitCustColors();
     }
     m_cc.lpCustColors = c_CustColors;
}

int CMyColorDialog::DoModal() {
     int code = CColorDialog::DoModal();
     SaveCustColors();
     return code;
}

void CMyColorDialog::DoDataExchange(CDataExchange* pDX) {
     // overridden (calls this base class)
     CColorDialog::DoDataExchange(pDX);
     //{{AFX_DATA_MAP(CMyColorDialog)
     //}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CMyColorDialog, CColorDialog)
//{{AFX_MSG_MAP(CMyColorDialog)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()



Comments

  • Why not a demo project

    Posted by Legacy on 12/04/2003 12:00am

    Originally posted by: cey

    Why not creating a demo project? It takes much time to implement the codes.

    Reply
  • need a project to resolve implementation problems

    Posted by Legacy on 07/20/1999 12:00am

    Originally posted by: Greg Franz

    I have run into a number of problems trying to implement this into a project. Is there any way that you could provide an implementation project.

    Reply
Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • Live Event Date: December 11, 2014 @ 1:00 p.m. ET / 10:00 a.m. PT Market pressures to move more quickly and develop innovative applications are forcing organizations to rethink how they develop and release applications. The combination of public clouds and physical back-end infrastructures are a means to get applications out faster. However, these hybrid solutions complicate DevOps adoption, with application delivery pipelines that span across complex hybrid cloud and non-cloud environments. Check out this …

  • With the average hard drive now averaging one terabyte in size, the fallout from the explosion of user-created data has become an overwhelming volume of potential evidence that law-enforcement and corporate investigators spend countless hours examining. Join Us and SANS' Rob Lee for our 45-minute webinar, A Triage and Collection Strategy for Time-Sensitive Investigations, will demonstrate how to: Identify the folders and files that often contain key insights Reduce the time spent sifting through content by …

Most Popular Programming Stories

More for Developers

RSS Feeds