Solved

Cannot get Static Picture Control (Rectangle Mode) to change color

Posted on 2004-08-20
4
1,883 Views
Last Modified: 2013-11-20
Hey Everybody;

I am currently trying to get Static Picture Control in Rectangle Mode to Change colors from the default black, grey, or white. Here is my code to do so,

HBRUSH Cdev_discDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
      HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
      switch (nCtlColor) {
            case CTLCOLOR_STATIC:
                   if (pWnd->GetDlgCtrlID() == IDC_myRectangle)
                   {
                         pDC->SetBkMode(OPAQUE);
                         pDC->SetBkColor(RGB(150, 150, 150));
                         return m_pBkBrush;
                   }
                   else
                   {
                        pDC->SetTextColor(RGB(54, 51, 127));
                        pDC->SetBkColor(RGB(209, 208, 226));
                   }
                  // Drop through to return the background brush.
            case CTRLCOLOR_DLG:
                  return m_pBkBrush;

            default:
                   return m_pBkBrush;
       }
   }

Now the function works correctly for all other controls. I can get it to change the dialogue and other static controls but not the rectangle. Any help would be greatly appreciated
0
Comment
Question by:komeisa
4 Comments
 
LVL 48

Expert Comment

by:AlexFM
ID: 11857922
OnCtlColor function may be used to change dialog controls color and text parameters. To change control reclangle you need MoveWindow function. To get current dialog control rectangle, use GetWindowRect function. OnCtlColor is not a good place to move the controls. You may do this in any other place of the program. For example, after pressing of some button you want to move some dialog control:

void CMyDialog::OnSomeButton()
{
    CRect rect;
    CWnd* pWnd = GetDlgItem(IDC_CONTROL_ID);
    pWnd->GetWindowRect(&rect);
    ScreenToClient(&rect);
    rect.left += 10;
    rect.right += 10;
    pWnd->MoveWindow(&rect);
}
0
 
LVL 9

Accepted Solution

by:
Priyesh earned 200 total points
ID: 11864942
SS_xxxRECT style does not seem to work with CtlColor. Not sure why that is.

Tried making a derived class from CStatic and handling the OnPaint like this. Seems to work.
Has the added advantage of having the color as a member in this class.

void CMyStatic::OnPaint()
{
      CPaintDC dc(this) ;
      CRect rc ;
      GetClientRect(rc) ;
      dc.FillSolidRect(rc, RGB(0, 0, 255)) ;
}

HTH
0
 

Expert Comment

by:AnashPO
ID: 11867675
Hi,
   My guess is that SS_xxxRECT style won't work with CtlColor. The following link may explain why.

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnwui/html/msdn_statictl.asp

SS_BLACKRECT
The SS_BLACKRECT static control displays a frame around the control and fills the control with a solid color that is the same color as the Window Frame (COLOR_WINDOWFRAME). The default Windows color is black. The user can change the color by changing the window frame color in the Control Panel, or an application can call SetSysColors.

Obviously, a static with SS_BLACKRECT seems not relying on the brush passed from CtlColor, instead, it fills the rect with COLOR_WINDOWFRAME. I would also suggest the solution as given by Priyesh.

Any info which shows how this can be done as per given in the question would be appreciated.

AnashPO
0
 
LVL 6

Expert Comment

by:nabehs
ID: 11881406
Handle WM_ERASEBKGND and paint the background

BOOL CMyStatic::OnEraseBkgnd(CDC* pDC)
{

    CRect rcBounds;
    GetClientRect(&rcBounds);
    pDC->FillSolidRect(rcBounds, RGB(255, 0, 0)); // FILL WITH RED

    return TRUE;
}
0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
mixString challenge 36 111
if loop in java 3 128
countEvens challenge 2 74
ShiftLeft challenge 21 76
Introduction: Displaying information on the statusbar.   Continuing from the third article about sudoku.   Open the project in visual studio. Status bar – let’s display the timestamp there.  We need to get the timestamp from the document s…
Introduction: Ownerdraw of the grid button.  A singleton class implentation and usage. Continuing from the fifth article about sudoku.   Open the project in visual studio. Go to the class view – CGridButton should be visible as a class.  R…
This video will show you how to get GIT to work in Eclipse.   It will walk you through how to install the EGit plugin in eclipse and how to checkout an existing repository.
Here's a very brief overview of the methods PRTG Network Monitor (https://www.paessler.com/prtg) offers for monitoring bandwidth, to help you decide which methods you´d like to investigate in more detail.  The methods are covered in more detail in o…

914 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

18 Experts available now in Live!

Get 1:1 Help Now