Go Premium for a chance to win a PS4. Enter to Win

x
?
Solved

Small Memory Leak in Toolbar creation

Posted on 2004-04-30
6
Medium Priority
?
462 Views
Last Modified: 2013-12-03
I use this code to create a toolbar & rebar for a dialogbox.

HIMAGELIST hL ; // handle to an imagelist that contains the bitmaps
void CreateToolbarForDialog(HWND hh,int numb,int Buttons[],int ids[],char* Texts[])
      {
   HWND MainRebar = 0;
   HWND MainToolbar = 0;
   MainRebar = CreateWindowEx(0,REBARCLASSNAME,0,WS_BORDER | RBS_VARHEIGHT | RBS_AUTOSIZE | RBS_FIXEDORDER | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | CCS_NODIVIDER | CCS_NOPARENTALIGN | WS_VISIBLE | WS_BORDER | WS_CHILD,0, 0, 2000, 60,hh,(HMENU)9901,hAppInstance,0);

   TBBUTTON tbButtons[32];
   for(int i = 0 ;  i < 32 ; i++)
         {
      tbButtons[i].iBitmap = Buttons[i];
      tbButtons[i].idCommand = ids[i];
      tbButtons[i].fsState = TBSTATE_ENABLED;
      tbButtons[i].fsStyle = TBSTYLE_BUTTON;
      tbButtons[i].dwData = 0;
      if (ids[i] == -1)
            tbButtons[i].fsStyle |= TBSTYLE_SEP;
      }

      MainToolbar = CreateToolbarEx(hh,CCS_NODIVIDER | CCS_NORESIZE | TBSTYLE_TRANSPARENT | WS_CHILD | TBSTYLE_TOOLTIPS | TBSTYLE_FLAT | WS_VISIBLE,9902,0,0,0,0,0,20,20,20,20,sizeof(TBBUTTON));

   SendMessage(MainToolbar,TB_SETIMAGELIST,0,(LPARAM)hL);

   for(int i = 0 ; i < numb ; i++)
      tbButtons[i].iString = SendMessage(MainToolbar,TB_ADDSTRING,0,(LPARAM)Strings[i]);

   SendMessage(MainToolbar,TB_ADDBUTTONS,numb,(LPARAM)&tbButtons[0]);

   REBARBANDINFO rbBand;
   memset(&rbBand,0,sizeof(rbBand));
   rbBand.cbSize = sizeof(REBARBANDINFO);
   rbBand.fMask = RBBIM_COLORS |      // clrFore and clrBack are valid
               RBBIM_CHILD |                        // hwndChild is valid
                 RBBIM_CHILDSIZE |                  // cxMinChild and cyMinChild are valid
                 RBBIM_STYLE |                        // fStyle is valid
                 RBBIM_ID |                               // wID is valid
                 RBBIM_BACKGROUND;                  // hbmBack is valid
   rbBand.hbmBack = 0;
   rbBand.clrFore = GetSysColor(COLOR_BTNTEXT);
   rbBand.clrBack = GetSysColor(COLOR_BTNFACE);
   rbBand.fStyle = RBBS_NOVERT |      // do not display in vertical orientation
               RBBS_FIXEDSIZE |
                RBBS_FIXEDBMP;
   rbBand.hwndChild = MainToolbar;
   rbBand.wID = 1001;
   rbBand.cxMinChild = 0;
   rbBand.cyMinChild = 40;
   rbBand.cyMaxChild = 450;


   // Insert band into rebar
   ::SendMessage(MainRebar, RB_INSERTBAND, (UINT) -1, (LPARAM) (LPREBARBANDINFO) &rbBand);

   }

When I finish with the dialog, I use    SendMessage(hT,TB_SETIMAGELIST,0,0) to clear the imagelist from the toolbar hT before destroying the dialog. Each time the dialog is created, I see in the Process Manager more and more memory to be reserved (16K each time).
What am I doing wrong ?

Thanks
0
Comment
Question by:WxW
5 Comments
 
LVL 16

Expert Comment

by:nonubik
ID: 10958827
For instance, try to SendMessage with TB_DELETEUTTON for each button you add.
0
 
LVL 6

Author Comment

by:WxW
ID: 10961742
It doesn't work. Suspect something goes wrong with the image lis\t, but what ?
0
 
LVL 6

Expert Comment

by:joghurt
ID: 10980611
Do you call ImageList_Destroy when you destroy the dialog?
0
 
LVL 6

Author Comment

by:WxW
ID: 10980992
Yes.
I found the problem.
I should use CreateWindowEx(). CreateToolbarEx() does something that allocates memory (internal leak?) and does not free it after I destroy the dialog.

0
 

Accepted Solution

by:
modulo earned 0 total points
ID: 11248555
PAQed, with points refunded (250)

modulo
Community Support Moderator
0

Featured Post

Vote for the Most Valuable Expert

It’s time to recognize experts that go above and beyond with helpful solutions and engagement on site. Choose from the top experts in the Hall of Fame or on the right rail of your favorite topic page. Look for the blue “Nominate” button on their profile to vote.

Question has a verified solution.

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

In this article, I will show how to use the Ribbon IDs Tool Window to assign the built-in Office icons to a ribbon button.  This tool will help us to find the OfficeImageId that corresponds to our desired built-in Office icon. The tool is part of…
Entering time in Microsoft Access can be difficult. An input mask often bothers users more than helping them and won't catch all typing errors. This article shows how to create a textbox for 24-hour time input with full validation politely catching …
This is Part 3 in a 3-part series on Experts Exchange to discuss error handling in VBA code written for Excel. Part 1 of this series discussed basic error handling code using VBA. http://www.experts-exchange.com/videos/1478/Excel-Error-Handlin…
Look below the covers at a subform control , and the form that is inside it. Explore properties and see how easy it is to aggregate, get statistics, and synchronize results for your data. A Microsoft Access subform is used to show relevant calcul…

783 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