15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


reflecting message for CDialog

Sean Donohue -- sgd@mwc.gtnet.gov.uk
Friday, November 29, 1996

Environment: VC++4.0,NT 3.51

I've been using a CDialog created from a MainFrame and would like to
have a sort of 'status bar' displayed in it, just a string like
'running' or 'stopped' on a coloured backgroud. I'm trying to use a
CStatic string while changing the text and background colours. However,
I'm currently getting all CStatic areas in the dialog box being changed
and I'm having trouble specifying each area.

The area is called IDC_status and I have a 
class CPanel : public CDialog. I also have created a 
class mystatic : public CStatic which contains an integer member status
and a function 
void update_status(int temp) {status=temp};

I just want to be able to call m_status.update_status() passing a number
to it, and have the mystatic OnCtlColor method set the background colour
and text color according to the number passed, but this requires
something called message reflection which confuses me with its
references to OLE. Here's my current OnCtlColor:

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

    switch (status)
    {
    case (1):
        pDC->SetTextColor(RGB(0,0,0));
        pDC->SetBkColor(RGB(255,0,0));
    case (2):
        pDC->SetTextColor(RGB(0,0,0));
        pDC->SetBkColor(RGB(0,255,0));
    }
    return hbr;
}

Could someone please explain the neccessary message reflection to the
dialog box? Thanks,

-- 
Sean Donohue

sgd@mwc.gtnet.gov.uk



Mario Contestabile -- Mario_Contestabile.UOS__MTL@UOSMTL2.universal.com
Monday, December 02, 1996

>HBRUSH mystatic::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
>{
 >   HBRUSH hbr=CStatic::OnCtlColor(pDC,pWnd,nCtlColor);
>
>    switch (status)
>    {
>    case (1):
>        pDC->SetTextColor(RGB(0,0,0));
>        pDC->SetBkColor(RGB(255,0,0));
>    case (2):
>        pDC->SetTextColor(RGB(0,0,0));
>        pDC->SetBkColor(RGB(0,255,0));
>    }
>    return hbr;
>}
>

Create two brushes in OnInitDialog(), a red and a green one, return them in 
OnCtlColor
when the pWnd is the one you want.

mcontest@universal.com




Rajesh Babu T -- rbabu@hotmail.com
Tuesday, December 03, 1996

>Environment: VC++4.0,NT 3.51
>
>I've been using a CDialog created from a MainFrame and would like to
>have a sort of 'status bar' displayed in it, just a string like
>'running' or 'stopped' on a coloured backgroud. I'm trying to use a
>CStatic string while changing the text and background colours. However,
>I'm currently getting all CStatic areas in the dialog box being changed
>and I'm having trouble specifying each area.
>
>The area is called IDC_status and I have a 
>class CPanel : public CDialog. I also have created a 
>class mystatic : public CStatic which contains an integer member status
>and a function 
>void update_status(int temp) {status=temp};
>
>I just want to be able to call m_status.update_status() passing a number
>to it, and have the mystatic OnCtlColor method set the background colour
>and text color according to the number passed, but this requires
>something called message reflection which confuses me with its
>references to OLE. Here's my current OnCtlColor:
>
>HBRUSH mystatic::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
>{
>    HBRUSH hbr=CStatic::OnCtlColor(pDC,pWnd,nCtlColor);
>
>    switch (status)
>    {
>    case (1):
>        pDC->SetTextColor(RGB(0,0,0));
>        pDC->SetBkColor(RGB(255,0,0));
>    case (2):
>        pDC->SetTextColor(RGB(0,0,0));
>        pDC->SetBkColor(RGB(0,255,0));
>    }
>    return hbr;
>}
>
>Could someone please explain the neccessary message reflection to the
>dialog box? Thanks,
>
>-- 
>Sean Donohue
>
>sgd@mwc.gtnet.gov.uk
>

Hi Sean,

MFC 4.0 provides a feature called “message reflection” that allows these
notification messages to be handled in either the child control window or the
parent window, or in both. So You can now write a control class that sets its
own background color by handling the reflected WM_CTLCOLOR message—all without
relying on the parent. Note that since message reflection is implemented by
MFC, not by Windows, the parent window class must be derived from CWnd for
message reflection to work.

So use -
ON_WM_CTLCOLOR_REFLECT( )afx_msg HBRUSH CtlColor ( CDC* pDC, UINT nCtlColor );
handler in the 'class mystatic'.

ON_WM_CTLCOLOR_REFLECT()
// Note: other code will be in between....

HBRUSH mystatic::CtlColor(CDC* pDC, UINT nCtlColor) 
{
// TODO: Change any attributes of the DC here

// TODO: Return a non-NULL brush if the
//parent's handler should not be called
return NULL;
}

I think it solves the problem.
Bye,

Rajesh Babu
KL,Malaysia
                                  
                                    _/_/_/     _/_/_/  _/_/_/_/_/ 
                                   _/    _/   _/    _/    _/
                                  _/    _/   _/    _/    _/
                                 _/_/_/     _/_/_/      _/
                                _/    _/   _/    _/    _/
                               _/    _/   _/    _/    _/
                              _/    _/   _/_/_/_/    _/


---------------------------------------------------------
Get Your *Web-Based* Free Email at http://www.hotmail.com
---------------------------------------------------------




| Вернуться в корень Архива |