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

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


Large Button ToolBar Refresh Problem

Eric Marc Loebenberg -- loebenbe@qc.bell.ca
Tuesday, October 01, 1996

Kaline, thank you very much, this definately solves part of the problem. 
However, the following problems are still there.

a) if the toolbar is floating, the CFrameWnd::RecalcLayout has no effect
and I still have to click in the floating toolbar to get it to
recalculate.

b) I have a dynamically placed combo box in the toolbar.  When doing the
RecalcLayout, the box remains where it was although all the buttons are
now correctly displayed.  When I click on the toolbar, the combo box is
then redrawn in the correct spot.

Do you have any ideas.  Thanks a lot!
----------
> From: Kaline den UIjl 
> To: Eric Marc Loebenberg 
> Subject: Re: Large Button ToolBar Refresh Problem
> Date: Tuesday, October 01, 1996 3:32 AM
> 
> Eric Marc Loebenberg wrote:
> > 
> > Environment: MSVC 4.2, Windows 95
> > 
> > I have two sets of toolbar buttons, small and large.
> > When I switch from small to large, the large are runcated to the
height of
> > the small toolbar.
> > When I switch from large to samll, the toolbar height remains large
and
> > the small buttons are displayed.
> > 
> > - I am using ....
> >   SetSizes(sizeButton, sizeImage);
> >   SetHeight(sizeButton.cy+10);
> >   LoadBitmap(nToolBar);
> >   Invalidate();
> > 
> > - When I click anywhere on the toolbar, it then correctly displays the
> > toolbar
> >   height
> > 
> > Can anyone tell me what I have to do to get the toolbar properly
refreshed
> > after loading
> > the smaller or larger bitmap?
> > 
> > ***************************************************************
> >   Eric Marc Loebenberg                  loebenbe@qc.bell.ca
> >   Bell Sygma Inc.
> >   700 de la Gauchetiere West       Tel: 514-870-0465
> >   Room 14W1                        Fax: 514-870-7583
> >   Montreal, Quebec, Canada
> >   H3B 4L1
> > 
> > ***************************************************************
> >   Eric Marc Loebenberg                  loebenbe@qc.bell.ca
> >   Bell Sygma Inc.
> >   700 de la Gauchetiere West       Tel: 514-870-0465
> >   Room 14W1                        Fax: 514-870-7583
> >   Montreal, Quebec, Canada
> >   H3B 4L1
> 
> Hello,
> 
> You need to do a RecalcLayout(TRUE). The SetHeight() and Invalidate()
> are not neccessary.
> 
> Kaline den Uijl



Jim Alsup -- epi!alsup@amd.com
Wednesday, October 02, 1996

I avoided these problems in my app by creating both a big toolbar and a
small toolbar.  I then always kept one or the other toolbar hidden.  
This maybe wasn't the most efficent method, but it was pretty simple,
and had a positive (for us) side effect of allow different positioning 
for small vrs large toolbars.

-jim alsup   ja@episupport.com


On  1 Oct 96 at 8:58, Eric Marc Loebenberg wrote about "Re: Large 
Button ToolBar Refresh Pr":

> From:          "Eric Marc Loebenberg" 
> To:            "Kaline den UIjl" 
> Cc:            "MFC" 
> Subject:       Re: Large Button ToolBar Refresh Problem
> Date:          Tue, 1 Oct 1996 08:58:11 -0400
> Reply-to:      mfc-l@netcom.com

> Kaline, thank you very much, this definately solves part of the problem. 
> However, the following problems are still there.
> 
> a) if the toolbar is floating, the CFrameWnd::RecalcLayout has no effect
> and I still have to click in the floating toolbar to get it to
> recalculate.
> 
> b) I have a dynamically placed combo box in the toolbar.  When doing the
> RecalcLayout, the box remains where it was although all the buttons are
> now correctly displayed.  When I click on the toolbar, the combo box is
> then redrawn in the correct spot.
> 
> Do you have any ideas.  Thanks a lot!
> ----------
> > From: Kaline den UIjl 
> > To: Eric Marc Loebenberg 
> > Subject: Re: Large Button ToolBar Refresh Problem
> > Date: Tuesday, October 01, 1996 3:32 AM
> > 
> > Eric Marc Loebenberg wrote:
> > > 
> > > Environment: MSVC 4.2, Windows 95
> > > 
> > > I have two sets of toolbar buttons, small and large.
> > > When I switch from small to large, the large are runcated to the
> height of
> > > the small toolbar.
> > > When I switch from large to samll, the toolbar height remains large
> and
> > > the small buttons are displayed.
> > > 
> > > - I am using ....
> > >   SetSizes(sizeButton, sizeImage);
> > >   SetHeight(sizeButton.cy+10);
> > >   LoadBitmap(nToolBar);
> > >   Invalidate();
> > > 
> > > - When I click anywhere on the toolbar, it then correctly displays the
> > > toolbar
> > >   height
> > > 
> > > Can anyone tell me what I have to do to get the toolbar properly
> refreshed
> > > after loading
> > > the smaller or larger bitmap?
> > > 
> > > ***************************************************************
> > >   Eric Marc Loebenberg                  loebenbe@qc.bell.ca
> > >   Bell Sygma Inc.
> > >   700 de la Gauchetiere West       Tel: 514-870-0465
> > >   Room 14W1                        Fax: 514-870-7583
> > >   Montreal, Quebec, Canada
> > >   H3B 4L1
> > > 
> > > ***************************************************************
> > >   Eric Marc Loebenberg                  loebenbe@qc.bell.ca
> > >   Bell Sygma Inc.
> > >   700 de la Gauchetiere West       Tel: 514-870-0465
> > >   Room 14W1                        Fax: 514-870-7583
> > >   Montreal, Quebec, Canada
> > >   H3B 4L1
> > 
> > Hello,
> > 
> > You need to do a RecalcLayout(TRUE). The SetHeight() and Invalidate()
> > are not neccessary.
> > 
> > Kaline den Uijl
> 
> 



Roger Onslow/Newcastle/Computer Systems Australia/
Saturday, October 05, 1996

I use the following code for Large/Small buttons in a CToolbar-derive class

 LoadToolBar ();  // loads the appropriate toolbar (large/small)
 CFrameWnd* pParentFrame = GetDockingFrame ();
 if (pParentFrame) pParentFrame->RecalcLayout ();

This works fine for me !

Roger



Eric Marc Loebenberg -- loebenbe@qc.bell.ca
Sunday, October 06, 1996

Thanks to those who responded to this problem.  

First, here is a copy of the original problem:
> 
> Environment: MSVC 4.2, Windows 95
> 
> I have two sets of toolbar buttons, small and large.
> When I switch from small to large, the large are truncated to the height
of
> the small toolbar.
> When I switch from large to small, the toolbar height remains large and
> the small buttons are displayed.
> 
> - I am using ....
>   SetSizes(sizeButton, sizeImage);
>   SetHeight(sizeButton.cy+10);
>   LoadBitmap(nToolBar);
>   Invalidate();
> 
> - When I click anywhere on the toolbar, it then correctly displays the
> toolbar
>   height
> 
> Can anyone tell me what I have to do to get the toolbar properly
refreshed
> after loading
> the smaller or larger bitmap?

After some trial and error experimentation, I came up with a working
solution.
Firstly I create my toolbar on the heap rather a member of the frame
window.  This allows me to easily delete it and recreate with appropriate
constructors/destructors.

If the toolbar is not floating, the solution is very simple:

You use CToolBar::SetSizes() and CToolBar::LoadBitMap(), then
CFrameWnd::RecalcLayout();

If the toolbar is floating, you have to destroy it (Thanks James), and
recreate it.
Before doing so, it is a good idea to save the style and position.  I used
something like this within my frame window:

    // only if changed button size and toolbar is floating
    if ((bLargeButtons != ToolDlg.m_bLarge) && m_ToolBar->IsFloating()) {
      CRect  rect;   // floating toolbar's rectangle
      CPoint point;  // floating toolbar's top left point
      DWORD  style;  // floating toolbar's toolbar style
      m_ToolBar->GetWindowRect(&rect);
      point.x = rect.left;
      point.y = rect.top;
      style = m_ToolBar->GetBarStyle();
      m_ToolBar->DestroyWindow();
      delete m_ToolBar;
      CreateToolBar();
      FloatControlBar(m_ToolBar,point,style);
      m_ToolBar->SetBox();  // sets the combo box or edit box
    }
    else {
      // change bitmap and toolbar button size
      m_ToolBar->SetColorAndSize(ToolDlg.m_bColor,ToolDlg.m_bLarge);
      RecalcLayout(TRUE);
    }

-- 
***************************************************************
  Eric Marc Loebenberg                  loebenbe@qc.bell.ca
  Bell Sygma Inc.                    
  700 de la Gauchetiere West       Tel: 514-870-0465
  Room 14W1                        Fax: 514-870-7583
  Montreal, Quebec, Canada
  H3B 4L1



Jim Barry -- Jim.Barry@ilp.com
Wednesday, October 09, 1996


Environment: MSVC 4.1, Windows 95

Here's my distillation of how to swap between small and large toolbar   
buttons:

BOOL CMainFrame::SetToolBarSize(BOOL fBigButtons)
{
 if (!m_wndToolBar.LoadToolBar(
  fBigButtons ? IDR_MAINFRAME_LARGE : IDR_MAINFRAME))
 {
  TRACE0("Failed to load toolbar\n");
  return FALSE;      // fail
 }

 m_wndToolBar.GetDockingFrame()->RecalcLayout();
 m_fBigButtons = fBigButtons;
 
 return TRUE;
}

This works admirably for such a small amount of code. The only trouble is   
that I would like to preserve the number of rows in the toolbar (if   
floating) when the button size changes. At the moment, if I swap between   
the two sizes, the toolbar gets thinner and thinner until it is a single   
column. I tried using CToolBarCtrl::GetRows and CToolBarCtrl::SetRows,   
but it looks like GetRows returns incorrect values and SetRows totally   
ignores the requested row count!

Any ideas?

 - Jim  




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