Toolbar in a dialog box?
Richard Steadman -- rsteadma@mmltd.com Monday, October 21, 1996 Environment: VC++ 1.52 on Win95 Hi. I'm having trouble trying to create toolbars in a dialog box. I don't know if this is even possible, since the documentation says "CToolBar objects are usually embedded members of frame-window objects derived from the class CFrameWnd or CMDIFrameWnd", but it doesn't mention using them in dialog boxes. Can anyone point me in the right direction? Is there any sample code regarding this on the VC distibution CD or at Microsoft's ftp site? Thanks, Richard Steadman rsteadma@micromedia.on.ca
Michael Patterson -- patterso@sprynet.com Tuesday, October 22, 1996 [Mini-digest: 9 responses] I think there is one called tooltest or toolbar at the ftp site. I think it might use a .DLL, so you might not want it. I've had the same problem. I ended up having to write a toolbar for dialogs. As long as the dialog is not sizeable, you're OK. I got sidetracked from finishing it, but it worked (except for a few things, which I hadn't implemented). This may be a bad way to do it, but it was easier. There could be something out there that I don't know about, so you might want to check before taking it on. Forgive me if I don't explain it well. 1) Derive a toolbar from CWnd 2) You will also have to have a derived CButton - you might be able to use a CBitmap Button - I didn't try 2) Set up an array containing the ID's (such as) - and put it in the dialog .cpp file static UINT dlgbtns1[] = // toolbar buttons - Menu ID's & Bitmap ID's { // first start w/menu ID then put three bitmap ID's after - 1) UP, 2) DOWN, 3) DISABLED 0, // "0" is like an ID_SEPARATOR IDC_NEW,IDB_ADDREC_UP,IDB_ADDREC_DOWN,IDB_ADDREC_DISABLED, IDC_EDIT,IDB_EDIT_UP,IDB_EDIT_DOWN,IDB_EDIT_DISABLED, IDC_DELETE,IDB_DELETE_UP,IDB_DELETE_DOWN,IDB_DELETE_DISABLED, 0, IDC_SAVE,IDB_SAVE_UP,IDB_SAVE_DOWN,IDB_SAVE_DISABLED, IDC_CANCEL,IDB_CANCEL_UP,IDB_CANCEL_DOWN,IDB_CANCEL_DISABLED, 0, IDC_FIND,IDB_FIND_UP,IDB_FIND_DOWN,IDB_FIND_DISABLED, 0, IDC_HELP,IDB_HELP_UP,IDB_HELP_DOWN,IDB_HELP_DISABLED }; 3) SET THESE 'public' TOOLBAR MEMBERS AS FOLLOWS IN THE DIALOGS 'OnCreate' m_tbar.m_iArrayTotal = sizeof(dlgbtns1)/sizeof(UINT); // num items in array m_tbar.m_pArray = dlgbtns1;// point to array m_tbar.m_hWndDlg = m_hWnd; // assign dialog box window handle to toolbar member // m_tbar.Create(NULL, NULL, WS_VISIBLE|WS_CHILD, r, this, IDC_TOOLBARDLG); m_tbar.m_rect = r; // assign values to member 4) In the dialogs MESSAGE_MAP - set up something to handle the messages from the button(s) such as ON_MESSAGE(WM_BUTTONS_SEND, OnToolbarBtn) and the function LONG OnToolbarBtn(UINT nID, LONG lValue); // The nID would countain the button ID, then you can do what ever you like with it - it's been awhile, but I think I may have done that for scrolling, but that's another story! 5) have a function to use in your toolbar that will change the buttons, so your dailog might call a function such as: m_tbar.ChangeButtonState(IDC_FIND, FALSE); // to disable it 6) In the toolbar CWnd - 'OnCreate' sort through the array and assign the array items to the CButton members (that you dynamically create in this function) - maybe something like below - you're going have to change some of this stuff because I changed some stuff above for (int iT = 0; iT < m_iArrayTotal; iT++) { nMenuItem = *m_pArray++; // if (nMenuItem != 0) { m_pButton[m_iButtons] = new CToolBarDlgBtn; // make sure to delete!@#$% m_pButton[m_iButtons]->m_nID = nMenuItem; // store menu ID associated w/each button m_pButton[m_iButtons]->m_hWndDlg = m_hWndDlg; // store dialog box HWND m_pButton[m_iButtons]->m_bEnabled = TRUE; // initially set button to enabled // m_nMenuID[m_iButtons] = nMenuItem; // store menu ID associated w/ each button // nBitmapID = *m_pArray++; m_pButton[m_iButtons]->m_nBitmapUp = nBitmapID; nBitmapID = *m_pArray++; m_pButton[m_iButtons]->m_nBitmapDown = nBitmapID; nBitmapID = *m_pArray++; m_pButton[m_iButtons]->m_nBitmapDisabled = nBitmapID; // // nBitmapID = *m_pArray++; // NOT a menu ID; tells whether scrollable button or not - don't need this because I took it out // if (nBitmapID == 1) // NOT scrollable // m_pButton[m_iButtons]->m_bScroll = FALSE; // else // scrollable // m_pButton[m_iButtons]->m_bScroll = TRUE; // iT += 3; // incremented four ID's of m_pArray, so don't want "for" to loop extra times (would cause error) // r.left = r.right; // left boundary of button r.right = r.left + 24; // right boundary of button // m_pButton[m_iButtons]->Create(NULL, WS_CHILD|WS_VISIBLE|BS_OWNERDRAW, r, this, ID_BTN1 + (UINT)m_iButtons); // m_hButton[m_iButtons] = m_pButton[m_iButtons]->m_hWnd; // store button's window handle // m_iButtons++; // add one button to sum of total buttons } else // seperator which is equal to 12 pixels { r.left = r.right; r.right = r.left + 12; } } // sorry about the mess 7) Your dialog will comminicate with the toolbar by using the toolbar's public member function. So, the button (that you dynamically create) will have in it's message map - ON_MESSAGE(WM_BTNSTATE, OnButtonState) and you can act upon the button state, nState - LONG OnButtonState(UINT nState, LONG lValue); If I remember correctly, then the toolbar will send a message to the appropriate CButton??? ** I know I have probably left a lot out, but you can get a general idea of how I did it. If you need some more help let me know. Sorry about the mess - but it might give you some general ideas. Take care, Mike At 01:59 PM 10/21/96 -0400, you wrote: >Environment: VC++ 1.52 on Win95 > >Hi. > >I'm having trouble trying to create toolbars in a dialog box. I >don't know if this is even possible, since the documentation says >"CToolBar objects are usually embedded members of frame-window objects >derived from the class CFrameWnd or CMDIFrameWnd", but it doesn't >mention using them in dialog boxes. > >Can anyone point me in the right direction? Is there any sample code >regarding this on the VC distibution CD or at Microsoft's ftp site? > >Thanks, >Richard Steadman >rsteadma@micromedia.on.ca > > > ******************** Michael Patterson patterso@sprynet.com ******************** Phoenix, Arizona, USA -----From: "Brian Weeres"We do it in all of our dialogs (using vc 4.2 but 1.52 should work similar.) During OnInitDialog we call a loadtoolbar method which has the following code. ------------------- code BOOL DLGBase::loadActionBar() { CRect rectWnd; GetWindowRect(rectWnd); if (!m_wndActionBar.Create(this, WS_CHILD | WS_VISIBLE | CBRS_ALIGN_RIGHT)) return FALSE; if (!m_wndActionBar.LoadToolBar(m_nActionBarID)) return FALSE; m_wndActionBar.SetBarStyle(m_wndActionBar.GetBarStyle() | CBRS_TOOLTIPS | CBRS_FLYBY); m_wndActionBar.SendMessage(TB_SETPARENT,(WPARAM) (HWND) m_hWnd); RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0); // bar layout must be vertical CSize csizeToolBar = m_wndActionBar.CalcFixedLayout(0, 0); // default set the Toolbar to the right side of the dialog m_wndActionBar.SetWindowPos(NULL, rectWnd.Width() - csizeToolBar.cx, 20, csizeToolBar.cx, csizeToolBar.cy, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE); return TRUE; } We also do something very similar to put a toolbar on a property sheet. Hope this helps. -------------------------------- Brian Weeres Rescom Ventures Inc. bweeres@rescom.com -----From: Roger Onslow/Newcastle/Computer Systems Australia/AU There is an entry in MS KB on doing just this: Q123158 - SAMPLE: Adding control bars to foundation classes dialogs Also, on Win95 you can also use a toolbar control (but not supported in MFC 1.52) Thanks, Richard Steadman rsteadma@micromedia.on.ca -----From: Gajendra Prasad Yadav Hi, You may want to refer to the DLGBAR(or DLGBAR32) sample which demonstrates how to add a status bar and toolbar to a dialog. You can download this file from the following site: http://www.visionx.com/mfcpro/mskb.htm For downloading click on the "Adding control bars to dialog boxes in MFC" on the above page. Gajendra gajju@aditi.com -----From: Elemir Stevko There is an article in MSDN CD which deals with the problem of adding control bars to the dialogs. The article number is Q123158 and the sample code DLGCBR.EXE (or DLGCBR32.EXE) can be downloaded from the ftp.microsoft.com/softlib/mslfiles/ directory. Elemir Stevko stevko@dcse.fee.vutbr.cz -----From: Wolfgang Loch see KB Article Q123158: SAMPLE: Adding Control Bars to Foundation Classes Dialogs at: http://www.microsoft.com/kb/developr/visual_c/q123158.htm and maybe the 32-Bit version: SAMPLE: Adding Control Bars to Dialog Boxes in MFC Article ID: Q141751 http://www.microsoft.com/kb/developr/visual_c/Q141751.htm Wolfgang -- /-------------------------------------------------\ | Wolgang Loch (Technical University of Ilmenau) | | e-mail: Wolfgang.Loch@rz.TU-Ilmenenau.DE | | www : http://www.rz.tu-ilmenau.de/~wolo | \-------------------------------------------------/ -----From: Jeff Lindholm Environment: VC++ 4.2, Win95/Win NT I use CToolBarCtrl with no problems. There are a few things you will have to do yourself, but I have it working on Dialogs, property sheets, and pages within TabCtrls. I would guess this should work with 1.52 unless these controls/classes are unavailable. -----From: Igor Nedelko Hi Richard, Yes, there is a DLGBR32 sample application that shows how to use toolbars and status bars in a dialog box. You can easily find it in MSDN library. Regards, Igor -----From: ganeshs@nationwide.com Check out MSKB article Q123158: " SAMPLE: Adding Control Bars to Foundation Classes Dialogs" which has what you need... / ___| / ___| __ _ _ __ ___ ___| | I do not speak for \___ \ | | _ / _` | '_ \ / _ \/ __| '_ \ Tata Unisys or ___) | | |_| | (_| | | | | __/\__ \ | | |Nationwide Ins. |____(_) \____|\__,_|_| |_|\___||___/_| |_|------------------
| Вернуться в корень Архива |