Click here to Skip to main content
15,889,992 members
Articles / Desktop Programming / MFC
Article

3D Studio Max like Slidable DialogBar

Rate me:
Please Sign up or sign in to vote.
4.93/5 (30 votes)
17 Feb 20021 min read 268.3K   8.1K   98   50
Ever seen 3D Studio 2.5 Slidable DialogBar? Want to know how they did it?

Image 1

Introduction

Kinetix and Autodesk always impressed me with their great GUI. 3D Studio Max has a Slidable DialogBar that the user can slide up and down... Well here is how to do it yourself. It is probably one of the easiest code I ever had to show around and anybody with a little experience in VC++ / MFC will get it. (I actually posted it because I have never seen another programmer or company create a GUI similar to 3DS Max)

Here is the Magic Theory behind it

  1. Create any kind of CWnd derived class . That will be your TOP level Window (could be a CDialog / CDialogBar / CButton anything...)

    Lets say CDialogBarExt ....derived from CDialogBar.

  2. Create a CWnd derived Class that will contain the actual sliding dialog.

    Lets say CDlgContainer ....derived from CWnd

  3. Create a member variable for CDialogBarExt of type CDlgContainer.

  4. Create a CDialog derived class .

    Lets say CInnerDlg (this is the actual sliding dialog !!!)

  5. Create a member variable of type CInnerDlg for CDlgContainer....

So up till know we have CDialogBarExt--->CDlgContainer--->CInnerDlg ? ok? the Code for Sliding the dialog is below and should be entered in the

CInnerDlg

The easiest way to understand, is to look through the code it is very simple!!!

void CInnerDlg::OnLButtonUp(UINT nFlags, CPoint point) 
{
    /// IF WE WHERE DRAGGING THEN RELEASE THE MOUSE CAPTURE
    if(m_bDragging)
    {
        ReleaseCapture();
        m_bDragging = FALSE;
    }
    
    CDialog::OnLButtonUp(nFlags, point);
}

void CInnerDlg::OnMouseMove(UINT nFlags, CPoint point) 
{

 int ydiff;

    if(m_bDragging && nFlags & MK_LBUTTON)
    {
       // GET DIALOGS WINDOW SCREEN COORDINATES
       CRect rcWnd;
       GetWindowRect(&rcWnd);

       // GET PARENTS CLIENT RECTANGLE
       CRect prect;
       GetParent()->GetClientRect (prect);

       // IF WE HAVE TO GO DOWN OR UP // 
       if (m_ptDragFrom.y>point.y) {    
          ydiff = point.y - m_ptDragFrom.y;
          posY+=ydiff;
       }// IF WE HAVE TO GO DOWN OR UP // 
       if (m_ptDragFrom.y<point.y) {    
          ydiff = m_ptDragFrom.y -point.y;
          posY-=ydiff;
       }
       //////////////////////////////


       // CALCULATE IF WE ARE GOING TO EXCEED BOTTOM DIALOG BORDER
       int tmp=prect.Height ()-rcWnd.Height ();
       
       // CONSTRAINTS !
       if (posY<tmp+1) posY=tmp+1;
       if (posY>-1) posY=-1;

       // MOVE THE DIALOG 
        SetWindowPos(NULL, 3, 
                     posY, 
                     rcWnd.Width(), 
                     rcWnd.Height(), SWP_SHOWWINDOW|SWP_NOSIZE);


    }    
    
    CDialog::OnMouseMove(nFlags, point);
}

void CInnerDlg::OnLButtonDown(UINT nFlags, CPoint point) 
{
   // START DRAGGING 
   SetCapture();
   m_bDragging = TRUE;
   m_ptDragFrom = point;
   ::SetCursor(AfxGetApp()->LoadCursor (IDC_CURSOR_HAND));
   CDialog::OnLButtonDown(nFlags, point);
}

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
United States United States
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
GeneralRe: Sorry, not cool at all Pin
cwtung14-Aug-07 19:43
cwtung14-Aug-07 19:43 
GeneralGood work. Just a problem! Pin
26-Feb-02 11:04
suss26-Feb-02 11:04 
GeneralRe: Good work. Just a problem! Pin
John Aspras6-Mar-02 1:59
John Aspras6-Mar-02 1:59 
QuestionUsability issue? Pin
18-Feb-02 20:29
suss18-Feb-02 20:29 
AnswerRe: Usability issue? Pin
Christian Graus18-Feb-02 23:34
protectorChristian Graus18-Feb-02 23:34 
GeneralRe: Usability issue? Pin
Thomas Freudenberg18-Feb-02 23:54
Thomas Freudenberg18-Feb-02 23:54 
AnswerRe: Usability issue? Pin
Mitchell19-Feb-02 4:42
Mitchell19-Feb-02 4:42 
AnswerRe: Usability issue? Pin
Bjoern Graf19-Feb-02 5:48
Bjoern Graf19-Feb-02 5:48 
Hi,

Igor Green wrote:
But I'd like to warn novices from using such dialogs in their applications - I think it's not very user friendly, to say the least. Dialog/cmdbars which do not fit in window area, should be redesigned to use tabs or any similar means of switching visible parts with single mouse clicks or keystroke.

I totally agree with this, but there are application where it will result in a great amount of tabs (3DMax has tabs for the different editing stages that switch the sliding dlg with the associated properties). It seems that even Discreet realized the usabillity flaws and changed the implementation in 3DMax 3 and above. There are two implementation here on Code Project that show the new interface [1, 2].

Bjørn.

[1] MFC Rollup Control
[2] WTL Rolldown Control
GeneralRe: Usability issue? Pin
20-Feb-02 21:13
suss20-Feb-02 21:13 
AnswerRe: Usability issue? Pin
archimedean4-May-03 5:01
archimedean4-May-03 5:01 
GeneralThat is <i>sooo</i> cool! Pin
Shog918-Feb-02 14:06
sitebuilderShog918-Feb-02 14:06 
GeneralRe: That is <i>sooo</i> cool! Pin
Christian Graus18-Feb-02 17:27
protectorChristian Graus18-Feb-02 17:27 
GeneralRe: That is <i>sooo</i> cool! Pin
12-Mar-02 21:54
suss12-Mar-02 21:54 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.