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
- 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
.
- Create a
CWnd
derived Class that will contain the actual sliding dialog.
Lets say CDlgContainer
....derived from CWnd
- Create a member variable for
CDialogBarExt
of type CDlgContainer
.
- Create a
CDialog
derived class .
Lets say CInnerDlg
(this is the actual sliding dialog !!!)
- 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(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)
{
CRect rcWnd;
GetWindowRect(&rcWnd);
CRect prect;
GetParent()->GetClientRect (prect);
if (m_ptDragFrom.y>point.y) {
ydiff = point.y - m_ptDragFrom.y;
posY+=ydiff;
}
if (m_ptDragFrom.y<point.y) {
ydiff = m_ptDragFrom.y -point.y;
posY-=ydiff;
}
int tmp=prect.Height ()-rcWnd.Height ();
if (posY<tmp+1) posY=tmp+1;
if (posY>-1) posY=-1;
SetWindowPos(NULL, 3,
posY,
rcWnd.Width(),
rcWnd.Height(), SWP_SHOWWINDOW|SWP_NOSIZE);
}
CDialog::OnMouseMove(nFlags, point);
}
void CInnerDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
SetCapture();
m_bDragging = TRUE;
m_ptDragFrom = point;
::SetCursor(AfxGetApp()->LoadCursor (IDC_CURSOR_HAND));
CDialog::OnLButtonDown(nFlags, point);
}