Member_2_99151
asked on
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
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
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
ASKER
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(pDocTemplat e);
EnableShellOpen();
RegisterShellFileTypes(TRU E);
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
if (!ProcessShellCommand(cmdI nfo))
return FALSE;
// The one and only window has been initialized, so update it.
m_pMainWnd->UpdateWindow() ;
Any ideas?
CSingleDocTemplate* pDocTemplate; <- ***Window is automatically shown at this point***
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CxxxDoc),
RUNTIME_CLASS(CMainFrame),
RUNTIME_CLASS(CxxxView));
AddDocTemplate(pDocTemplat
EnableShellOpen();
RegisterShellFileTypes(TRU
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
if (!ProcessShellCommand(cmdI
return FALSE;
// The one and only window has been initialized, so update it.
m_pMainWnd->UpdateWindow()
Any ideas?
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.
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.
ASKER
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?
OnInitialUpdate does not appear to be part of CWinApp though - would this be in the CFrameWnd?
Its a view function
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
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...
ASKER
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
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
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.
ASKER
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.
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.
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_
ASKER
What's the style for 'Hidden Window' ? Do you just exclude WS_VISIBLE?
yes - it might work, not tried it here
ASKER
I've tried the following in MainFrame...
int CMainFrame::OnCreate(LPCRE ATESTRUCT lpCreateStruct)
{
long tmpStyle = lpCreateStruct->style;
tmpStyle = tmpStyle & ~WS_VISIBLE;
lpCreateStruct->style = tmpStyle;
if (CFrameWnd::OnCreate(lpCre ateStruct) == -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
int CMainFrame::OnCreate(LPCRE
{
long tmpStyle = lpCreateStruct->style;
tmpStyle = tmpStyle & ~WS_VISIBLE;
lpCreateStruct->style = tmpStyle;
if (CFrameWnd::OnCreate(lpCre
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
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CXxxDoc),
RUNTIME_CLASS(CMainFrame),
RUNTIME_CLASS(CXxxView));
AddDocTemplate(pDocTemplat
// Parse command line for standard shell commands, DDE, file open
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
// Dispatch commands specified on the command line
if (!ProcessShellCommand(cmdI
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_
m_pMainWnd->UpdateWindow()