Re: Change bk color of read-only CEdit
Thanks for pointing out the gdi resource leak in my code. What I did to
resolve it is declared a private variable of type HBRUSH m_hbr in my
View class and initialized it in the ctor using the CreateSolidBrush.
For deleting it I call DeleteObject on the WM_DESTROY. Following is the
code:
void CNewMsgView::OnDestroy()
{
CResizingDialog::OnDestroy();
DeleteObject( this->m_hbr )
}
and code changes in WM_CTLCOLOR
HBRUSH CNewMsgView::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CResizingDialog::OnCtlColor(pDC, pWnd, nCtlColor);
switch( nCtlColor )
{
case CTLCOLOR_STATIC:
{
if( pWnd->GetDlgCtrlID( ) == IDC_TEXTMSG )
{
pDC->SetBkColor( RGB( 255, 255, 255 ) );
hbr = m_hbr; // <== change here
}
break;
}
}
return hbr;
}
Everything is working fine. I hope this removes the leak right?
Regards,
-aims
Michael K. O'Neill wrote:
And, although I might be reading the code wrong, it seems like you are
creating a new brush each and every time the OnCtlColor handler is called,
in which case you have a GDI resource leak and might quickly run out of
resources.
Mike
"Joseph M. Newcomer" <newcomer@flounder.com> wrote in message
news:q6j6e2d93r03a8s79etgn7ois51rcvkp4r@4ax.com...
Also, you should not be doing this in the parent window; use the
=WM_CTLCOLOR handler to
handle it reflected in the subclass of the edit control. Much cleaner.
joe
On Wed, 16 Aug 2006 06:58:43 -0500, "Jeff Partch" <jeffp@mvps.org> wrote:
"Neo" <momer114@gmail.com> wrote in message
news:1155728894.848411.299890@b28g2000cwb.googlegroups.com...
I am working on MFC using vs2k5. I place one edit control in SDI
application and write "WM_CTLCOLOR" message to change edit control
bk color and its working fine, but it doesn't work when read-only is
set on it.
Code for "WM_CTLCOLOR":
HBRUSH CNewMsgView::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CResizingDialog::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: Change any attributes of the DC here
switch( nCtlColor )
{
case CTLCOLOR_EDIT:
{
if( pWnd->GetDlgCtrlID( ) == IDC_TEXTMSG )
{
/*pDC->SetTextColor( RGB( 120, 0, 0 ) );*/
hbr = CreateSolidBrush( RGB( 255, 255, 255 ) );
}
break;
}
}
// TODO: Return a different brush if the default is not desired
return hbr;
}
How do I make it work when read-only is set to true?
Read-only edit controls use CTLCOLOR_STATIC.
Joseph M. Newcomer [MVP]
email: newcomer@flounder.com
Web: http://www.flounder.com
MVP Tips: http://www.flounder.com/mvp_tips.htm