MFC - How to set the toolbar title? - visual-c++

The title of the toolbar and also the menu item ID_VIEW_TOOLBAR remains empty. I have tried to set it within CMainFrame::OnCreate:
CString strToolbar;
strToolbar.LoadStringA(IDS_TOOLBAR_STANDARD); // IDS_TOOLBAR_STANDARD = "Standard"
m_wndToolBar.SetWindowText(strToolbar);
DockPane(&m_wndToolBar);
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
EnablePaneMenu(TRUE, ID_ANSICHT_ANPASSEN, "Anpassen", ID_VIEW_TOOLBAR);
The menu Looks like following:
Do you know how to set it properly?

Generally speaking people do not change the display text of standard commands at runtime. At compile time you can set the ID's menu text in in the string table section of the resource editor.
If you want to change the menu text at runtime, you can add an ON_UPDATE_COMMAND_UI handler for ID_VIEW_TOOLBAR and call CCmdUI::SetText inside the handler. When the user click a top level menu to display a drop-down menu, a WM_INITMENUPOPUP is sent to the owner of the menu, in this case your CFrameWnd-derived class. CFrameWnd::OnInitMenuPopup then iterates through each menu item and calls the update command UI handlers if exists.
Reference
MFC TN021: Command and Message Routing

To solve this problem, I had create the Toolbar by explicitly specifying the ID of the Toolbar (instead of using the default argument of the function).
m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP |
CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC,
CRect(1,1,1,1),
IDR_MAINFRAME) // <-- Custom ID
After this I could set the title of the toolbar to what I want:
m_wndToolBar.SetWindowText(_T("My Toolbar Name");
I got it working after reading this thread.

Related

Extending the "Files" menu

I have a process that involves extending the "Files" menu that is located on (most) acumatica pages (next to notes and activities in the top right)
I would like to add two columns to the table that appears in the smartpanel.
I have been looking for the source code/data behind this smart panel and I cant seem to find it, is it tied into SM202520 (search in files)? Can it be extended?
Am I better off just adding a PXAction button to the 3 or 4 pages I want my extended "files" menu to be?
Thanks
There's no DataView bound to that dialog, you can verify that by using inspect element shortcut key CTL+ALT+CLICK on a grid column header:
In order to be customized the grid needs to be bound to a DataView which inspect element reveals it is not. The lack of DataView binding is by design and therefore that dialog can't be customized.
A grid that can be customized will show the View Name property:

Modal RCP Dialog not modal

I'm having some trouble creating a modal Dialog in the e4 workbench.
There is a predefined dialog(org.eclipse.e4.ui.model.application.ui.basic.impl.DialogImpl),
but the problem is that I can't figure out how to make it modal.
Maybe you guys have some clue.
You can set the style for the dialog by using 'styleOverride' in the Persisted State for the dialog. The value of 'styleOverride' is the numeric value of the SWT flags you want to use.
For a application model dialog the style would normally be
SWT.TITLE | SWT.RESIZE | SWT.MAX | SWT.CLOSE | SWT.APPLICATION_MODAL
which has a numeric value of 66672 so you would set this in the persisted state data:
It may be easier to stick with the traditional JFace Dialog as the application model MDialog does not give you any support for buttons etc.

MFC: Choosing between a Dialog Based vs SDI vs MDI

I have following requirement for my MFC application:
Dialog 1 --> Dialog 2 --> Dialog 3 --> Dialog 4 --> Dialog 5
^ | | ^ ^ |
| ---------------------------- | |
| | | |
| -------------------------- |
--------------------------------------------------------
Navigate from Dlg1 to Dlg2 to Dlg3 to Dlg4 to Dlg5
Navigate from Dlg2 to Dlg4
Navigate from Dlg3 to Dlg5
Navigate from Dlg5 back to Dlg1
After navigation e.g. Dlg1 to Dlg2, the prevous dialog (Dlg1) shall not be visible
The user shall not see that it is a different dialog when he navigates (E.g. from Dlg1 to Dlg2), he should have the feeling of one application.
Question: What application type should I use? (SDI, MDI, Dialog based)
How about a tabbed dialog? Start with the dialog based architecture but replace the main dialog with a CPropertySheet. Your dialog 1 through dialog 5 will become pages in the tabbed sheet.
I would suggest creating SDI application then delete all document and view classes. Only CFrameWnd and CWinApp classes would stay. Make CFrameWnd non-resizable and dynamically Create all child dialogs into it. Then you would have one window CFrameWnd with many dynamically loading Dialogs inside.
Choose either SDI or MDI. Many time initial requirements like yours make SDI the best fit but often times people have to convert SDI to MDI at the end of the road so use own your judgement if you might want to start MDI right away but given your today requirements SDI is good option.
You could also achieve the same with Dialog and use DoModal() but it will be a new window everytime. I in fact did this myself because I had to use CDialog and here is how I did it:
// here how I exit from say a given dialog to a different screen.
void CSummaryDlg::OnBnClickedButtonBack()
{
EndDialog( Batch::BatchGoBack ); // goes to previous dialog
}
void CSummaryDlg::OnBnClickedButtonExitBatch()
{
EndDialog( Batch::BatchComplete ); // finishes all dialogs in the chain.
}
// how ending all dialog takes places (example of propagation)
void CResultDlg::OnBnClickedButtonViewReport()
{
CSummaryDlg dlg;
int dlgResult = dlg.DoModal();
if ( dlgResult == Batch::BatchComplete )
EndDialog( Batch::BatchComplete );
}
You can create a dialog based application with an empty dialog, then dynamically insert the required dialog as a new window that fills the entire client area of the outer dialog. Set the DS_CONTROL style of the inner dialogs. As you switch from one dialog to another, you can destroy the old one or just hide it for faster activation if you'll need it back again later.

TestComplete Menu Item

I am new to TestComplete. I have a question and it may be something impossible or too simple. I have a toolbar containg File, Edit, View, etc. I want to get one item (eg. Edit) to mapped objects. I can get the whole toolbar only. I want to simulate a click event on Edit. How can I do this?
As a rule, TestComplete does not work with menu items as with separate objects. It works with a menu object or even only with a menu's parent object and you can specify which item to select by passing the caption of this item to the corresponding method of a menu object. For example:
objMenu.Click("Edit|Paste");
// or
parent.MainMenu("Edit|Paste");
Please find more details on how TestComplete interacts with menus in the Working With Menus help topic.

MFC Document View Getting Tabbing to work

I have created a MFC Document View app and added several classes which inherit from CEdit to the CView. I would like to get tabbing between each CEdit working. I have looked around and most solution involve Adding IsDialogMessage() to either the message loop or in PreTranslateMessage. I have tried this in the PreTranslateMessage method of the CEdit class like this:
BOOL WordControl::PreTranslateMessage(MSG* pMsg)
{
if(IsDialogMessage(pMsg))
return TRUE;
else
return __super::PreTranslateMessage(pMsg);
}
however, now the CEdit doesn't receive any keyboard messages and doesn't tab. I have created the CEdit like this:
Create(WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER | ES_CENTER , Rect, Parent, Index);
What am I doing wrong?
EDIT:
The app uses the basic MFC single document
template. I am dynamically adding several objects which inherit from CEdit and several which inherit from CStatic. I have managed to create all the CEdits and CStatics but I would like to be able to tab from CEdit to CEdit.
A picture is worth a thousand words; here is a screenshot:
I want to be able to type "hello" in the first CEdit, hit tab and for the next CEdit to have focus. Then I will type "world" and then hit tab and the next CEdit will have focus for me to type "this" etc.
EDIT:
New Window:
Use a CFormView as your base. You can add controls dynamically and the form will manage the tabbing for you. If you only have a small number of maximum edit controls you could also just create them on the form and then show/hide them as necessary.

Resources