Question

Can I change the colour of a CDialog and CFormView?

Asked by: mwcmp

Can I change the (bkgd) colour of a CDialog and CFormView? If so, how?

This Question has been solved and asker verified All Experts Exchange premium technology solutions are available to subscription members.

Subscribe now for full access to Experts Exchange and get

Instant Access to this Solution

  • Plus...
  • 30 Day FREE access, no risk, no obligation
  • Collaborate with the world's top tech experts
  • Unlimited access to our exclusive solution database
  • Never be left without tech help again

Subscribe Now

Asked On
2004-08-10 at 11:58:59ID21088854
Tags

cdialog

,

change

Topic

Windows MFC Programming

Participating Experts
4
Points
300
Comments
39

Trusted by hundreds of thousands everyday for fast, accurate and reliable tech support.

  • "The time we save is the biggest benefit of Experts Exchange to Warner Bros. What could take multiple guys 2 hours or more each to find is accessed in around 15 minutes on Experts Exchange." Mike Kapnisakis, Warner Bros.
  • "Our team likes having a resource that is more secure than just using Google and most experts using this service really know their stuff. It's nice to look here first versus using Google." Dayna Sellner, Lockheed Martin
  • "Anytime that I've been stumped with a problem, 9 out of 10 times Experts Exchange has either the accepted solution or an open discussion of the potential solution to the problem." Kenny Red, eBay Inc.

See what Experts Exchange can do for you.

Got a question?

We've got the answer.

Experts Exchange has been collecting answers to technology questions since 1996…3 million and counting! If you have a question, chances are we already have your answer.

Screenshot of Experts Exchange Knowledgebase

Need individual assistance?

Our experts are ready to help.

If you can't find the exact answer you're looking for, ask our exclusive community of 50,000 experts. You’ll get a personalized answer from a trusted professional.

Screenshot of Experts Exchange Knowledgebase

Want to learn from the best?

Read articles from industry experts.

Thousands of free tech tips, tricks, how-to’s and tutorials are available in our peer reviewed articles section. See for yourself how smart our experts are, no login required.

Screenshot of an Article

Working on a long term project?

Store your work and research.

Save solutions to your questions, answers you’ve discovered through searching plus helpful articles in your personal knowledgebase for easy future access.

Screenshot of Experts Exchange Knowledgebase

Access the answers to your technology questions today.

Subscribe Now

30-day free trial. Register in 60 seconds.

What Makes Experts Exchange Unique?

Members of the expert community talk about why the experience at Experts Exchange is different than what you will find anywhere else.

Trusted by the world's most respected brands.

image of each brand's logo

Faithfully serving IT professionals since 1996.

Experts Exchange Logo

Try it out and discover for yourself.

Subscribe Now

30-day free trial. Register in 60 seconds.

Related Solutions

  1. GrayString in CDialog
    I have a CDialog class which contains a ListBox, scrollable, and a Checkbutton. When the Checkbutton isn't checked I want the ListBox to be Grayed. This shouldn't be so hard, however the only function I can find is in the CDC class, and can't? be implemented. However there a...
  2. How to embed a CDialog or CView into a CFormView window
    I would like to embed either a CDialog or CView derived object in a CFormView derived object. The child window needs to scroll horizontally. The solution to this problem does not have to utilize these classes I just want to make it easier on myself so that I can write my co...
  3. CFormView, CDialog, and events...
    Environment: VC++ 5.0 and Windows NT 4.0 Hello everyone, I'm creating a CFormView based MDI application and have created a CDialog based class to handle the processing for the dialog itself. My question involves the handling of events. If I add an event handler (for a bu...
  4. CFormView
    Please help How can I destroy the CFormView. Since I'm using this function but isn't working Void CSpSheet::OnFileClose() { CFormView::Destroywindow() }

Free Tech Articles

  1. WARNING: 5 Reasons why you should NEVER fix a computer for free.
    It is in our nature to love the puzzle. We are obsessed. The lot of us. We love puzzles. We love the challenge. We thrive on finding the answer. We hate disarray. It bothers us deep in our soul. W...
  2. SCCM OSD Basic troubleshooting
    SCCM 2007 OSD is a fantastic way to deploy operating systems, however, like most things SCCM issues can sometimes be difficult to resolve due to the sheer volume of logs to sift through and the dispe...
  3. Migrate Small Business Server 2003 to Exchange 2010 and Windows 2008 R2
    This guide is intended to provide step by step instructions on how to migrate from Small Business Server 2003 to Windows 2008 R2 with Exchange 2010. For this migration to work you will need the fo...
  4. Create a Win7 Gadget
    This article shows you how to create a simple "Gadget" -- a sort of mini-application supported by Windows 7 and Vista. Gadgets can be dropped anywhere on the desktop to provide instant information, ...
  5. Outlook continually prompting for username and password
    There have been a lot of questions recently regarding Outlook prompting for a username and password whilst using Exchange 2007. There are a few reasons why this would happen and I will try to cover t...
  6. Backup Exchange 2010 Information Store using Windows Backup
    There seems to be quite a lot of confusion around the ability to backup Exchange 2010 using the built in Windows Backup feature. This stems from the omission of this feature prior to Exchange 2007 s...

Cloud Class Webinars

  1. Avoiding Bugs in Microsoft Access
    Alison Balter takes and in-depth look at avoiding bugs in Access. In this webinar you will learn about using the immediate window to debug your applications, invoking the debugger, using breakpoints to troubleshoot, stepping through code, setting the next statement to execute, ...
  2. Top 10 Best New Features in Visio 2010
    Scott Helmers gives live demonstrations of the top 10 new features in Visio 2010. This webinar will teach you how to create compelling diagrams by adding shapes to the page with a single click, linking the shapes in a diagram to data in Excel (or SQL Server, or SharePoint), ...
  3. IT Consultant Business Secrets Revealed
    Michael Munger, Experts Exchange tech pro and IT consultant, pulls back the curtain on his very successful businesses and answers question on every IT consultant and business owner should know about. He shares secrets on what he did to solve the 5 most common problems in IT, ...
  4. Disaster Recovery and Business Continuity
    Quest CTO, Mike Billon, gives an overview of the steps involved in building a dunamic disaster recovery plan. Through case studies and an examination of software/hardware tooles for monitoring and testing, you'll gain a better understandin of where you are, where you want ...
  5. Organize Your Visio Diagrams with Containers and Lists
    Scott Helmers uses cross functional flowcharts, wireframe diagrams, data graphic legends and seating charts to teach you: how to ustilize all three new structured diagram components in Visio 2010, the best practices for organizeing shapes in previous version of Visio, how to organize ...
  6. How to Us Objects, Properties, Events and Methods in Microsoft Access
    Alison Dalter gives an in-depbth look at objects, properties, events and methods in Microsoft Access. In this webinar you will learn about using the object browser, referring to objects, working with properties and methods, working with object variables, understanding the ...

Join the Community

Give a Little. Get a Lot.

Join the community of experts here and help other tech pros by answering question in your area of expertise. You can earn FREE access to all Experts Exchange's premium features and resources.

Join the Community

Answers

 

by: migelPosted on 2004-08-10 at 12:06:03ID: 11766453

Hi!
You can handle WM_CTLCOLORDLG in the your dialog class
for example:

// m_BackBrush is the CBrush object member of the your class (NOTE it must be created in the construxtor or OnInitDialog methods)
HBRUSH CColoredDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
   // Call the base class implementation first! Otherwise, it may
   // undo what we're trying to accomplish here.
   HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
  if (nCtlColor == CTLCOLOR_DLG || CTLCOLOR_STATIC  == nCtlColor)
   return  (HBRUSH)m_BackBrush;

return hbr;
}

 

by: mwcmpPosted on 2004-08-10 at 12:15:25ID: 11766560

error C2065: 'CTLCOLOR_DLG' : undeclared identifier
warning C4018: '==' : signed/unsigned mismatch

 

by: mwcmpPosted on 2004-08-10 at 12:18:17ID: 11766594

BTW. I had created m_BackBrush as gobal as I do not get what you mean by creating it in the OnInitDialog.
What I mean is, I created it as:
CBrush m_BackBrush(RGB(255,0,0));

How then can I create it in OnInitDialog, but use it in OnCtlColor?

 

by: millsoftPosted on 2004-08-10 at 12:21:56ID: 11766618

You need to declare:

CBrush m_BackBrush;

in the class header, and then initialize it in OnInitDialog:

m_BackBrush.CreateSolidBrush( RGB(255,0,0) );

 

by: millsoftPosted on 2004-08-10 at 12:22:13ID: 11766622

Then it will be available in OnCtlColor

 

by: millsoftPosted on 2004-08-10 at 12:23:22ID: 11766634

 if (nCtlColor == (UINT) CTLCOLOR_DLG || (UINT) CTLCOLOR_STATIC  == nCtlColor)
   return  (HBRUSH)m_BackBrush;

 

by: mwcmpPosted on 2004-08-10 at 12:26:52ID: 11766682

Still the same error:
>error C2065: 'CTLCOLOR_DLG' : undeclared identifier

Do I need to include anything? BTW, I am using EVC.

 

by: jaime_olivaresPosted on 2004-08-10 at 13:45:51ID: 11767495

in your dialog class declaration
   CBitmap m_bg;

in your dialog constructor:

    m_bg.CreateSolidBrush(RGB(255,127,127));        <---- red

Add OnCtrlColor handler:

HBRUSH CYourDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
      HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

      if (!m_bg.GetSafeHandle())
            return hbr;

      switch (nCtlColor) {
            //Edit controls need white background and black text
            //Note the 'return hbr' which is needed to draw the Edit
            //control's internal background (as opposed to text background)
            case CTLCOLOR_EDIT:
                  pDC->SetTextColor(RGB(0,0,0));
                  pDC->SetBkColor(RGB(255,255,255));
                  return hbr;
            //Static controls need black text and same background as m_brush
            case CTLCOLOR_STATIC:
                  LOGBRUSH logbrush;
                  fondo.GetLogBrush( &logbrush );
                  pDC->SetTextColor(RGB(0,0,0));
                  pDC->SetBkColor(logbrush.lbColor);
                  return m_bg;
                                // change background for some controls
            case CTLCOLOR_LISTBOX:
            case CTLCOLOR_SCROLLBAR:
            case CTLCOLOR_BTN:
            case CTLCOLOR_MSGBOX:
                                // change background for dialog itself
            case CTLCOLOR_DLG:
                  return m_bg;
            default:
                  return m_bg;
      }
}

 

by: mwcmpPosted on 2004-08-10 at 20:25:55ID: 11769379

>CBitmap m_bg;
Should this be CBrush? If so, I had changed it...

few errors>>
error C2065: 'fondo' : undeclared identifier
error C2228: left of '.GetLogBrush' must have class/struct/union type
error C2065: 'CTLCOLOR_SCROLLBAR' : undeclared identifier
error C2051: case expression not constant
error C2065: 'CTLCOLOR_DLG' : undeclared identifier
error C2051: case expression not constant

>fondo.GetLogBrush( &logbrush );
Should fondo be m_bg?

 

by: jaime_olivaresPosted on 2004-08-11 at 06:21:59ID: 11772593

Sorry, translating from my own code...
'fondo' must be m_bg.

 

by: jimbucciPosted on 2004-08-11 at 06:22:24ID: 11772599

For a CFormview just handle the WM_ERASEBKGND message in the view class - OnEraseBkhgnd(CDC* pDC).
Here you get the DC of the view window.  You can then draw anything you want in this window.  For example - if you wanted to have a gradient background:

BOOL CMyView::OnEraseBkgnd(CDC* pDC)
{
   CView::OnEraseBkgnd(pDC);
   
   Brush pBrush[64];      // use 64 shades of cyan
   CRect rect,rectWnd;

   // Create brushes
   for( int i = 0; i < 64; i++ )
      pBrush[i].CreateSolidBrush( RGB( 0, 255 - (i * 4), 255 - (i * 4) ));
      
   CWnd* pWnd = pDC->GetWindow();
   pWnd->GetClientRect(&rectWnd);
   
   int nWidth = rectWnd.right;
   int nHeight = rectWnd.bottom;
      
   // Paint screen
   for( i=0; i < nHeight; i++ )
   {
      SetRect( &rect, 0, i, nWidth, i + 1);
      pDC->FillRect( &rect, &pBrush[ ( i * 63 ) / nHeight ] );
   }

   // release brushes to Windows
   for( i = 0; i < 64; i++ )
      DeleteObject( pBrush[i] );

   return TRUE;
}

Jim      

 

by: mwcmpPosted on 2004-08-11 at 08:24:51ID: 11774389

Hi Jim

>Brush pBrush[64];
This should be CBrush instead? As I get an error from it.

and also this error>>
>>error C2039: 'GetWindow' : is not a member of 'CDC'
        C:\Windows CE Tools\wce300\Pocket PC 2002\mfc\include\afxwin.h(590) : see declaration of 'CDC'
CWnd* pWnd = pDC->GetWindow();

 

by: mwcmpPosted on 2004-08-11 at 08:29:41ID: 11774459

Hi Jaime

error C2065: 'CTLCOLOR_SCROLLBAR' : undeclared identifier
error C2051: case expression not constant
 error C2065: 'CTLCOLOR_DLG' : undeclared identifier
error C2051: case expression not constant

Wat's the problem? Why  I keep having the same error...

 

by: jimbucciPosted on 2004-08-11 at 08:50:30ID: 11774714

Yes, Brush should be CBrush.
When I look up the help for CDC, GetWindow() is a member function - at least in non-Windows CE land.  Is this your platform?
Jim

 

by: mwcmpPosted on 2004-08-11 at 08:59:15ID: 11774811

Win CE

 

by: jimbucciPosted on 2004-08-11 at 09:10:52ID: 11774950

ok, well, then get the window from the view itself.
the this pointer is the pointer to the CWnd* of the view

CWnd* pWnd = (CWnd *) this;

Jim

 

by: mwcmpPosted on 2004-08-11 at 09:16:41ID: 11775029

my formView remains white..

 

by: mwcmpPosted on 2004-08-11 at 09:52:57ID: 11775473

Jim

Do you have any idea what went wrong?

 

by: jimbucciPosted on 2004-08-11 at 10:00:47ID: 11775571

Try just calling GetClientRect() - you're already in the view class.  Remove the call to get the CWnd * - it's not necessary.
Can you step thru the code?  I don't have a WinCE setup so I don't know what it entails for debugging.
Jim

 

by: mwcmpPosted on 2004-08-11 at 10:49:24ID: 11776208

Ok. There is no error, but the view is still white.
Any more suggestion?

 

by: jimbucciPosted on 2004-08-11 at 10:51:46ID: 11776234

Comment out the call to CView::OnEraseBkgnd(pDC) - although I don't know what affect that will have.
Jim

 

by: mwcmpPosted on 2004-08-11 at 10:54:29ID: 11776271

Haha. Still the same results.

 

by: jaime_olivaresPosted on 2004-08-11 at 10:55:53ID: 11776284

I think OnCtlColor is the proper way.

 

by: mwcmpPosted on 2004-08-11 at 10:58:55ID: 11776335

But the problem is I have all these errors

error C2065: 'CTLCOLOR_SCROLLBAR' : undeclared identifier
error C2051: case expression not constant
 error C2065: 'CTLCOLOR_DLG' : undeclared identifier
error C2051: case expression not constant

 

by: jaime_olivaresPosted on 2004-08-11 at 11:04:16ID: 11776412

don't know why is not defined but try with:
#define CTLCOLOR_DLG            4
#define CTLCOLOR_SCROLLBAR      5

 

by: mwcmpPosted on 2004-08-11 at 11:23:18ID: 11776639

Jaime
Ok. Thanks. It works now.
Can that piece of code work for CFormView too?

 

by: jaime_olivaresPosted on 2004-08-11 at 11:24:40ID: 11776655

Not tried, just do it.

 

by: jimbucciPosted on 2004-08-11 at 11:28:48ID: 11776709

It must be a WinCE thing - because the code I gave you works on a Windows PC - Win2K.
Jim

 

by: mwcmpPosted on 2004-08-11 at 11:42:01ID: 11776894

It can't seems to work for view.
If that of a dialog is CTLCOLOR_DLG, what's the value for that o a view?

 

by: mwcmpPosted on 2004-08-11 at 11:43:30ID: 11776915

What is the equivlent of OnInitDialog for a view?

 

by: jimbucciPosted on 2004-08-11 at 11:45:49ID: 11776940

OnInitialUpdate()

 

by: jimbucciPosted on 2004-08-11 at 11:47:15ID: 11776955

Does WinCE send a WM_ERASEBKGND message?

 

by: mwcmpPosted on 2004-08-11 at 11:56:46ID: 11777054

>Does WinCE send a WM_ERASEBKGND message?
I suppose not.


OnCtlColor don't seems to work for view

 

by: jimbucciPosted on 2004-08-11 at 12:02:46ID: 11777120

Can you debug your app in WinCE?
OnCtlColor is used for windows controls that are child controls of a window - doesn't get called when a view has no controls.

What if you try setting the the brush color to one color RGB(0,0,255) instead of multiple brushes...
Jim

 

by: mwcmpPosted on 2004-08-11 at 12:16:06ID: 11777268

Hmm.. Can't seems to work either

 

by: mwcmpPosted on 2004-08-12 at 09:25:43ID: 11785533

How abotu RedrawWindow or using a CStatic?
I read about people using them to change their view colour. But I tried and it still remains white. How should I use them?

 

by: mwcmpPosted on 2004-08-12 at 09:36:28ID: 11785659

void CGuiderView::OnDraw(CDC* pDC)
{
      CGuiderDoc* pDoc = GetDocument();
      ASSERT_VALID(pDoc);
      
            CStatic myStatic;
      CRect rect;
      GetClientRect(&rect);
            int nX = rect.left;
            int nY = rect.top;
      myStatic.Create(NULL, WS_CHILD|WS_VISIBLE|SS_CENTER,
            CRect(0,0,nX,nY), this);

      CBrush bb(RGB(255,127,127));
      pDC->FillRect( &rect, &bb);
      myStatic.Invalidate() ;
}

And I manage to change the background colour of my view. But the problem is, the background of my button and static control did not change.
What should I do?

 

by: jimbucciPosted on 2004-08-12 at 11:22:03ID: 11786739

mwcmp,

The pDC is the DC of your view - the controls are not affected.
To change the color of a static you need to handle the WM_CTLCOLOR message.  You return an HBRUSH from the call.  But in there you can check the id of the control and change its background.  Here is some code:

HBRUSH CMyDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
   HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
   switch (nCtlColor)      
   {
      case CTLCOLOR_STATIC:
         switch (pWnd->GetDlgCtrlID())
         {
            case IDC_WELCOMETEXT:
      SetStaticFont( pWnd, 6 );
                pDC->SetTextColor(RGB(0, 0, 255));
      break;
           
            default:
               break;
         }
      break;

      default:
         break;
    }

   // TODO: Return a different brush if the default is not desired
   return hbr;
}

This should do the trick.
Jim

 

by: mwcmpPosted on 2004-08-12 at 22:35:24ID: 11790581

What if I had used the code that you had posted, but only that it is in the OnDraw()

void CGuiderView::OnDraw(CDC* pDC)
{
      //CGuiderDoc* pDoc = GetDocument();
      //ASSERT_VALID(pDoc);
      
      CBrush pBrush[64];     // use 64 shades of cyan
      
      for( int i = 0; i < 64; i++ )
                     pBrush[i].CreateSolidBrush( RGB( 0, 255 - (i * 4), 255 - (i * 4) ));

      CRect rect,rectWnd;
      int nWidth, nHeight;

      GetClientRect(&rectWnd);

      nWidth = rectWnd.right;
      nHeight = rectWnd.bottom;

      for( i=0; i < nHeight; i++ )
      {
            SetRect( &rect, 0, i, nWidth, i + 1);
            pDC->FillRect( &rect, &pBrush[ ( i * 63 ) / nHeight ] );
      }

      for( i = 0; i < 64; i++ )
            DeleteObject( pBrush[i] );
}

for this, I cannot set them to gradient colour too, am I right?
the method that you had suggeted only change the colour of the controls into a single colour. Am I right?

20120131-EE-VQP-002

3 Ways to Join

30-Day Free Trial

The Experts

98% positive feedback on 31,087 answers since March 2000. angeliii is a Microsoft Most Valuable Professional for his work with MS SQL Server & Develoment.

He has also proven his knowledge of Visual Basic Programming, PHP Scripting and Oracle Databases.

The Experts

97% positive feedback on 10,752 answers since July 2000. lrmoore has more than 18 years experience in the networking industry.

The six-time Mircosoft MVPs specialties include firewalls, virtual private networking, and network management.

Testimonials

"...and excellent source for support... Kind of like having your very own IT dept." Electriciansnet

Testimonials

"I was apprehensive at signing up at first. However... it has already made my life as an IT administrator much easier." JaCrews

Testimonials

"WOW! You guys have great, active, and knowledgeable people on here." moore50

Business Clients

Business Clients

In the Press

"If you’ve got a question... Experts Exchange can supply an answer.”

In the Press

"...an invaluable aid for both IT professionals and those who require tech support."

In the Press

"where IT professionals provide quick answers on just about any topic"

Business Account Plans

Loading Advertisement...