2025-11-27 16:46:48 +09:00

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);
}