15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


CFileDialog problems and other questions...

Peter.J.Garcin@JCI.Com
Tuesday, January 21, 1997

     Environment: VC++ 4.1, NT 4.0
     
     Ok, here's the situation:
     
     I've subclassed CFileDialog and overridden the OnInitDialog method. 
     Now, the idea is that this Common Open Dialog doesn't read from a 
     disk, but from a database, so in the OnInitDialog method, it opens the 
     database and feeds the controls the information from the database that 
     they need. The idea was to eliminate lots of coding, and "hi-jack" the 
     existing system dialogs... it didn't work. Although OnInitDialog 
     finishes without an error and everything seems to be going fine, a few 
     seconds later an Access Violation (at some crazy address) in 
     COMDLG32.DLL comes up. It stops and it's in the middle of assembly 
     code. My feeling is that Microsoft has it set so that you can't mess 
     with the data going to the controls in the common dialogs. Am I right 
     or wrong?  There doesn't seem to be anything "illegal" about what I'm 
     trying to do, but yet there is still an access violation in the DLL 
     file.
     
     So, the alternate solution was to build a custom dialog to do the same 
     thing. No problem, except I never thought about two small things:
     
     1. How to insert graphics in a typical list box? (the control in the 
     COMDLG32.DLL has a regular NON owner draw list box...how does that 
     work?) It seems to be a bit of overkill to use a CListCtrl.
     
     2. The CComboBox tree structure that the new dialogs have...I realize 
     that these are owner draw boxes, but how do I go about building that 
     tree that is in the drop down box?
     
     Well, I hope someone can help, I've looked around and there seems to 
     be just nothing about these topics. They are extremely common 
     everywhere in Windows, yet information on how to implement this sort 
     of thing is nonexistent.
     
     Thanks,
     
     ~pete
     
     ---
     Peter Garcin
     Toronto Software Design Centre
     Johnson Controls Inc.



Mihir Dalal -- m_dalal@ECE.concordia.CA
Thursday, January 23, 1997

[Mini-digest: 2 responses]



Peter,

I have been into this stuff of customizing CFileDialog for quite some 
time now, and have been trying all kind of things with the CFileDialog. 

Although, I have never tried precisely what you are trying, but I have 
been able to fill the CFileDialog with whatever data I have liked to. 

I am sure, if the data comes from a database, CFileDialog should be able 
to handle it perfectly.  

Believe me, MFC lends you complete control over all 
the list/edit/combo boxes and push buttons on the CFileDialog box.

I am sure, you are doing something wrong somewhere which possibly 
is very minute to detect.   

Try this:
Open the database just before you call DoModal() for CYourFileDialog, 
pass a pointer to the opened database to CYourFileDialog() 
and then try to load the controls in the OnInitDialog() of CYourFileDialog, 
instead of both opening and reading the database in OnInitDialog().

Your code would look something like this:

CYourFileDialog dlg;
// Open the database here or just anytime before reaching here    
// and for the time being assume m_pSet is the pointer to your
// opened database
// pDBase is a database pointer declared in CYourFileDialog()
  
   dlg.pDBase = m_pSet;      
   dlg.DoModal();

Then, in the OnInitDialog() you can use pDBase to access the database 
and load your dialog list/combo boxes. 


Mihir. 

------------------ Dept. of Elec. & Comp. (ECE) Engg. -----------------------

 Mihir Dalal                           phone : 1-514-274-4430
 M.Engg (Electrical) Student             fax : 1-514-421-1166
 Concordia University                 emails : m_dalal@ece.concordia.ca
 1455, De Maissoneuve Blvd.                      dalal@vlsi.concordia.ca
 Montreal QC CANADA H3G 1M8                    m_dalal@alcor.concordia.ca

----------- http://www.ece.concordia.ca/~m_dalal/addr.html ------------------

On Tue, 21 Jan 1997 Peter.J.Garcin@JCI.Com wrote:

>      Environment: VC++ 4.1, NT 4.0
>      
>      Ok, here's the situation:
>      
>      I've subclassed CFileDialog and overridden the OnInitDialog method. 
>      Now, the idea is that this Common Open Dialog doesn't read from a 
>      disk, but from a database, so in the OnInitDialog method, it opens the 
>      database and feeds the controls the information from the database that 
>      they need. The idea was to eliminate lots of coding, and "hi-jack" the 
>      existing system dialogs... it didn't work. Although OnInitDialog 
>      finishes without an error and everything seems to be going fine, a few 
>      seconds later an Access Violation (at some crazy address) in 
>      COMDLG32.DLL comes up. It stops and it's in the middle of assembly 
>      code. My feeling is that Microsoft has it set so that you can't mess 
>      with the data going to the controls in the common dialogs. Am I right 
>      or wrong?  There doesn't seem to be anything "illegal" about what I'm 
>      trying to do, but yet there is still an access violation in the DLL 
>      file.
>      
>      So, the alternate solution was to build a custom dialog to do the same 
>      thing. No problem, except I never thought about two small things:
>      
>      1. How to insert graphics in a typical list box? (the control in the 
>      COMDLG32.DLL has a regular NON owner draw list box...how does that 
>      work?) It seems to be a bit of overkill to use a CListCtrl.
>      
>      2. The CComboBox tree structure that the new dialogs have...I realize 
>      that these are owner draw boxes, but how do I go about building that 
>      tree that is in the drop down box?
>      
>      Well, I hope someone can help, I've looked around and there seems to 
>      be just nothing about these topics. They are extremely common 
>      everywhere in Windows, yet information on how to implement this sort 
>      of thing is nonexistent.
>      
>      Thanks,
>      
>      ~pete
>      
>      ---
>      Peter Garcin
>      Toronto Software Design Centre
>      Johnson Controls Inc.
-----From: =?iso-8859-1?Q?Klaus_G=FCtter?= 

Peter,

1. On WinNT 4.0, the "list box" in the file open dialog *is a* list view
control as can be verified using Spy++. I don't think this is overkill
as a list view control does exactly what you want.

2. Graphically, this is simple: just draw the icon and text with the
desired indentation. A convenient place to fill the list is on the
CBN_DROPDOWN notification.

If you want to use the original file open dialog: this is possible, but
you will have to create something called a "shell extension" (Query for
IShellFolder in Books Online for more information about these). This is
some good amount of work and for sure is not the way to go if you do not
need the extra profit of a perfect shell integration.

- Klaus Guetter

>----------
>Von: 	Peter.J.Garcin@JCI.Com[SMTP:Peter.J.Garcin@JCI.Com]
>Gesendet: 	Dienstag, 21. Januar 1997 22:45
>An: 	mfc-l@netcom.com
>Betreff: 	CFileDialog problems and other questions...
>
>     Environment: VC++ 4.1, NT 4.0
>     
>     Ok, here's the situation:
>     
>     I've subclassed CFileDialog and overridden the OnInitDialog method. 
>     Now, the idea is that this Common Open Dialog doesn't read from a 
>     disk, but from a database, so in the OnInitDialog method, it opens the 
>     database and feeds the controls the information from the database that 
>     they need. The idea was to eliminate lots of coding, and "hi-jack" the 
>     existing system dialogs... it didn't work. Although OnInitDialog 
>     finishes without an error and everything seems to be going fine, a few 
>     seconds later an Access Violation (at some crazy address) in 
>     COMDLG32.DLL comes up. It stops and it's in the middle of assembly 
>     code. My feeling is that Microsoft has it set so that you can't mess 
>     with the data going to the controls in the common dialogs. Am I right 
>     or wrong?  There doesn't seem to be anything "illegal" about what I'm 
>     trying to do, but yet there is still an access violation in the DLL 
>     file.
>     
>     So, the alternate solution was to build a custom dialog to do the same 
>     thing. No problem, except I never thought about two small things:
>     
>     1. How to insert graphics in a typical list box? (the control in the 
>     COMDLG32.DLL has a regular NON owner draw list box...how does that 
>     work?) It seems to be a bit of overkill to use a CListCtrl.
>     
>     2. The CComboBox tree structure that the new dialogs have...I realize 
>     that these are owner draw boxes, but how do I go about building that 
>     tree that is in the drop down box?
>     
>     Well, I hope someone can help, I've looked around and there seems to 
>     be just nothing about these topics. They are extremely common 
>     everywhere in Windows, yet information on how to implement this sort 
>     of thing is nonexistent.
>     
>     Thanks,
>     
>     ~pete
>     
>     ---
>     Peter Garcin
>     Toronto Software Design Centre
>     Johnson Controls Inc.
>



Mike Blaszczak -- mikeblas@nwlink.com
Saturday, January 25, 1997

At 15:45 1/21/97 -0600, Peter.J.Garcin@JCI.Com wrote:
>     Environment: VC++ 4.1, NT 4.0
     
>     Ok, here's the situation:
     
>     I've subclassed CFileDialog and overridden the OnInitDialog method. 
>     Now, the idea is that this Common Open Dialog doesn't read from a 
>     disk, but from a database, so in the OnInitDialog method, it opens the 
>     database and feeds the controls the information from the database that 
>     they need.

The controls _need_ information that describes a file structure.

>The idea was to eliminate lots of coding, and "hi-jack" the 
>     existing system dialogs.

What coding would you be eliminating?  I'm not sure I understand the intended
application of your dialog box.  Are you allowing the user to open a database,
or are you allowing the user to choose a local file based on information
stored in a database?

> Although OnInitDialog 
>     finishes without an error and everything seems to be going fine, a few 
>     seconds later an Access Violation (at some crazy address) in 
>     COMDLG32.DLL comes up.

What message was being handled at the time?  For which control was it
destined?

>My feeling is that Microsoft has it set so that you can't mess 
>     with the data going to the controls in the common dialogs. Am I right 
>     or wrong? 

You're wrong: there is no conspiracy.

> There doesn't seem to be anything "illegal" about what I'm 
>     trying to do, but yet there is still an access violation in the DLL 
>     file.

I don't think there's any way for us to tell if you're doing anything wrong
or not--you've not clearly described your goal, and you've not clearly and
in detail described how you're trying to attain that goal.

By initializing the controls yourself, you're working with the assumption
that you know how to properly initialize them.  If you don't properly
initialize them, you're not going to get very far.  This is your fault
for not initializing the controls correctly; it's not a that Microsoft
(for some unspoken reason) is interested in "setting it" so that you
"cant mess with data going to the controls in the common dialogs".

Quite the opposite is the case, in fact: my book has a couple of samples
which (sometimes heavily) customize the look of the dialogs.  One of the
samples parties on the data in the controls directly.  It _is_ possible
to mess with the data going to the controls in the dialogs.

If you've messed the data so severely that it isn't at all what the
provided message hanlders for the controls expect, you can bet on crashing.
That only makes sense!  If you need to change the data so severly that
the Windows-supplied code can't deal with it, you should revisit your
architecture.

Maybe you can write handlers for the offdending messages and do something
in response to them that's appropriate for the data you've loaded. Or, maybe
your application of the dialog is inappropriate. Given the precious little
specific information you've provided about your application, my hunch is
that the latter condition is the case.
   
>     1. How to insert graphics in a typical list box? (the control in the 
>     COMDLG32.DLL has a regular NON owner draw list box...how does that 
>     work?) It seems to be a bit of overkill to use a CListCtrl.

Why?  List view controsl are designed entirely for exactly that kind
of application.
    
>     2. The CComboBox tree structure that the new dialogs have...I realize 
>     that these are owner draw boxes, but how do I go about building that 
>     tree that is in the drop down box?

The tree should already be built.  The tree shown in the drop-down lets
you navigate the hierarchy of desktop names and devices on your machine.
If you have such a hierarchy, you already have the tree.  If you don't have
the tree, it strongly suggests that no navigable hierarchy exists in your
application.  It's quite possible that you don't need the tree and simply
provide a flat list in the combo box.

>     Well, I hope someone can help, I've looked around and there seems to 
>     be just nothing about these topics. They are extremely common 
>     everywhere in Windows, yet information on how to implement this sort 
>     of thing is nonexistent.

Hardly!  Look at the SDK documentation.  It's _loaded_ with stuff about
customizing the file dialog box.  See the topic "Open and Save As
Dialog Box Customization" right in the SDK.  Check out the related topics
named "Explorer-Style Hook Procedures", and "Explorer-Style Control
Identifiers".  You might want to make your own template; perhaps you should
read the topic named "Explorer-Style Custom Templates", too.

My book can't possibly be the only one that shows how to customize a file
dialog.  I think that the new Prosise book shows how, for example, and
I remember seeing a chapter or two on it in other books I've examined.

You might try looking at the Knowledge Base, too.  Article Q102332 is
titled "How to Show a Custom Common Dialog using CFileDialog", and that
sounds pretty much like what you're doing.  

I'm sorry to so strongly refute your assertion that "information on how to
implement this sort of thing is nonexistent".  Not researching the matter
and then saying that the dozens of people who write books, documentation,
and manage online resources like the Knowledge Base haven't done anything
isn't very responsible.


.B ekiM
http://www.nwlink.com/~mikeblas/
Why does the "new" Corvette look like a 1993 RX-7?
These words are my own. I do not speak on behalf of Microsoft.




Colin W. Earle -- cwe@denton.chem.arizona.edu
Monday, January 27, 1997

On Sat, 25 Jan 1997, Mike Blaszczak wrote:

(...snip...)
> Quite the opposite is the case, in fact: my book has a couple of samples
> which (sometimes heavily) customize the look of the dialogs.  One of the
> samples parties on the data in the controls directly.  It _is_ possible
> to mess with the data going to the controls in the dialogs.
>
But, these examples don't completely work.  I'm trying to do something 
similar to the original poster, but have been unsuccessful.  I've been 
trying to get a grasp on customiziing common dialogs using Mike's book 
but I've had problems with the following two examples.  The first is the 
CColorDialog example (p 230) which implements the color common dialog and 
preset the current color using the  member ftn SetCurrentColor.  This always 
produces an assertion failure for me because the m_hWnd is not yet valid for 
the dialog.  The MFC reference states that this function is used after calling 
doModal so I guess this makes sense to me.  I implement the color preset using 
the member m_cc struct like this:

	dlg.m_cc.rgbResult = someColor;
	dlg.m_cc.Flags |= CC_RGBINIT

Is this necessary or am I missing a trick to use SetCurrentColor before 
calling doModal?

	The other is the StdBoxes example on the CD.  The file open test
doesn't do anything.  I stepped through the code in the debugger and it 
always returns from CFileDialog with IDCANCEL without displaying the 
dialog, modified or otherwise.  Any suggestions on how I can make this 
work?  Thanks for your help.

Environment: VC++ 4.0, Win95, NT

thanks,
Colin

PS  I do *not* mean this as bait or a flame on Mike.  Other than these 
two examples, I've found his book to be outstanding.

Colin Earle                         http://denton.chem.arizona.edu/~cwe
Research Assistant, U. of Arizona   mailto:cwe@denton.chem.arizona.edu 
phone: (520) 621-8247 (work)        /* insert pithy comment here */





| Вернуться в корень Архива |