Modifying style on creating MFC modelless child dialog - c++

I am creating modelless child dialog.For achieveing tab order, while creating dialog I need to add DS_CONTROL style programmatically.
I have overridden PreSubClassWindow and added the style but it is not working whereas If I set DS_CONTROL in resource properties, tab order is working fine.
As per my requirement (since I am creating custom dialog), I should not set in resource properties.
Please anyone help me to achieve my requirement.

Related

How to limit numbers in edit box created in VS designer

I have a project in Visual Studio. There is a dialog that I created in the designer view, which results in a bunch of IDs and properties in the .rc file. One of the controls is an edit box with ES_NUMBER set.
How can I set a min and max? All the answers I see are for programmatically created controls where one subclasses CEdit. Is it even possible to spawn a subclassed edit control when using the .rc?
Use a auto-buddy Up-Down control.

Create a property sheet using a dialog template

I need to extend an existing MFC app with a UI that will end up very cluttered unless I use a tab control. However, the nature of the UI is that there are some controls that are global, and only some that can be localised to a particular tab.
The standard use of tab controls (CPropertySheet + CPropertyPage) more or less expects there only to be CPropertyPage instances (tabs) visible on the CPropertySheet object, and nothing else. There is a Microsoft Example Project that shows a single additional window painted outside the area occupied by the tab control... but it's not immediately clear how it is created/drawn/handled, and it is only one single additional window that generates few events (I guess it is painted, so there must be a WM_PAINT event handler lurking somewhere).
Is it possible to lay out a bunch of controls with the MS Dialog Editor, including a tab control, and create the CPropertySheet using that template, hook up event handlers in a nice way, etc... or some equivalent way of getting the MFC framework to do as much of the creating, drawing and event handling as possible when it comes to a situation like this?
Yes it is possible to create dialog templates and use them in a CPropertyPage.
Each CPropertyPage behaves nearly like a dialog and handles all events for the controls on it.
Also there are features like OnApply that help you to manage the data exchange between the controls and your internal storage.
The central CPropertySheet only creates the dialog that get active. So OnInintDialog for a page is called the first time when the page gets active.
In the MFC since 2010 are more possibilities than a CPropertySheet. You can create tabbed views, that again may be CFormViews. I don't like CDialog based applications so I would prefer a tabbed view in a standard frame with toolbar and menus if appropriate for the application. So another method to unclutter your UI is to choose the MDI interface with tabbed documents... but multiple documents maybe isn't what you want.
Here is a sample of an SDI application with multiple tabbed views.
Also Coeproject shows some more samples here and with splitters and tabs here.
There are at least three solutions paths:
Try to squeeze the situation into the CPropertySheet + CPropertyPage framework which does not naturally allow for additional dialog controls on the CPropertySheet object, and so you will get no framework support this
Place a tab control on an ordinary dialog, and then use the TCN_SELCHANGE messages to fire code that manually hides & shows individual dialog controls subject to the tab control (again no framework support, but this time "within" the tab control instead of outside it)
Follow Mark Ransom's observation that if you can embed one kind of CWnd-based control on a CPropertySheet then you can probably embed any such object, including a CDialog-based object that has been developed in the MFC Dialog Editor
All of these approaches are going to encounter challenges, and it will depend on the specifics of the situation as to which is better. But first you should really consider whether there is a cleaner UI design which would lend itself to a simpler solution.
In my specific case, I saw no cleaner design alternatives, and found it easiest to take the second approach. It left me with some reasonably simple calls to ShowWindow() to show/hide the controls inside the tab control.

Programmatically and completely delete button from MFC toolbar

I have a document within MFC C++ application. I need to delete one the buttons from the particular CMFCToolbar within a code (not resources) completely, even preventing a user to restore the button via toolbar customization dialog. At this moment I use RemoveButton method of CMFCToolbar but it only makes the button invisible and it can be restored via toolbar customization dialog that is not an option for me at this time. I will be very glad if you suggest something that can help me there.
There are two internal lists in CMFCToolBar that are used to reset the Buttons upon customization.
They are named m_OrigButtons and m_OrigResetButtons.
You may need to derive your own class and delete the buttons with the specific IDs from there.
But better: Never to include such a button on the first time when the toolbar is created!

CListCtrl - how to enable multiple selection

I am creating a MFC application for Windows Mobile and don't know how to enable multiple selection for List Control (CListCtrl). In properties panel Single Selection is set to False but still can't select multiple items.
Any idea?
I have never targeted Windows Mobile but you might try the following:
list.ModifyStyle(LVS_SINGLESEL, 0);
ModifyStyle method of CWnd base will work (see post from Diego) if you desire to do this programmatically OR you can define the attribute within the Resource Editor IF your placing the control on a dialog.
All ListView window styles are defined in the CommCtrl.h header file. Check this page on Microsoft's website.
The default setting for a ListView control allows multiple selections. If you need to allow only single selection from the list, then use below code:
m_ListControl.ModifyStyle(NULL, LVS_SINGLESEL, 0);
m_ListControl is the variable for your List Control. You can many other styles mentioned on above page.
Here is another example:
ListView_SetExtendedListViewStyle(::GetDlgItem(m_hWnd, IDC_LIST1), LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);

How to place multiple control in single pane

I am using Xtreme Toolkit Pro for creating docking pane in my MFC application.
The Pane class allows to attach only one control (which is inherited from CWnd class) at a time. I want to add multiple controls in my pane. How can I achive it?
If any one has an experience in this or relevant area please share it with me.
Info about Xtreme tool kit docking panes:
http://www.codejock.com/support/articles/mfc/dockingpane/dp_1.asp
Regards,
KK
Through the builtin dialog editor you can create a window with multiple control
Make sure the properties Appearance>Style is set to "Child" and Behavior>SystemModal is set to "False".
Then just attach the Dialog window handle to the docking pane.