How to change ActiveX control's property programmatically with MFC? - mfc

I added a activex control to my MFC project, I don't use the dialog editor to add the control, I just used MFC to generate a wrapper class for the control, and call the "create" member in the wrapper class to create the control programmatically, the code is more or less like:
class CMyView
{
CCalendar m_ctl;
//other members.....
}
int CMyView::OnCreate
{
m_ctl.create("",WS_CHILD|WS_VISIBLE,this,CRect(50,50,100,100));
//.....
}
But I found that the wrapper class provide no way for me to change the control's property, so if I want to change the control's property programmatically, what should I do? Can I achieve this through a wrapper class? Or can it be done programmatically at all? Or is it only can be done via a dialog editor? Thank you.

Yes, wrapper only includes functions, if you create it via class wizard.
To change properties, i.e. variables, you could instantiate ActiveX in a form or a dialog and you would have the ability to modify values of properties in properties window.
If you want to do it on-the-run, you can right click to activeX object and then click on add variable. You will see that it will also create wrapper class for the object. This class will automatically include getters and setters for the activex, visible in the newly generated header file.
If you have already created a wrapper class for your activex, it may not work, try this in a fresh project. You can then copy generated .cpp and .h files to your own project afterwards.

Related

Getting Active CDocument's File Icon

I have an MFC MDI application in which I need to use the active CDocument's file icon. I know that the icon ID is set when specifying the document template (it is the first parameter in the CMultiDocTemplate constructor), but having searched the documentation (and header files) for CDocument, CMultiDocTemplate and CDocTemplate I can find no way to retrieve the icon's ID. Unfortunately all are defined in afxwin.h, so the source code isn't accessible. CDocTemplate does have a protected member variable, m_nIDResource which I'm guessing is set to the resource ID passed to the constructor, but there is no accessor for this variable.
I could write a thin wrapper class for CMultiDocTemplate and provide an accessor for the icon ID, but I thought I'd ask first if anyone has found a way to get the file icon?
Creating a wrapper class for CMultiDocTemplate and adding an accessor for m_nIDResource worked well.
As CMDIChildWnd uses the active document's file icon for its frames, there must be some in-built way of getting the icon, but oh well, this is a pretty simple work-around.

MFC: Emdedded child dialog is not showing up within parent dialog

I came across a tutorial showing how to embed a child dialog within a parent dialog using MFC. I am using Visual Studio 2015. My setup is as follows. Using the Visual Studio MFC Application Wizard to create a new MFC Visual C++ Project called MFCApplication3, I select a Dialog based application where MFC is used in a Shared DLL. Using boilerplate code, I have a simple Thick Frame Dialog, no maximize or minimize box.
In my resource view, I go to my Dialog editor to edit the main dialog. I add a picture control with a blank area in the center and name it IDC_STATIC. This will simply be used as a placeholder for my child dialog that I wish to embed. It looks like:
Still in the resource view, I create a new Dialog. I call it IDD_CHILD. I add some components. It looks like this:
Now back in the Solution Explorer, I add a class using the Add Class wizard, selecting to add an MFC Class. The class name is CChildDialog, with a base class of CDialog, and I use the already generated IDD_CHILD as the Dialog ID. It generates the .cpp and associated .h file. In the constructor of CChildDialog, I add a call to the Create function so the constructor becomes:
CChildDialog::CChildDialog(CWnd* pParent /*=NULL*/)
: CDialog(IDD_CHILD, pParent)
{
Create(IDD_CHILD, pParent);
}
Now I modify the dialog code generated automatically when I created the project. In CMFCApplication3Dlg.h, I add a private member of type CChildDialog* called m_childDlg, and #include the associated header file. In CMFCApplication3Dlg.cpp, I add this to the OnInitDialog function prior to the return statement:
CRect rc;
GetDlgItem(IDC_STATIC)->GetWindowRect(rc);
ScreenToClient(&rc);
m_childDlg = new CChildDialog(this);
m_childDlg->MoveWindow(rc);
Now I build the solution, run it, but it looks like it does in the first picture. A blank placeholder spot for a child dialog, but no child dialog. What could I be doing wrong?
It turns out (while composing this question) that the answer to my problem was two properties I need to set while in the resource view. When I have the child dialog open (IDD_CHILD), within the properties pane, I need to set the following properties:
Style: Child
Visible: TRUE
(I am not sure why Visible defaults to FALSE in this case). Making those two changes, voila! I get my embedded dialog:

How to register a custom control on ATL/WTL dialog?

I've derived a custom control from ATL::CWindowImpl<CMyCustomControl> and declared DECLARE_WND_CLASS(_T("CMyCustomControl")).
I've also made a dialog resource with a custom control with the class name CMyCustomControl.
How do I go about registering the control properly so I can display it on the dialog?
There are thre typical way to create custom controls in WTL.
DECLARE_WND_CLASS/DECLARE_WND_SUPERCLASS + RegisterClassEx API to register class by name + custom control reference in dialog template to instantiate control through class name
Implement window class, esp. inheriting from CWindowImpl, and create control manually, esp. from OnCreate/OnInitDialog
Implement window class, instantiate standard control through dialog template, and subclass the control instance to alter its behavior (e.g. static with hyperlinks, custom list view, edit control with color highlighting etc)
With all three you need to do more than just a macro in class definition. You will find great examples here: http://www.viksoe.dk/code/all_wtl.htm under "Controls" section.
Certainly the fourth method is implementing an ActiveX control.

How to add personal code into wxFormBuilder-generated class

I play with Eclipse + wxWidgets + wxFormBuilder
I use wxFormBuilder for GUI-design. It generates 2 classes: first is base class; second inherits first to implement functionality like button clicks. But both of this files are regenerated every time I have changes in wxFormBuilder.
I wonder how to add some code to inherited class. For example, I have listbox, button and menu item. I want to do same action (add some string to listbox) when user presses button or selects menu item. For this reason I want to implement common function 'action'. I'll call this functuion in button and menu item handlers. Where I should declare this function and its implementation to avoid erasing manual code?
Thanks.
wxFormbuilder has the ability to generate a derived class for you. Located under Tools->Generate Inherited Class.
This code is only generated when you invoke this tool, so most probably only once. It is derived from the automatically generated class. You use this class and can implement your stuff inside of it.
So, the usual workflow is like this:
build your frame/panel in formbuilder
generate inherited class
implement your handling code in inherited class
make changes to form/panel in wxFormbuilder -> will only affect generated class, not inherited class
There is my own code generator for wxFormBuilder inherited classes which preserves manual code wxFUp455

Simulating Button Click to UI class from console

I'm working on a project that currently exists as a user-interactive application w/ MFC dialog boxes. I have to extend it so that it can be used as an application that accepts command-line parameters. To do that, i have to call the method that is mapped to the button click of one of the MFC-based dialog boxes from another class. How can I do that?
Crate a public method in the class containing your button-click-method, and let it call the private button-click-method. You got me? ;-)
Create and expose a public method in your Form class that will call the button click handler.
Header declaration:
public:
void DoClick();
Definition:
void YourDlg::DoClick()
{
OnBnClickedOk(); // for example
}
Also remember that the dialog class needs to be instantiated when you call it.