Changing CPropertyPage size at run-time
Kevin Thomas -- kevin@cgltd.demon.co.uk Monday, February 19, 1996 Hi all, I've been working on this one for two days now but to no avail. First the specs: VC++ 4.0 , MFC 4.0 Now the problem: I'm trying to write a form launching application that displays forms that are defined by a script file. Each form is of variable size and displayed within a Property Sheet. So what I need to do is set the size of the property page before I call CPropertySheet::Create so that the sheet is the right size to show all the controls on the forms. Initially I sub-classed the CPropertyPage class using Class Wizzard which automatically used a dialog template I had defined using the dialog editor. I then created and diplayed the controls for the page within CMyPage::OnInitDialog. This worked fine but the size of my pages was set by the values specified in the .rc file at compile time. I then tried various methods of changing the pages size using MoveWindow(), etc. (well I had to try it) but this didn't work because (I presume) the property sheet takes it's size from the dialog templates associated with the pages. Next, I tried to use the PSP_DLGINDIRECT flag. First I tried use LoadResource to get at the existing dialog template and set the CMyPage::m_psp.pResource variable to it. Unfortunately I could not change any of the pointed to by this resource once I called LockResource to access it. Is there any way I can get at a resource at run time? Next I tried to build my own dialog template at run time, but I cannot get this to work. I create and filled in a DLGTEMPLATE structure and set the pResource member of m_psp to it but it doesn't work. The VC++ 4.0 documentation states that you need at least one DLGITEMTEMPLATE structure after this (I assume I need to GlobalAlloc space for the structures before hand and place them sequentially in memory) but it also says that these are followed by three variable sized arrays, but, I can't find any information on these arrays. Using this method the CPropertySheet is not created (athough no error message is given). How do I set up a dialog template properly at run time? Is it possible to set up an empty dialog template with no DLGITEMTEMPLATEs and arrays? Or is there any better way of changing the page size? thanks in advance, Kevin Thomas - Control Group Ltd. kevin@cgltd.demon.co.uk
LeRoy Baxter -- lbaxter@cinfo.com Tuesday, February 20, 1996 [Mini-digest: 3 responses] You need to do one of three things: 1) write your own CPropertySheet class - there is code in the class to step through all the pages and calculate the size - you would need to override this 2) make your pages a fixed size (based on a maximum size 3) don't use CPropertySheet - use CTabCtl and CDialogs to simulate your Property Sheet forms -----From: "David W. Gillett"My current understanding of this is that CPropertySheet is, like MessageBox, a dialog derivative that achieves ease-of-use at the expense of versatility and flexibility. So my hunch is that to get the flexibility you want, you'll need to abandon CPropertySheet's canned functionality, and instead create your own CDialog derivative with a CTabCtrl and a few CButtons. You should then be able to resize the CDialog derivative and the CTabCtrl at run-time, based on the CPropertySheet objects you will use. I strongly suggest, though, that you do any such resizing in OnInitDialog, and not attempt to re-size as each CPropertyPage is selected.... Dave -----From: Peter Olesen I don't know so much about property sheets but I have done some dialog template mangling in memory and maybe this kan help: The "Windows API Quick Reference" help files for VC2.2 (and hopefully VC4.0) have information on both the DLGITEMTEMPLATE and DLGTEMPLATE structs and the variable arrays following them. In short: A dialog with no menu and standard class the DLGTEMPLATE struct is followed by two 16bit words set to 0 (zero) and then a zero terminated UNICODE string with the title, if the dialog does not have a title its just another 16bit word of zero. Then follow the DLGITEMTEMPLATE's, one for each control. If the dialog does not have any controls there should be no DLGITEMTEMPLATE structs. //------------------------------------------------------------// // Peter Olesen // // (peter.olesen@mailbox.swipnet.se) // // // // "Support the Blue Ribbon Campaign for free speech online." // //------------------------------------------------------------//
Iain Fyfe -- Iain_Fyfe@scet.org.uk Wednesday, February 21, 1996 [Mini-digest: 2 responses] Try this bit of code I used to increase the size of my property sheet in OnInitDialogue CRect ctParentRectWnd; // dimensions of property sheet window bounding rectangle this->GetWindowRect(ctParentRectWnd); this->SetWindowPos(NULL, 0, 0, ctParentRectWnd.Width() + kCtrlWidth, ctParentRectWnd.Height(), SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE); // Increase the size of the window to accommodate the // new controls -- _/_/_/ _/_/_/ _/_/_/ _/_/_/ | Tel: (0141) 337 5000 _/ _/ _/ _/ | Fax: (0141) 337 5050 _/_/_/ _/ _/_/ _/ | Net: scet@scet.org.uk _/ _/ _/ _/ | AppleLink: SCET.DEV _/_/_/ _/_/_/ _/_/_/ _/ | ......learning through technology | -----From: "jeffg"One way of having CPropertySheet display the correct size you want is to set all of your child dialogs to the same dimension (CPropertySheet uses the first child window as a template on it's size, or at least it did before 4.00). Another alternative is to do it this way. Derive a class from CPropertySheet and add the following: int CIQPropertySheet::OnCreate(LPCREATESTRUCT lpCreateStruct) { m_bStacked = FALSE; // we default to single line slider tabs if( CPropertySheet::OnCreate(lpCreateStruct) == -1 ) return -1; // TODO: Add your specialized creation code here CRect rectWnd; GetWindowRect( rectWnd ); SetWindowPos( NULL, 0, 0, rectWnd.Width(), rectWnd.Height()+20, SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE ); CenterWindow(); return 0; } Set the Width and Height in the SetWindowPos command to your own values to achieve what you want.
| Вернуться в корень Архива |