Please Help with Sizer issue. Not sure if bugs or features. Topic is solved

If you are using the main C++ distribution of wxWidgets, Feel free to ask any question related to wxWidgets development here. This means questions regarding to C++ and wxWidgets, not compile problems.
Post Reply
webmasterpdx
Knows some wx things
Knows some wx things
Posts: 27
Joined: Thu Jun 25, 2009 2:43 am
Location: Portland, Oregon
Contact:

Please Help with Sizer issue. Not sure if bugs or features.

Post by webmasterpdx » Sat Jul 25, 2009 4:24 pm

I am creating my own wizard class as the wxWizard class doesn't allow you to edit the panels using form editors in wxDevC++ and I believe the wxWizard is overly complex.

Instead I have a wxDialog I open and put several panels into it. Then I instantiate a new class of my design (called xpwWizard) into the dialog and a few macros to set up the handlers for NEXT, BACK and CANCEL buttons that my code adds to the wizard automagically.

OK, now, the way my wizard works is to break up the dialog into 4 quadrants. There is the Bitmap panel in the top left, the work panel (one of the panels placed in the dialog in the form creator)...i.e. the actual page....in the top right.
Then there is a dummy panel in the bottom left and another in the bottom right, into which I create the back, next and cancel buttons (the next button changes it's text to FINISH on the last page).

Now, in the constructor for xpsWizard I create those panels not existing and put the children wxPanels into and array of panels for use as pages. I also put the buttons into the lower right panel.

Then I create 3 sizers. topsizer(wxHORIZONTAL), bottomsizer(wxHORIZONTAL) and mainsizer(wxVERTICAL).

So, I place the bitmap panel and the page/work panel in the topsizer, the dummy left panel and the button panel into the bottomsizer. I then place the topsizer and bottomsizer into the mainsizer and set the buttonpanel sizer to the buttonsizer AND set the parent(dialog) sizer to the mainsizer.

Now, the problems I'm seeing are as follows. It does place the things in kind of the right place, but not quite. First, Text at the top of the page/work panel overlaps over the bitmap if I use a bitmap smaller than the panel I want to use for it.
Also, the 3 buttons are 5 pixels or so from the bottom and I can't get them to go any higher. I had to use the blank dummy panel as I couldn't get the buttons to align to the right (using wxALIGN_RIGHT). Likewise, I can't get the buttons to align to the top of their panel using wxALIGN_TOP.
Initally the buttons were appearing up around the middle of the screen in cases where the page/work panel only contained a static text item.

So, my first thought was to SetMinSize for the bitmap and the page/work panels. I also tried to SetMaxSize for the lower panels to keep them to a certain height (e.g. 40 or 50).

This has helped but no cigar.

What I'm trying to do is get the work panel to stay at a constant size and to get the sizer to center the bitmap in the panel to the left of it (It does center vertically but not horizontally). Likewise I want to get the buttons on the bottom to be raised but about 10 more pixels from the bottom (right now, they are too close to the bottom), and no matter what I try with wxALIGN_xxx in the sizer->Add() calls, it doesn't seem to make a difference.

I know that if I abandon the sizers altogether and just set the sizes and place the panels and known locations and set the buttons likewise at known locations. That is ugly to code, and above all else, I'd like to know how to get the sizers to do what I want.
Do sizers override SetMaxSize and SetMinSize? Are there sizing calls that can force the sizers to follow some constraints?

i.e. I almost see no use for sizers if I can't align a button to the right, or bottom of a panel. I suspect the sizer is minimizing it's size to just the size of the buttons, and they aren't aligning the buttons within the panel, but only within the sizer. Is there a call that can set the size of the panel and force the sizer to not change the size of the panel, just to move around the controls within the panel?????

Also, is there a way to place controls according to alignment to their parents?

Several questions above.

1. Why aren't my sizers working the way I want?
2. Why doesn't alignment work?
3. Is there a way to force the sizer to follow the size of a panel without resizing the panel, but only it's children's positions.
4. Is there a way to place controls or move controls to follow alignment rules within a panel.

Thanks for any help
-Donald

Auria
Site Admin
Site Admin
Posts: 6695
Joined: Thu Sep 28, 2006 12:23 am
Contact:

Post by Auria » Sat Jul 25, 2009 4:46 pm

Wow, heavy post. I read part of it but got kinda lost on the way. Maybe you can post your exact sizer code, plus a screenshot of what you get and a mockup of what you want.
1. Why aren't my sizers working the way I want?
Probably because you're not using them correctly. Please post some code, it's hard to tell why without.
2. Why doesn't alignment work?
Probably because you're not using them correctly. Please post some code, it's hard to tell why without.
3. Is there a way to force the sizer to follow the size of a panel without resizing the panel, but only it's children's positions.
Sorry, don't understand. A sizer inside a panel will not resize the containing panel unless you explicitly request it to do so. The sizer you put the panel into will resize or not depending on what flags you pass when adding it. Please post some code, it's hard to tell why without.
4. Is there a way to place controls or move controls to follow alignment rules within a panel.
Sorry, don't understand
"Keyboard not detected. Press F1 to continue"
-- Windows

webmasterpdx
Knows some wx things
Knows some wx things
Posts: 27
Joined: Thu Jun 25, 2009 2:43 am
Location: Portland, Oregon
Contact:

Post by webmasterpdx » Sat Jul 25, 2009 5:32 pm

OK, here is the code. This is the xpsWizard.h followed by xpsWizard.cpp. This class is inside the wxDialog....m_parent refers to the dialog.

The code of interest is in 2 functions mainly....xpsWizard::xpsWizard (the constructor) and xpsWizard::displaypage that displays each page one at a time.

This code is meant to go along with the original post. Note that the last question is referring to aligning controls within a wxPanel without using sizers....

I don't have time to figure out how to place the bitmaps here...but in summary, the output has the buttons too close to the bottom no matter what I do. The page/work panel moves from right to left depending on content. e.g. First page has only a title on the top left....it is immediately to the left of the bitmap. The second page has a button in the middle of the page and a title in the same place as the previous page, and it's title is moved in an inch to the right....

Here is the code...

---------------------------------
First is xpsWizard.h

Code: Select all

//---------------------------------------------------------------------------
//
// Name:        xpsWizard.h
// Author:      donm
// Created:     7/13/2009 6:51:17 PM
// Description: xpsWizard class declaration
//
//---------------------------------------------------------------------------

#ifndef __XPSWIZARD_h__
#define __XPSWIZARD_h__

#ifdef __BORLANDC__
	#pragma hdrstop
#endif

#ifndef WX_PRECOMP
	#include <wx/wx.h>
	#include <wx/dialog.h>
#else
	#include <wx/wxprec.h>
#endif

#include <wx/stattext.h>
#include <wx/panel.h>

// Useful Macros.

// Used in xxxxDlg.cpp to put the wizard button definitions in automatically
#define XPS_EVENT_TABLE(xxxx) \
    EVT_BUTTON(xpsWizard::ID_BTN_BACK,xxxx::OnBack)\
    EVT_BUTTON(xpsWizard::ID_BTN_NEXT,xxxx::OnNext)\
    EVT_BUTTON(xpsWizard::ID_BTN_CANCEL,xxxx::OnCancel)

#define XPS_EVENT_DECLARE \
void OnBack(wxCommandEvent &event);\
void OnNext(wxCommandEvent &event);\
void OnCancel(wxCommandEvent &event);\
void FinishStore(wxCommandEvent &event);

#define XPS_EVENT_CODE(xxxx,wwww) \
void xxxx::OnBack(wxCommandEvent &event)\
{\
wwww->OnBack(event);\
}\
void xxxx::OnNext(wxCommandEvent &event)\
{\
if (wwww->final()) FinishStore(event);\
wwww->OnNext(event);\
}\
void xxxx::OnCancel(wxCommandEvent &event)\
{\
wwww->OnCancel(event);\
}

#define XPS_CONTROL_TABLE(xxxx, nnnn) \
    ID_BTN_BACK_xxxx=nnnn,\
    ID_BTN_NEXT_xxxx,\
    ID_BTN_CANCEL_xxxx

// Special class to define flags and bitmap
struct xpsInfo
{
    int flags;
    wxBitmap *bitmap;
};

// Manages panels inside a dialog forming a wizard.
class xpsWizard : public wxEvtHandler
{       
    public:
        xpsWizard(wxDialog *parent, int index = 0,
                    int flags = XPS_FLAG_NOBITMAP,
                    wxBitmap *bitmap = NULL);
        int changeflags(int flags); // Toggles global flags, returns old
        void displaypage(int index);    // Display page[index]
        virtual ~xpsWizard();
        
        // Flags for xpsWizard Controlling common controls.
        enum
        {   // exclusive bits
            XPS_MAX_PANELS = 100,   // Max number of panels set here.
            XPS_FLAG_BACK = 1,
            XPS_FLAG_NEXT = 2,
            XPS_FLAG_CANCEL = 4,
            XPS_FLAG_BITMAP = 8,
            XPS_FLAG_DEFAULT = XPS_FLAG_BACK | XPS_FLAG_NEXT | XPS_FLAG_CANCEL | XPS_FLAG_BITMAP,
            XPS_FLAG_NOBITMAP = XPS_FLAG_BACK | XPS_FLAG_NEXT | XPS_FLAG_CANCEL
        };
        
    public:
        // Define control buttons in the wizard
        // These have to be public as they are used in the xxxxDlg.cpp file
        enum
        {
            ID_BTN_CANCEL = 2001,
            ID_BTN_BACK,
            ID_BTN_NEXT
        };
       
    public:
        // Control buttons. You really want to put the handlers
        // here as you want to encapsulate them.
        // These have to be public too as they are declared as part of the
        // xxxxDlg.cpp's event table
        void OnBack(wxCommandEvent &event);
        void OnNext(wxCommandEvent &event);
        void OnCancel(wxCommandEvent &event);
        // Access Functions.
        int getstart(void);
        int getprevious(void);
        int getcount(void);
        bool final(void);           // Returns true if finished instead of next

    private:
        // Note no static wizard is going to use more than 100 panels.
        wxDialog *m_parent;     // dialog containing wizard
        wxPanel *m_panel[XPS_MAX_PANELS]; // Child panels (derived from wxPanel)
        int m_pcount;           // Panel count.
        int m_previous;         // Previous page index
        xpsInfo m_info;         // Global flags and bitmap
        int m_start;            // index for first panel.
        int m_finalflag;        // True if finish button instead of next
        wxButton *m_bcancel;    // CANCEL button
        wxButton *m_bnext;      // NEXT button
        wxButton *m_bback;      // BACK button
        wxBoxSizer *m_mainsizer; // Vertical sizer
        wxBoxSizer *m_topsizer;  // Horizontal sizer holding Bitmap and Panel
        wxBoxSizer *m_bottomsizer; // Horizontal sizer holding panel with btns
        wxBoxSizer *m_buttonsizer; // Horz sizer holding buttons within bottom
        wxPanel *m_leftpanel;    // Panel at bottom with buttons broken into 2
        wxPanel *m_rightpanel;  // right panel contains the buttons.
        wxPanel *m_bmpanel;     // Bitmap panel
        wxStaticBitmap *m_staticpng;    // Static png bitmap
};  // xpsWizard


#endif
// __XPSWIZARD_H__
-----------------------------------
Now is the xpsWizard.cpp:

Code: Select all

//---------------------------------------------------------------------------
//
// Name:        xpsWizard.cpp
// Author:      donm
// Created:     7/13/2009 6:51:17 PM
// Description: xpsWizard class implementation
//
//---------------------------------------------------------------------------

#include "xpsWizard.h"

// This function displays a specific page in the wizard. The control buttons
// already exist, as do the panels with the controls. Now we just have to
// create a special page with a bitmap (if speced), the buttons, and controls.
void xpsWizard::displaypage(int index)
{
    // New approach. Just clear out the topsizer, swap the new work panel for the old one and that
    // should be it.

    // If index is out of bounds, then exit.
    if (index < 0 || index >= m_pcount)
    {
	   return;
    }
    
    // Setup for last page
    if (index < (m_pcount - 1))
    {
        m_finalflag = 0;
        m_bnext->SetLabel(wxT("NEXT"));
    }
    else
    {
        m_finalflag = 1;
        m_bnext->SetLabel(wxT("FINISH"));
    }

    // Clear topsizer
    m_topsizer->Clear(false);

    // Set up the next work panel
    if (m_previous >= 0)
    {
	   m_panel[m_previous]->Lower();	    // Hide old one if one exists.
	   m_panel[m_previous]->Show(false);
    }
    m_panel[index]->Show(true);         // show the new panel
    m_panel[index]->Raise();            // Put the new panel to the front
    m_previous = index;                 // The new panel will be the previous

    // Re-setup the topsizer
    m_topsizer->Add(m_bmpanel, 0, wxALIGN_CENTER);
    m_topsizer->Add(m_panel[index], 0, wxFIXED_MINSIZE|wxALIGN_LEFT);

    // That should be it.
 
}   // displaypage(int index....


// Returns start index
int xpsWizard::getstart(void)
{
    return m_start;
}
// Returns previous page
int xpsWizard::getprevious(void)
{
    return m_previous;
}
// Returns total number of pages
int xpsWizard::getcount(void)
{
    return m_pcount;
}

// Returns true if finished instead of next
bool xpsWizard::final(void)
{
    return (m_finalflag != 0);
}

void xpsWizard::OnCancel(wxCommandEvent &event)
{
    // Handle cancel button
    m_parent->Destroy();    
}

void xpsWizard::OnNext(wxCommandEvent &event)
{
    if (final())    // Finish button
    {
        m_parent->Destroy();
    }
    else            // Next button
    {
        // Handle next button
        int index;
        if (m_previous < 0)
            index = 0;
        else
            index = m_previous + 1;
        displaypage(index);
    }
}

void xpsWizard::OnBack(wxCommandEvent &event)
{
    // Handle back button
    int index;
    if (m_previous < 1)
        index = 0;
    else
        index = m_previous - 1;
    displaypage(index);
}

//---------------------------------------
// xpsWizard Constructor, reads panels from dialog into array of pointers,
// creates the 3 buttons on the bottom right.
xpsWizard::xpsWizard(wxDialog *parent, int index, int flags, wxBitmap *bitmap)
                : wxEvtHandler()
{
    // Set up the private variables.
    m_parent = parent;      // Parent class (is member of)
    m_info.flags = flags;   // Defines Global buttons on lower right.
    m_info.bitmap = bitmap; // Sets global bitmap
    m_start = index;        // Start index into panels to display first.
    m_previous = -1;        // Initialize to -1 as previously displayed page

    // Collect panels in the xxxxDlg dialog and put them into the m_panel array.
    wxWindow *pwin = (wxWindow *)parent;
    wxWindowList listpanel = pwin->GetChildren();
    wxWindowListNode *pnode = listpanel.GetFirst();
    int i = 0;  // index into panel array
    wxSize psize(440,350);
    while (pnode)
    {
        wxPanel *pdata = (wxPanel *)pnode->GetData();  // Get the child widget
        //if (wxDynamicCast(pdata, wxPanel) != NULL)    // change to this
        if (pdata->IsKindOf(CLASSINFO(wxPanel))) // if wxPanel derived
        {
            pdata->Show(false);     // Hides the panel
            m_panel[i] = pdata;     // Store this object
            //psize = pdata->GetSize();   // Set current size to min size
            pdata->SetMinSize(psize);   // Should be 440 x 350
            pdata->SetInitialSize(psize);
            pdata->SetSize(200,0,440,350);    // 
            i++;                    // increment index to next panel
        }
        pnode = pnode->GetNext();    // Note that GetNext function is in wxNode
    }   // while (pnode....
    m_pcount = i;   // This set the number of panels in the wizard.

    // Now create extra panels that are used to create the wizard.
    wxSize leftsize(380,40);
    m_leftpanel = new wxPanel(m_parent, wxID_ANY, wxDefaultPosition, leftsize);
    m_leftpanel->SetMaxSize(leftsize);
    m_leftpanel->Show(true);
    
    // Buttons go on this panel.
    wxSize rightsize(260,40);
    m_rightpanel = new wxPanel(m_parent, wxID_ANY, wxDefaultPosition, rightsize);
    m_rightpanel->SetMaxSize(rightsize);
    //m_rightpanel->SetInitialSize(rightsize);   
    m_rightpanel->Show(true);
    
    // Set up bitmap
    wxSize bmsize(200,350);
    m_bmpanel = new wxPanel(m_parent, wxID_ANY, wxDefaultPosition, bmsize);
    m_bmpanel->SetMaxSize(bmsize);
    m_bmpanel->Show(true);
    m_staticpng = new wxStaticBitmap(m_bmpanel, wxID_ANY, *m_info.bitmap);

    // Create buttons and place them on the rightpanel.
    m_bback = new wxButton(m_rightpanel, ID_BTN_BACK, wxT("BACK"));
    if (m_info.flags & XPS_FLAG_BACK)
        m_bback->Show(true);
    else
        m_bback->Show(false);
    m_bnext = new wxButton(m_rightpanel, ID_BTN_NEXT, wxT("NEXT"));
    if (m_info.flags & XPS_FLAG_NEXT)
        m_bnext->Show(true);
    else
        m_bnext->Show(false);
    m_bcancel = new wxButton(m_rightpanel, ID_BTN_CANCEL, wxT("CANCEL"));
    if (m_info.flags & XPS_FLAG_CANCEL)
        m_bcancel->Show(true);
    else
        m_bcancel->Show(false);
        
    // Now create the sizers   
    m_mainsizer = new wxBoxSizer(wxVERTICAL);
    m_topsizer = new wxBoxSizer(wxHORIZONTAL);
    m_bottomsizer = new wxBoxSizer(wxHORIZONTAL);
    m_buttonsizer = new wxBoxSizer(wxHORIZONTAL);

    // Bottom Sizer first (remains unchanged)
    m_bottomsizer->Add(m_leftpanel);
    m_bottomsizer->Add(m_rightpanel); //, 0, wxFIXED_MINSIZE);
 
    // Set up buttons in buttonsizer
    m_buttonsizer->Add(m_bback, 0, wxALIGN_TOP|wxRIGHT, 5);
	m_buttonsizer->Add(m_bnext, 0, wxALIGN_TOP|wxRIGHT, 10);
    m_buttonsizer->Add(m_bcancel, 0, wxALIGN_TOP|wxRIGHT, 10);

    m_rightpanel->SetSizer(m_buttonsizer);

    m_mainsizer->Add(m_topsizer);
    m_mainsizer->Add(m_bottomsizer);

    m_parent->SetSizer(m_mainsizer);

}   // xpWizard constructor must finish before displaypage can happen.

int xpsWizard::changeflags(int flags)
{
    int old = m_info.flags;
    m_info.flags ^= flags;
    return old;
}

xpsWizard::~xpsWizard()
{
    // delete all loose pointers
    //
    // These pointers are children of the parent, so it should
    // all be taken care of automatically.
  /*  
    delete m_bcancel;
    delete m_bnext;
    delete m_bback;
    delete m_bfinish;
    
    delete m_mainsizer;
    delete m_topsizer;
    delete m_bottomsizer;
    delete m_buttonsizer;
    
    delete m_bmpanel;
    delete m_leftpanel;
    delete m_rightpanel;
    
    delete m_staticpng; // Delete wxStaticBitmap
*/
}
------------------------------
[/img]

Auria
Site Admin
Site Admin
Posts: 6695
Joined: Thu Sep 28, 2006 12:23 am
Contact:

Post by Auria » Sat Jul 25, 2009 8:07 pm

Could you post a minimal compilable sample? If possible with only the relevant sizer bits. I am willing to help you, but not try to understand your framework to get it to work (i tried creating an instance of this wizard class of yours but it crashed. I guess I'm doing something wrong, but I don't have time to investigate your code that much)
"Keyboard not detected. Press F1 to continue"
-- Windows

webmasterpdx
Knows some wx things
Knows some wx things
Posts: 27
Joined: Thu Jun 25, 2009 2:43 am
Location: Portland, Oregon
Contact:

Post by webmasterpdx » Sat Jul 25, 2009 8:40 pm

If I were to create a minimal sample I'd probably find the problem myself. I tried to make it simple in the form of questions so that wouldn't be necessary. I believe the answer to the following question will solve my problems.

When you call panel.SetSizer(sizer) can that sizer resize the panel? If so, is there a way to stop it from doing so?
If not, if that sizer is Added to another sizer, can that other sizer resize the panel (i.e is there some place in the sizer tree that can resize a panel placed into that tree?). If so, how can one make the panel non-resizable and for certain panels, make the panel not resizable, and it's children not movable....just allowing the movement of the panel itself around the window.
i.e. I am trying to use the sizers to move buttons around, but not to resize certain panels. I want those certain panels to remain intact and to keep their children intact as I created them in the form tool

So from this description I see 2 circumstances that are non-standard for sizers.

1. The panel is created so it will ALWAYS stay the same size, no matter what arrangement of sizers is placed upon it.
2. A panel is created as in 1, with the additional stipulation that it's children placed on it using a visual form tool, will not be moved by any sizer in the sizer tree.

Thank you.
-Donald

webmasterpdx
Knows some wx things
Knows some wx things
Posts: 27
Joined: Thu Jun 25, 2009 2:43 am
Location: Portland, Oregon
Contact:

Post by webmasterpdx » Sat Jul 25, 2009 10:27 pm

I think I have a solution for my unchanging panel size. It's to set the minimum size of the sizer using the sizer->SetMinSize(w,h) function call, or alternatively to use the sizer->SetDimension(x,y,w,h) to force position and size. Combining that with the panel->SetMinSize and SetMaxSize, I believe I can force a wxPanel to remain unchanged in size within a tree of sizers.

Now, the one other problem remains which is how to keep a panel WITH CHILDREN controls to remain the same and maintain their positions relative to one another (and sizes). I believe the sizes may be controlled through the use of wxFIXED_MINSIZE, but not position. Any ideas on this side of things?

Thanks
-Donald

Auria
Site Admin
Site Admin
Posts: 6695
Joined: Thu Sep 28, 2006 12:23 am
Contact:

Post by Auria » Sat Jul 25, 2009 10:30 pm

webmasterpdx wrote: When you call panel.SetSizer(sizer) can that sizer resize the panel?
If so, is there a way to stop it from doing so?
If not, if that sizer is Added to another sizer, can that other sizer resize the panel (i.e is there some place in the sizer tree that can resize a panel placed into that tree?). If so, how can one make the panel non-resizable and for certain panels, make the panel not resizable,
I don't believe it can unless you call SetSizerAndFit or Fit. But maybe the sizer that contains the panel will ask this sizer for advice about the best size. If you wish to override this behaviour, calling SetMinSize(...) and SetMaxSize(...) should help.
and it's children not movable....just allowing the movement of the panel itself around the window.
i.e. I am trying to use the sizers to move buttons around, but not to resize certain panels. I want those certain panels to remain intact and to keep their children intact as I created them in the form tool
Here i don't follow you, sorry. Not sure what you mean with "moving" children. You mean you want to set their location manually? Then you can, just don't use any sizer on that panel.

1. The panel is created so it will ALWAYS stay the same size, no matter what arrangement of sizers is placed upon it.
Calling SetMinSize and SetMaxSize with the same size should make a panel non-resizing (be sure to give it a proportion of 0 when adding it to the sizer though, a proportion of > 0 makes the size of the panel depend on the size of the contain - not sure it respects the max size then)
2. A panel is created as in 1, with the additional stipulation that it's children placed on it using a visual form tool, will not be moved by any sizer in the sizer tree.
If the panel you place widgets on has no sizer, its children should not move.
"Keyboard not detected. Press F1 to continue"
-- Windows

webmasterpdx
Knows some wx things
Knows some wx things
Posts: 27
Joined: Thu Jun 25, 2009 2:43 am
Location: Portland, Oregon
Contact:

Post by webmasterpdx » Sun Jul 26, 2009 12:18 am

If the sizers are not resizing the panels then they are creating a virtual box inside the panel where they are placing the panel's children and this is smaller than the panel so alignment works in this box....not relative to the panel....as you point out and I pointed out in my last post, I believe SetMinSize and SetMaxSize on the Sizer as well as on the panel when used in the right combination will ensure that a panel will stay a certain size...I haven't had time to try it yet, but I'm pretty sure that will fix that problem.

Now the problem with the not using a sizer on a panel is this (for the case where I want to place the children manually).

I need to place 2 panels side by side. I am currently using a topsizer(wxHorizontal) for that and I'm using a similar one for the one below (bottomsizer) and then I put both horizontal sizers together in a mainsizer(wxVertical) which is set to the sizer to the whole wxDialog.

The sizers are smart. The horizontal sizer is able to take the children from both panels and overlap them (I've seen it).

I agree that no sizer will leave the panel alone. Problem is that I need to combine the panels with ones that have sizers. I'm not sure if you can place a panel on the left that is part of a horizontal sizer and a panel on the right that is not part of the sizer. I'm unsure what will happen in that case.

I think that my solution may be to use absolute sizing on everything except my lower right panel which has 3 buttons in it and I shouldn't have to worry about absolute positions for a few buttons. It reduces the problem space considerably this way and I believe I can eliminate one of the panels this way.

I still think it would be useful for placing panels side by side to have a sizer that leaves a panel as it is (not moving it's children) and just moves the whole panel around for scenarios like that mentioned above.

Thanks for all your help. I'm going to close this one out now...

Thx
-D

Auria
Site Admin
Site Admin
Posts: 6695
Joined: Thu Sep 28, 2006 12:23 am
Contact:

Post by Auria » Sun Jul 26, 2009 3:46 pm

I never tried it myself, but I don't see why you couldn't use sizers everywhere but on one specific panel where children would be placed absolutely
"Keyboard not detected. Press F1 to continue"
-- Windows

Post Reply