[Okta Webinar] Learn how to a build a cloud-first strategyRegister Now

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 330
  • Last Modified:

Initialise ActiveX Control without specifying pParentWnd...

Hi,

I have an application that utilises an array of MSComm controls.
These are defined in the main application code as...
   CMSComm myCommArray[5];

When I initialise the application I wish to 'Initialise' the control to check that it is registered and prepare it for use...
I use the command
   myCommArray[x].Create(NULL, WS_VISIBLE, CRect(0,0,0,0), m_pMainWnd, IDC_COM1+x);

This works fine when it is part of the InitInstance() function, after the window has been created and displayed.

I wish to move this code to the InitApplication() function so that it is called BEFORE any window is displayed...

I'm sure this is a fairly simple thing to achieve, but I am not sure how?

Any help would be appreciated...

Best regards,

James
0
James Atkin
Asked:
James Atkin
  • 7
  • 7
1 Solution
 
AndyAinscowCommented:
from an SDI app - InitInstance function of the App

      CSingleDocTemplate* pDocTemplate;
      pDocTemplate = new CSingleDocTemplate(
            IDR_MAINFRAME,
            RUNTIME_CLASS(CXxxDoc),
            RUNTIME_CLASS(CMainFrame),       // main SDI frame window
            RUNTIME_CLASS(CXxxView));
      AddDocTemplate(pDocTemplate);

      // Parse command line for standard shell commands, DDE, file open
      CCommandLineInfo cmdInfo;
      ParseCommandLine(cmdInfo);

      // Dispatch commands specified on the command line
      if (!ProcessShellCommand(cmdInfo))
            return FALSE;

//********************************************
PUT YOUR INITIALISATION HERE - window is created but not yet shown


      // The one and only window has been initialized, so show and update it.
      m_pMainWnd->ShowWindow(SW_SHOW);
      m_pMainWnd->UpdateWindow();
0
 
James AtkinSenior Principle Software EngineerAuthor Commented:
That's not how the Wizard created my SDI app...  I have ...

   CSingleDocTemplate* pDocTemplate;                         <- ***Window is automatically shown at this point***
   pDocTemplate = new CSingleDocTemplate(
      IDR_MAINFRAME,
      RUNTIME_CLASS(CxxxDoc),
      RUNTIME_CLASS(CMainFrame),
      RUNTIME_CLASS(CxxxView));
   AddDocTemplate(pDocTemplate);

   EnableShellOpen();
   RegisterShellFileTypes(TRUE);

   CCommandLineInfo cmdInfo;
   ParseCommandLine(cmdInfo);

   if (!ProcessShellCommand(cmdInfo))
      return FALSE;

   // The one and only window has been initialized, so update it.
   m_pMainWnd->UpdateWindow();      

Any ideas?
0
 
AndyAinscowCommented:
Hmm.
Does it have to be in the InitInstance of the app?
A view has a function OnInitialUpdate that is called once (I think before the window is shown).  That could be a place to put the code.
0
Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
James AtkinSenior Principle Software EngineerAuthor Commented:
It doesn't matter where it it - providing the Window is not visible at the time...

OnInitialUpdate does not appear to be part of CWinApp though - would this be in the CFrameWnd?
0
 
AndyAinscowCommented:
Its a view function
0
 
AndyAinscowCommented:
Select your view - add a virtual function - OnInitialUpdate should be one of the choices available
0
 
James AtkinSenior Principle Software EngineerAuthor Commented:
Cool, got it - it DOES execute before the Main window is displayed so I'll try moving the required code to there...  Let you know the result shortly...
0
 
James AtkinSenior Principle Software EngineerAuthor Commented:
Ok,

That works nicely!  

Is there a way (being a little fussy now) to stop the Main Window flashing up as the termination is proceeding?  I currently set a flag in the main App to say the initialisation has failed, and after returning from the ProcessShellCommand function, this flag is set and I return FALSE from InitInstance().

I guess that if it was possible to return FALSE to the ProcessShellCommand function, it might do it, but I have no idea how to do this !!!

I am accepting your above comment as the answer though as it works quite nicely - the 'Non-Flash' is one of those "Wonder if you can do that" sort of questions  ;-)

Thanks for the help...

James
0
 
AndyAinscowCommented:
Would it not be nicer for the user that the app appears, a messagebox giving some sort of error message appears (In the InitInstance) and then you return false to kill the app.  The user knows it attempted to start rather than a blank screen and the user thinks why didn't it start and tries again.
0
 
James AtkinSenior Principle Software EngineerAuthor Commented:
Part of the Initialisation is a Login procedure.  If this is cancelled or fails, the Login Class will display the appropriate message to the user - displaying a message in InitInstance will duplicate the information already given to the user during Login.
0
 
AndyAinscowCommented:
OK.
There ought to be a way but I can't think of it at present.  

Just a guess
In the OnCreate  of the MainFrame you get a parameter of type
CREATESTRUCT Structure
The CREATESTRUCT structure has the following form:

typedef struct tagCREATESTRUCT {
   LPVOID    lpCreateParams;
   HANDLE    hInstance;
   HMENU     hMenu;
   HWND      hwndParent;
   int       cy;
   int       cx;
   int       y;
   int       x;
   LONG      style;
   LPCSTR    lpszName;
   LPCSTR    lpszClass;
   DWORD     dwExStyle;
} CREATESTRUCT;


Try modifying the style member so it is a hidden window, if your creation of the controls in the view succeeds then add
m_pmainWnd->ShowWindow(SW_SHOW) before the UpdateWindow() call in InitInstance.
0
 
James AtkinSenior Principle Software EngineerAuthor Commented:
What's the style for 'Hidden Window' ?  Do you just exclude WS_VISIBLE?
0
 
AndyAinscowCommented:
yes - it might work, not tried it here
0
 
James AtkinSenior Principle Software EngineerAuthor Commented:
I've tried the following in MainFrame...

   int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
   {
      long tmpStyle = lpCreateStruct->style;
      tmpStyle = tmpStyle & ~WS_VISIBLE;
      lpCreateStruct->style = tmpStyle;

      if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1;

      return 0;
   }

But the window still appears briefly...

As I said, not urgent (you've earned your points) but if you have any ideas, please let me know...

James
0

Featured Post

[Webinar] Cloud and Mobile-First Strategy

Maybe you’ve fully adopted the cloud since the beginning. Or maybe you started with on-prem resources but are pursuing a “cloud and mobile first” strategy. Getting to that end state has its challenges. Discover how to build out a 100% cloud and mobile IT strategy in this webinar.

  • 7
  • 7
Tackle projects and never again get stuck behind a technical roadblock.
Join Now