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

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


Status bars.

Colin Angus Mackay -- colin.angus.mackay@dial.pipex.com
Wednesday, December 04, 1996

Environment: VC++ 4.1, Win 95, Win NT 3.51

I have used the Component Gallery to create panes for the status bar, I
now want to replace one of them (The date one) with a pane that contains
a drawing (not a bitmap).

How do I draw what I want into that particular pane?

Thanks,
Colin Angus Mackay



Dicky Singh -- Dicky@landmark.com
Friday, December 06, 1996

[Mini-digest: 4 responses]

You want to make the pane in question owner draw, use SetPaneInfo(...,SBPS_OWNERDRAW|..., ...)

derive a class from CStatusBar and add virtual fn: DrawItem(LPDRAWITEMSTRUCT);

Help does not list DrawItem(LPDRAWITEMSTRUCT); to be an overridable, see
\mfc\include\afxext.h

----------
From: 	Colin Angus Mackay[SMTP:colin.angus.mackay@dial.pipex.com]
Sent: 	Wednesday, December 04, 1996 4:43 a
To: 	Microsoft Foundation Class List
Subject: 	Status bars.

Environment: VC++ 4.1, Win 95, Win NT 3.51

I have used the Component Gallery to create panes for the status bar, I
now want to replace one of them (The date one) with a pane that contains
a drawing (not a bitmap).

How do I draw what I want into that particular pane?

Thanks,
Colin Angus Mackay



--------------------
Dicky Singh, Dicky@Landmark.COM
Dragon Team. Landmark Systems Inc.
8000 Towers Crescent, Vienna VA 22182
-----From: Ian Pepper 

There's and example on the MSDN CD that show's how to render a bitmap
into a status bar pane.  Search for Q149407 in the KB. For completeness:

Step-by-Step Example and Sample Code
------------------------------------
 
1. Derive a class from CStatusBar (for example, CMyStatusBar), and use
this
   class instead of CStatusBar in CMainFrame.
 
2. Add the following member functions to the class definition in the .h
   file:
 
   class CMyStatusBar : public CStatusBar
   {
   ...
   #if _MFC_VER < 0x400
       virtual void DoPaint(CDC* pDC);
   #endif
 
   #if _MFC_VER >= 0x400
       virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
   #endif
   ...
   }
 
3. Add the following code for the functions in the .cpp file:
 
   #if _MFC_VER < 0x400
   void CMyStatusBar::DoPaint(CDC* pDC)
   {
       CRect rect;
       GetItemRect(1, &rect);  // get pane rect
       pDC->ExcludeClipRect(&rect);  // exclude pane rect from paint
       CStatusBar::DoPaint(pDC);  // paint remainder of status bar
 
       CRgn paneRgn;
       paneRgn.CreateRectRgnIndirect(rect);
       pDC->SelectClipRgn(&paneRgn); // set clip region to pane rect
 
       CBitmap* pBitmap = /* pointer to current CBitmap */;
       CDC srcDC; // select current bitmap into a compatible CDC
       srcDC.CreateCompatibleDC(NULL);
       CBitmap* pOldBitmap = srcDC.SelectObject(pBitmap);
       pDC->BitBlt(rect.left, rect.top, rect.Width(), rect.Height(),
                 &srcDC, 0, 0, SRCCOPY); // BitBlt to pane rect
       srcDC.SelectObject(pOldBitmap);
   }
   #endif
 
   #if _MFC_VER >= 0x400
   void CMyStatusBar::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
   {
       switch(lpDrawItemStruct->itemID)
       {
       case 1:
           // Attach to a CDC object
           CDC dc;
           dc.Attach(lpDrawItemStruct->hDC);
 
           // Get the pane rectangle and calculate text coordinates
           CRect rect(&lpDrawItemStruct->rcItem);
 
           CBitmap* pBitmap = /* pointer to current CBitmap */;
           CDC srcDC; // select current bitmap into a compatible CDC
           srcDC.CreateCompatibleDC(NULL);
           CBitmap* pOldBitmap = srcDC.SelectObject(pBitmap);
           dc.BitBlt(rect.left, rect.top, rect.Width(), rect.Height(),
                     &srcDC, 0, 0, SRCCOPY); // BitBlt to pane rect
           srcDC.SelectObject(pOldBitmap);
 
           // Detach from the CDC object, otherwise the hDC will be
           // destroyed when the CDC object goes out of scope
           dc.Detach();
 
           return;
       }
 
       CStatusBar::DrawItem(lpDrawItemStruct);
   }
   #endif
 
4. Add the following code to CMainFrame::OnCreate().
 
   int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
   {
   ...
       if (!m_wndStatusBar.Create(this) ||
           !m_wndStatusBar.SetIndicators(indicators,
             sizeof(indicators)/sizeof(UINT)))
 
           TRACE0("Failed to create status bar\n");
           return -1;      // fail to create
       }
 
   // Add the following code
   #if _MFC_VER >= 0x400
       UINT nID, nStyle;
       int cxWidth;
 
       m_wndStatusBar.GetPaneInfo(1, nID, nStyle, cxWidth);
       m_wndStatusBar.SetPaneInfo(1, nID, nStyle | SBT_OWNERDRAW,
           cxWidth);
   #endif
   ...
   }
 
Cheers,

Ian
ian@flexicom.ie


>
-----From: Dean Grimm 

The following works for me:
1) Subclass CStatusBar
2) In your new class, override the DrawItem member function (this is where your drawing occurs)
3) Change your mainframe class so it uses your status bar
4) in mainframe->OnCreate, after you create the status bar, add 
    myStatusBar.SetPaneInfo(...) with SBT_OWNERDRAW added

Hope this helps,
Dean Grimm                         Software Engineer / Cortron Corp.

----------
From: 	Colin Angus Mackay
Sent: 	Wednesday, December 04, 1996 1:43 AM
To: 	Microsoft Foundation Class List
Subject: 	Status bars.

Environment: VC++ 4.1, Win 95, Win NT 3.51

I have used the Component Gallery to create panes for the status bar, I
now want to replace one of them (The date one) with a pane that contains
a drawing (not a bitmap).

How do I draw what I want into that particular pane?

Thanks,
Colin Angus Mackay
-----From: Joe willmann 

1. Make your own CMyStatusBar class derived from CStatusBar
2. In OnCreate() call GetStatusBarCtrl() to get the underling control rhen
call ctrl->SetText(,,SBT_OWNERDRAWM) to make the pane an ownwe drawn control.
3.  In DrawItem() check the pDS->itemId to see if it is yours.  If so draw!


At 09:43 AM 12/4/96 +0000, you wrote:
>Environment: VC++ 4.1, Win 95, Win NT 3.51
>
>I have used the Component Gallery to create panes for the status bar, I
>now want to replace one of them (The date one) with a pane that contains
>a drawing (not a bitmap).
>
>How do I draw what I want into that particular pane?
>
>Thanks,
>Colin Angus Mackay
>
>

Joe Willmann
My opinions are my own, not Tektronix, or anyone elses for that matter!





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