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
LVL 4
James AtkinSenior Principle Software EngineerAsked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

AndyAinscowFreelance programmer / ConsultantCommented:
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
AndyAinscowFreelance programmer / ConsultantCommented:
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
HTML5 and CSS3 Fundamentals

Build a website from the ground up by first learning the fundamentals of HTML5 and CSS3, the two popular programming languages used to present content online. HTML deals with fonts, colors, graphics, and hyperlinks, while CSS describes how HTML elements are to be displayed.

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
AndyAinscowFreelance programmer / ConsultantCommented:
Its a view function
0
AndyAinscowFreelance programmer / ConsultantCommented:
Select your view - add a virtual function - OnInitialUpdate should be one of the choices available
0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
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
AndyAinscowFreelance programmer / ConsultantCommented:
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
AndyAinscowFreelance programmer / ConsultantCommented:
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
AndyAinscowFreelance programmer / ConsultantCommented:
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
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
System Programming

From novice to tech pro — start learning today.