|
It's not a class wizard application, I'm using the SDK directly for this application. WM_COMMAND is getting through at that level for button clicks. It should likewise get through for combo boxes. There's probably some requirement though to enable that behavior. Any help would be appreciated.
|
|
|
|
|
Ah.
Handle the WM_NOTIFY message for the case when its wParam contains your combo box's id. The lParam points to a NMHDR struct whose code member will be CBN_mumble .
/ravi
Let's put "civil" back in "civilization"
http://www.ravib.com
ravib@ravib.com
|
|
|
|
|
Note in the original message though, the log of all messages returned from GetMessage...I was looking for WM_NOTIFY, its value is 4E, and that message wasn't generated either. Only mouse events 200,201,202
|
|
|
|
|
My CDialog derived class has a label that I want to say something in.
Now I am actually spawning this CDialog in my OnInitialUpdate of the View class because before it shows the application UI, thee is a lengthy procedure happening. SO I thought I'd pop up this modeless CDialog with a label saying "Loading........." The label shows up, but its got no writing on it....In the CDialog design I set the caption of the label to "Loading" and for good measure, in its initDialog , also set the WindowText.......
Now in my prj in another function (not OnInitialUpdate) after the UI is fully up and running I have a similar label CDialog coming up which does fine!
What am I doing wrong?
Appreciate your help,
ns
|
|
|
|
|
This might sound silly, but (assuming it's a standard static text widget) ensure that the widget is wide enough to display "Loading.........". To be safe, set the "Simple" style (checkbox in resource editor) to ensure at least part of the overly long text shows.
/ravi
Let's put "civil" back in "civilization"
http://www.ravib.com
ravib@ravib.com
|
|
|
|
|
Nope. Its got something to do with the fcat that the UI isnt up yet.though a CDialog I spawn in OnInitialUpdate right before I do the label CDialog gets created with no problem..........it precedes the showing of the main UI quite happily....
Appreciate your help,
ns
|
|
|
|
|
CLoading * pcLoading = new CLoading;
pcLoading->lblText = "Please wait.........loading data";
pcLoading->Create(IDD_DLGTLOADING, this);
pcLoading->ShowWindow(SW_SHOW);
<code>PopulateSortList();</code>
pcLoading->DestroyWindow();
delete pcLoading;
Appreciate your help,
ns
|
|
|
|
|
The static control's window hasn't yet been created. Override CLoading's OnShowWindow() and set the label's text there (once). For example:
CDialog::OnShowWindow (...);
if (m_bFirstTimeShown) {
m_bFirstTimeShown = false;
SetDlgItemText (IDC_LABEL, "Please wait... loading data");
}
/ravi
Let's put "civil" back in "civilization"
http://www.ravib.com
ravib@ravib.com
|
|
|
|
|
Didt like that either..............but thanks for trying...
|
|
|
|
|
If I put a button on this CDialog it doesnt show up either...........
Appreciate your help,
ns
|
|
|
|
|
Wo, man!!! Sumpin' ain't right fer sure!
/ravi
Let's put "civil" back in "civilization"
http://www.ravib.com
ravib@ravib.com
|
|
|
|
|
Well.....heres what I see now. If I dont do destry window, then as s oon as the UI comes up the label gets populated. But I needed it to inform the user to wait for the UI to come up.........and not tell them after its up....ya know?
Appreciate your help,
ns
|
|
|
|
|
Before you do your heavy processing, pump the message queue.
Tim Smith
I'm going to patent thought. I have yet to see any prior art.
|
|
|
|
|
Ah, I see what you're trying to do. I'd use this mechanism:- Your view's
OnInitialUpdate() simply displays the CLoading modal dialog.
CLoading does the actual initialization (by posting a custom WM_COMMAND to itself in it's OnInitDialog() .
- When the initialization completes (in the handler of your fake command),
CLoading simply exits (by calling CDialog::OnCancel() ) and control returns to your view. Imho, this is much easier than using a modeless dialog and having to pump the message queue.
/ravi
Let's put "civil" back in "civilization"
http://www.ravib.com
ravib@ravib.com
|
|
|
|
|
Eh? I'm from Barcelona..........
The stuff I want in the lengthy initialization is all data owned by the view (I might not be understanding your suggestion correctly....). SO if I launch the modal dlg then send a messsage to the view to do the lengthy stuff, then call OnCancel once back in the modal dlg?
I anm trying this now, but not sure if thats what you maent...
Appreciate your help,
ns
|
|
|
|
|
I tried it...this time I dont even see a blank CDialog or anything!!!!
Appreciate your help,
ns
|
|
|
|
|
You know naathing? Sorry, I don't buy that!
You wrote:
SO if I launch the modal dlg then send a messsage to the view to do the lengthy stuff, then call OnCancel once back in the modal dlg?
Not quite. When you launch the modal dialog from the view, give it a pointer to the data that belongs to the view. That way it (the dialog) can happily do all the initialization and if you like, even display progress and allow the user to cancel.
When the initialization completes, the dialog ends itself (by calling CDialog::OnOK() ). If an error occured, it can end itself by calling CDialog::OnOK() . That way the view knows what happened.
It's possible that the view isn't completely setup until after it finishes executing OnInitialUpdate() . If this is the case, just have OnInitialUpdate() post a fake command (IDC_DO_INIT) to itself, and do the modal dialog thing in that command's handler. If the init fails, you can programmatically close the view after displaying an informational message.
Hope this helps.
/ravi
Let's put "civil" back in "civilization"
http://www.ravib.com
ravib@ravib.com
|
|
|
|
|
Well,
The trick you suggested does one good thing. My main UI comes up fast now (blank) since the lengthy processing is delegated to the PosTMessage to itself. Its (the main UI)not active till that postMessage wraps up but at least the user can be reassured that somethings happening. It automatically hourglasses itself ---- so even though I STILL dont have the informing dialog, my purpose is quite well served. An inadvertent workaround.....
So....I guess I am okay with this........but still never saw the cdialog at all!!!
Whats really bizarre is that earlier in OnInitialUpdate I instantiate a vector of modeless bozes and show images in them >These show up fine, as the very first thing!!!!
So its happy to do that, but not to put text in my later CDialogs label.............
Appreciate your help,
ns
|
|
|
|
|
You wrote:
but still never saw the cdialog at all
Is the dialog defined within OnInitialUpdate() ? If so, you won't see it because it's destructed the moment it goes out of scope. You need to make it a member of the view.
What I've suggested is a pretty standard way of showing progress as a view opens up. I suspect you're doing sumpin' wrong.
/ravi
Let's put "civil" back in "civilization"
http://www.ravib.com
ravib@ravib.com
|
|
|
|
|
I am doing
CLoading cLoading(this) in the PostMessage handler.
THe .h file doenst like me to say (this) to pass the parent in (when I make it a member). SO I guess I shall do a GetPArent or something.....
Right?
|
|
|
|
|
Yes, that seems right. Your handler should do something like this:
CLoading cLoading (this);
cLoading.setInitData (ptrToView'sData); // so that cLoading can do what it needs to do
long nStatus = cLoading.DoModal(); // display dialog - it will dismiss itself
if (nStatus == IDOK) // init completed successfully
....;
else { // init failed
AfxMessageBox ("Error!"):
close the view;
}
/ravi
Let's put "civil" back in "civilization"
http://www.ravib.com
ravib@ravib.com
|
|
|
|
|
Heres the rub:
I have not done ifndefs def in my .h files. my trView.h has loads of stuff #includes in it. If I include it in cLoading.h it screams bloody murder. So I tried putting it within the ifndef ....long string ....made by classwizard for the trView.h file. It compiles okay, but I guess it doesnt include it because CLoading says huh...whats CTRView*. However if I do GetParent I get a genereric CWnd* back and use that to post to the view to trigger the lengthy calc. Instead of doing parentPtr->LengthyFunc(); directly from the CDialog. A few e xtra steps...........
I have tried to ages to be able to do circular includes but have never succeeded.
Thanks so much for all the input though.......I know you're a busy guy...
Appreciate your help,
ns
|
|
|
|
|
Okay.....I did what you said I think and couldnt directly run the lengthyFUnc from the CDialog but POstMessaged the parent instead. Well------------now the UI comes up in flash!!!!!! Everything populated and calculation all finished and ready to go.
I dont know why.
HOwever.........since now even my biggest database loads in a flash, I never get to see the CDialog even if its being spawned. However with this instant flashing speed its unnecesary anymore. ITs amazing! But a really terrific outcome.
Thanks thanks thanks!
Appreciate your help,
ns
|
|
|
|
|
Last post on this...I promise. Why the lengthy calc took so little time with the REmote triggering became clear....It didnt do any calc!!!! No wonder. So I am going to avoid this strategy altogether .
So pls dont worry about it anymore. Just another mystery...every aspect of this problem. I tried Send as well as Post...just to be sure.
Appreciate your help,
ns
|
|
|
|
|
It seems like you need better (ideally complete) separation of your GUI and data. CLoading shouldn't know anything about the parent view's tree controls or other GUI elements. All you should pass back and forth is a pointer to a data structure.
I'll send you a sample FormView app with a progress dialog this weekend. It's probably easier to look at the code and compare it with your app than discuss it here!
It really is very simple. I promise!
/ravi
Let's put "civil" back in "civilization"
http://www.ravib.com
ravib@ravib.com
|
|
|
|