194 lines
4.8 KiB
C++
194 lines
4.8 KiB
C++
// mysizeba.cpp : implementation file
|
|
//
|
|
// Docktest demo of Dockable Views functionality
|
|
|
|
#include "stdafx.h"
|
|
#include "docktest.h"
|
|
#include "mysizeba.h"
|
|
#include "UTBStrOp.h"
|
|
|
|
#define ID_PopupMessage 2000
|
|
|
|
#ifdef _DEBUG
|
|
#undef THIS_FILE
|
|
static char BASED_CODE THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CMyListBoxBar
|
|
//
|
|
// This is a sizeable contorl bar that has a list box and a button on it.
|
|
// It is designed to be created dynamically ie you can have more than one
|
|
// of them.
|
|
|
|
IMPLEMENT_DYNAMIC(CMyListBoxBar, COXSizeControlBar);
|
|
|
|
CMyListBoxBar::CMyListBoxBar()
|
|
: COXSizeControlBar( SZBARF_STDMOUSECLICKS/* | SZBARF_ALLOW_MDI_FLOAT*/)
|
|
{
|
|
}
|
|
|
|
CMyListBoxBar::~CMyListBoxBar()
|
|
{
|
|
}
|
|
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(CMyListBoxBar, COXSizeControlBar)
|
|
//{{AFX_MSG_MAP(CMyListBoxBar)
|
|
ON_WM_CREATE()
|
|
ON_COMMAND(ID_PopupMessage, PopupMessage)
|
|
ON_WM_RBUTTONUP()
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CMyListBoxBar message handlers
|
|
|
|
|
|
//-------------------------------------------------------------------
|
|
void CMyListBoxBar::OnSizedOrDocked(int cx, int cy, BOOL bFloating, int flags)
|
|
// respond to this event as we need to override it
|
|
//-------------------------------------------------------------------
|
|
{
|
|
UNREFERENCED_PARAMETER(bFloating);
|
|
UNREFERENCED_PARAMETER(flags);
|
|
UNREFERENCED_PARAMETER(cx);
|
|
UNREFERENCED_PARAMETER(cy);
|
|
|
|
CRect rect;
|
|
GetClientRect(rect);
|
|
|
|
// shrink rectangle if we're docked
|
|
if (IsProbablyFloating())
|
|
rect.InflateRect(-2, -2); // shrink for border when floating
|
|
else
|
|
rect.InflateRect(-4, -4);
|
|
|
|
// position the button at the top right of the window
|
|
CRect ButtonRect;
|
|
m_Button.GetWindowRect(&ButtonRect);
|
|
rect.right -= ButtonRect.Width();
|
|
m_Button.SetWindowPos(NULL, rect.right, rect.top, 0, 0,
|
|
SWP_NOZORDER | SWP_NOSIZE);
|
|
|
|
// fill the rest of the window with the list box..
|
|
rect.right -= 4; // leave a bit of space.
|
|
m_ListBox.MoveWindow(&rect);
|
|
|
|
}
|
|
|
|
|
|
//-------------------------------------------------------------------
|
|
int CMyListBoxBar::OnCreate(LPCREATESTRUCT lpCreateStruct)
|
|
//-------------------------------------------------------------------
|
|
{
|
|
if (COXSizeControlBar::OnCreate(lpCreateStruct) == -1)
|
|
return -1;
|
|
|
|
CRect rect;
|
|
GetClientRect(&rect);
|
|
|
|
|
|
// Register a class for the list box without CS_VREDRAW, CS_HREDRAW
|
|
WNDCLASS wc;
|
|
VERIFY(GetClassInfo(AfxGetInstanceHandle(), _T("LISTBOX"), &wc));
|
|
wc.style &= ~(CS_VREDRAW | CS_HREDRAW);
|
|
wc.lpszClassName = _T("_MF_LISTBOX");
|
|
VERIFY(AfxRegisterClass(&wc));
|
|
|
|
// create a list box to fill the client area with. Use CreateEx to add the
|
|
// WS_EX_CLIENTEDGE style.
|
|
if (!m_ListBox.CreateEx(WS_EX_CLIENTEDGE,
|
|
_T("_MF_LISTBOX"),
|
|
NULL,
|
|
WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL
|
|
| LBS_HASSTRINGS | LBS_NOTIFY | LBS_NOINTEGRALHEIGHT,
|
|
rect.left,
|
|
rect.top,
|
|
rect.Width(),
|
|
rect.Height(),
|
|
GetSafeHwnd(),
|
|
0,
|
|
NULL))
|
|
{
|
|
TRACE0("Failed to create list box\n");
|
|
return -1;
|
|
}
|
|
|
|
m_ListBox.SetHorizontalExtent(200);
|
|
|
|
// add some strings to the list box - makes it a bit more interesting
|
|
for (int i = 0; i < 10; i++)
|
|
{
|
|
TCHAR msg[100];
|
|
UTBStr::stprintf(msg, 100, _T("Line %d"), i);
|
|
m_ListBox.AddString(msg);
|
|
}
|
|
|
|
CRect ButtonRect(0, 0, 32, 32); // dimensions of the button
|
|
if (!m_Button.Create(_T("Test"), BS_OWNERDRAW | WS_CHILD | WS_VISIBLE,
|
|
ButtonRect, this, ID_PopupMessage))
|
|
{
|
|
TRACE0("Failed to create push button\n");
|
|
return -1;
|
|
}
|
|
|
|
if (!m_Button.LoadBitmaps(_T("BITMAPBUTU")))
|
|
{
|
|
TRACE0("Failed to load bitmap for button\n");
|
|
return -1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
void CMyListBoxBar::PopupMessage()
|
|
// command handler for the bitmap button. The point of this is to illustrate that
|
|
// unlike c
|
|
{
|
|
int nSel = m_ListBox.GetCurSel();
|
|
CString strMsg;
|
|
if (nSel == -1)
|
|
strMsg = _T("Nothing in the list box is selected");
|
|
else
|
|
strMsg.Format(_T("Listbox item %d was selected"), nSel);
|
|
AfxMessageBox(strMsg);
|
|
}
|
|
|
|
void CMyListBoxBar::OnRButtonUp(UINT nFlags, CPoint point)
|
|
{
|
|
// TODO: Add your message handler code here and/or call default
|
|
// disable docking.
|
|
COXSizeControlBar::OnRButtonUp(nFlags, point);
|
|
|
|
|
|
}
|
|
|
|
|
|
BOOL CMyListBoxBar::PreCreateWindow(CREATESTRUCT& cs)
|
|
{
|
|
return COXSizeControlBar::PreCreateWindow(cs);
|
|
}
|
|
|
|
|
|
BOOL CMyListBoxBar::Create(CWnd * pParentWnd, const CString& sTitle/*=_T("size bar")*/,
|
|
const UINT nID/*=ID_LISTBOXBAR*/)
|
|
{
|
|
// register a window class for the control bar
|
|
static CString strWndClass;
|
|
if (strWndClass.IsEmpty())
|
|
{
|
|
strWndClass = AfxRegisterWndClass(CS_DBLCLKS);
|
|
}
|
|
|
|
return COXSizeControlBar::Create(strWndClass, sTitle,
|
|
WS_VISIBLE | WS_CHILD | CBRS_BOTTOM | WS_CLIPCHILDREN,
|
|
CFrameWnd::rectDefault, pParentWnd, nID);
|
|
}
|
|
|
|
|
|
|