Solved

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

Posted on 2004-08-20
4
1,903 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

Live: Real-Time Solutions, Start Here

Receive instant 1:1 support from technology experts, using our real-time conversation and whiteboard interface. Your first 5 minutes are always free.

Question has a verified solution.

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

Suggested Solutions

Title # Comments Views Activity
how do i create updater to My Activex application? 3 86
maxBlock challenge 30 127
canBalance challenge 34 80
Message not shown 5 49
If you use Adobe Reader X it is possible you can't open OLE PDF documents in the standard. The reason is the 'save box mode' in adobe reader X. Many people think the protected Mode of adobe reader x is only to stop the write access. But this fe…
Have you tried to learn about Unicode, UTF-8, and multibyte text encoding and all the articles are just too "academic" or too technical? This article aims to make the whole topic easy for just about anyone to understand.
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.
Microsoft Active Directory, the widely used IT infrastructure, is known for its high risk of credential theft. The best way to test your Active Directory’s vulnerabilities to pass-the-ticket, pass-the-hash, privilege escalation, and malware attacks …

805 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