Click here to Skip to main content
15,896,557 members
Articles / Desktop Programming / MFC

The Ultimate Toolbox - Updates and User Contributions

Rate me:
Please Sign up or sign in to vote.
4.79/5 (26 votes)
12 Feb 2013CPOL8 min read 256.6K   23.7K   170  
Updates and User Contributions for the Ultimate Toolbox Libraries
// ==========================================================================
// 					Class Specification : COXRollup
// ==========================================================================

// Header file : oxrollup.h

// Version: 9.3

//
// This software along with its related components, documentation and files ("The Libraries")
// is � 1994-2007 The Code Project (1612916 Ontario Limited) and use of The Libraries is
// governed by a software license agreement ("Agreement").  Copies of the Agreement are
// available at The Code Project (www.codeproject.com), as part of the package you downloaded
// to obtain this file, or directly from our office.  For a copy of the license governing
// this software, you may contact us at legalaffairs@codeproject.com, or by calling 416-849-8900.                      
//
// //////////////////////////////////////////////////////////////////////////

// Properties:
//	NO	Abstract class (does not have any objects)
//	YES	Derived from CDialog

//	YES	Is a Cwnd.                     
//	YES	Two stage creation (constructor & Create())
//	YES	Has a message map
//	YES 	Needs a resource (template)

//	NO	Persistent objects (saveable on disk)      
//	NO	Uses exceptions

// //////////////////////////////////////////////////////////////////////////

// Desciption :         
//	This class can be used to have an interface like CorelDraw.
//	It is a Rollup dialog.  Dialog with a special caption and that can be rolled up (only
//	caption is visible) or rolled out (caption + dialog + controls are visible)

// Remark:
//		***
// Prerequisites (necessary conditions):
//		***

// This class needs the bmp resource with the ID TITLEBAR_BMP
// It also needs the menuID's IDM_RU_ABOUT, IDM_RU_CLOSE, IDM_RU_ROLLUP , IDM_RU_ROLLDOWN,
// IDM_RU_ARRANGE and IDM_RU_ARRANGEALL

//	This file uses resources.
//	The reserved ID ranges are : 23000 -> 23019 and 53000 -> 53019

/////////////////////////////////////////////////////////////////////////////

#ifndef __ROLLUP_H__
#define __ROLLUP_H__

#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000

#include "OXDllExt.h"

// v9.3 - update 03 - 64bit - included for OXTPARAM
#include "UTB64Bit.h"

#include "OXMainRes.h"

typedef struct tagSCROLL_HELP
	{
	int decrement;
	int width;
	int height;
	int capHeight;
	int steps;
	int curstep;
	int direction;
	}
SCROLL_STRUCT;

//important defines

#define ID_PRIVATEMSG (IDNO + 0x0039)

#define DELAY_TIME		5
#define ROLL_STATES		5
#define TBAR_HEIGHT		14

// for notification messages; message map macro; use it!!
#ifdef _WIN32
	#define ON_ROLLUP_NOTIFICATION() \
		{ WM_LMSUROLLUP, 0, 0, 0, AfxSig_bWww, \
			(AFX_PMSG)(AFX_PMSGW)(BOOL (AFX_MSG_CALL CWnd::*)(CWnd*, UINT, UINT))OnRollupMessage },
#else
	#define ON_ROLLUP_NOTIFICATION() \
		{ WM_LMSUROLLUP, 0, AfxSig_bWww, \
			(AFX_PMSG)(AFX_PMSGW)(BOOL (AFX_MSG_CALL CWnd::*)(CWnd*, UINT, UINT))OnRollupMessage },
#endif

//  Message Map:
//
//	afx_msg BOOL OnRollupMessage(CWnd* pWndRollup,UINT message,UINT rollupID);
//

// Parent/MR ---> Dialog
#define ID_ROLLUP		(ID_PRIVATEMSG + 2)	// View->Dlg
#define ID_ROLLDOWN		(ID_PRIVATEMSG + 3)	// View->Dlg

// Message ID (intended, no must)
// IDCANCEL		delivers close message to parent
// is defined an is!!!! used
// you can use furthermore: IDOK,IDABORT,IDRETRY,IDIGNORE,
// IDYES,IDNO
#define ID_APPLY		(ID_PRIVATEMSG + 4)	// Dlg->View
#define ID_CHANGED		(ID_PRIVATEMSG + 5)	// Dlg->View

#include "OXTleBar.h"


class OX_CLASS_DECL COXRollup : public CDialog
{
	friend class COXTitleBar;		// no must, but convenient
	DECLARE_DYNAMIC(COXRollup);

// Data members -------------------------------------------------------------
public:

protected:
	COXTitleBar*	m_pTitleBar;		// Titlebar window
	BOOL			m_bRolledUp;		// rolled up?
	BOOL			m_bResizingFrame;	// do we have a resizing frame?
	
	// variables to control dragging
	UINT			m_myTimerID;		// timer id used for rolling up and down
	
	int				m_xWidth;
	int				m_yHeight;			// stored heights and widths of rollup (for resizeable)
	CMenu*			m_pSysMenu;			// pointer to system menu
	
	WORD			m_nRollup;			// ID of our dialog, external
	
	UINT			m_nTemplateID;		// Ressource ID of dialog
	
	HWND			m_hWndMR;			// window getting messages (currently)
	HWND			m_hWndDestroyRC;	// window that gets call to destroy rollup	
	CString			m_sCaption;			// caption of Rollup

	int				m_nScrollSteps;		// the number of steps to be used for rolling up/down

	BOOL			m_bRolling;

private:
	static CPtrList m_RollupList;		// list for our created rollups
	static CPtrList m_ArrangedRollups;
	BOOL			m_bIsArranged;

	SCROLL_STRUCT	m_SCROLL_HELP;

// Member functions ---------------------------------------------------------
public:
	COXRollup(UINT nTemplate, CWnd* pParent = NULL);
	// --- In  : nTemplate : the resource template
	//			 pParent : the window parent of the rollup dialog
	// --- Out : 
	// --- Returns :
	// --- Effect : Contructor of object
	//				It will initialize the internal state

	void RemoveFromRUList();
	// --- In  : 
	// --- Out : 
	// --- Returns : 
	// --- Effect : Called by destructor to remove it from active rollup list.
	//				Call if you don�t want your Rollup available to Arrange All

	void InternalRollUp();
	// --- In  : 
	// --- Out : 
	// --- Returns : 
	// --- Effect : Used primarily by Arrange/ArrangeAll. Use it if you want to quickly scroll up
	//				the rollup (for example after a call to CreateRollUp(...) to show it
	//				initially rolled up)

	BOOL IsRolling();
	// --- In  : 
	// --- Out : 
	// --- Returns : TRUE if the rollup is rolling
	// --- Effect : 

	static void ReArrangeArranged();
	// --- In  : 
	// --- Out : 
	// --- Returns : 
	// --- Effect : Call it from CMainFrame::OnSize(...) and CMainFrame::OnMove(...)to guarantee that
	//				all former arranged Rollups will align to upper left corner of CMainFrame after
	//				sizing or moving.

	BOOL IsArranged();
	// --- In  : 
	// --- Out : 
	// --- Returns : arranged or not
	// --- Effect : Call to obtain information about arrange-state

	void UnArrange();
	// --- In  : 
	// --- Out : 
	// --- Returns : 
	// --- Effect : Call if you want to remove the rollup from the arranged list.
	//				In contrast with RemoveFromRUList() this function will not affect
	//				the rollup to be arranged again after a new call to ArrangeAll().

	BOOL CreateRollUp(CWnd* pParent, WORD nID, int nIDCaption=IDS_OX_ROLLUPCAPTION); //"No Caption!"
	BOOL CreateRollUp(CWnd* pParent, WORD nID, LPCTSTR lpszCaption); 
	// --- In  : pParent : Pointer to the parent (destroyer)
	//			 nID : Simple number to identify later which Rollup sent the message.
	//			 lpcstrCaption : Caption of dialog
	// --- Out : 
	// --- Returns : suceeded or not
	// --- Effect : Call this function to create the rollup dialog

	virtual COXTitleBar* OnGetTitleBar();
	// --- In  : 
	// --- Out : 
	// --- Returns : the titlebar
	// --- Effect : If overriding this function allocate storage for your derived object,
	//				cast it to COXTitleBar. This is the function to hook your own titlebar
	//				in the Rollup system. See the overrideables in the COXTitleBar class.

	virtual void GetTitleBarRect(CRect &rcTBarRect);
	// --- In  : 
	// --- Out : rcTBarRect : the rectangle of the titlebar (+1 pt border)
	// --- Returns : 
	// --- Effect : Is called after OnGetTitlebar. Pass in the size you want for your Titlebar.

	virtual LPCTSTR GetTitleBarBitmap();
	// --- In  : 
	// --- Out : 
	// --- Returns : a resource string
	// --- Effect : Return the Resource string of this Rollup

	// managing the message dispatch
    HWND SetRecipient(CWnd* pWnd);
	// --- In  : pWnd : Pointer to the new message recipient
	// --- Out : 
	// --- Returns : the window handle of the old message recipient
	// --- Effect : Call this function from an OnSetFocus handler to notify the Rollup of its
	//				new address to send its messages. Store return value for ongoing �talk" between Rollup
	//				and message recipient

	LRESULT	Send2MR(WORD msg);
	// --- In  : msg : message to be send
	// --- Out : 
	// --- Returns : message return
	// --- Effect : Sends the specified message to the current message recipient.

	BOOL Post2MR(WORD msg);
	// --- In  : msg : message to be send
	// --- Out : 
	// --- Returns : If the function succeeds, the return value is TRUE.
	//				 If the function fails, the return value is FALSE. 
	// --- Effect : posts the specified message to the current message recipient.

	HWND GetCurMsgRecipient();
	// --- In  : 
	// --- Out : 
	// --- Returns : the window handle of the current message recipient
	// --- Effect : 
		  
	void ReleaseRecipient(const CWnd* pRCRequesting, BOOL bCallNotifyFunction = FALSE);
	// --- In  : pRCRequesting : pointer to the window requesting to be released as recipient
	//			 bCallNotifyFunction : whether or not to be notified of release
	// --- Out : 
	// --- Returns : 
	// --- Effect : Call this function to dismiss yourself as message recipient.

    virtual void OnRecipientRelease()
		{};
	// --- In  : 
	// --- Out : 
	// --- Returns : 
	// --- Effect : virtual called during ReleaseRecipient if BOOLEAN bCallNotifyFunction is TRUE

    BOOL IsOwner(const CWnd* pRecipWnd) const;
	// --- In  : pRecipWnd : a window pointer
	// --- Out : 
	// --- Returns : whether or not pRecipWnd is the current message recipient				
	// --- Effect : Check if you are the owner of the message dispatch

    // helpers for frame/rolling
    BOOL IsRolledUp();
	// --- In  : 
	// --- Out : 
	// --- Returns : rolled up or not
	// --- Effect : Call this function to get the rollup-state
	//				(TRUE == rolled up, FALSE == rolled down)

	BOOL CanResize();       
	// --- In  : 
	// --- Out : 
	// --- Returns : whether or not the rollup is resizble (WS_THICKFRAME or not)
	// --- Effect : 

	// special UpdateData function; see implementation
	BOOL RUpdateData(BOOL bUpdateFlag);
	// --- In  : 
	// --- Out : 
	// --- Returns : see CWnd::UpdateData(...)
	// --- Effect : 

	WORD GetRollupID();
	// --- In  : 
	// --- Out : 
	// --- Returns : unique Rollup ID 
	// --- Effect : retrieve unique Rollup ID when you have more than one Rollup in use
	//				Passed at creation time : CreateRollup(...)

	int GetScrollSteps()
		{ return m_nScrollSteps; }
	// --- In  : 
	// --- Out : 
	// --- Returns : the number of steps used when scrolling down/up
	// --- Effect : 

	void SetScrollSteps(int nScrollSteps)
		{ m_nScrollSteps = nScrollSteps; }
	// --- In  : nSCrollSteps : the number of steps to be used when scrolling down/up
	// --- Out : 
	// --- Returns : 
	// --- Effect : 

	void OnCancel()
		{};	// just do nothing
	// --- In  : 
	// --- Out : 
	// --- Returns : 
	// --- Effect : 

    void OnOK()
		{};		// again: just do nothing
	// --- In  : 
	// --- Out : 
	// --- Returns : 
	// --- Effect : 

	// additional menu functions
	CMenu* GetSysMenu();
	// --- In  : 
	// --- Out : 
	// --- Returns : the menu attached to this rollup
	// --- Effect : 

    virtual ~COXRollup();
	// --- In  : 
	// --- Out : 
	// --- Returns : 
	// --- Effect : destructor of the object

protected:
	// advanced overrideables
	virtual void OnProcessSysMenu();
	// --- In  : 
	// --- Out : 
	// --- Returns : 
	// --- Effect : Override this function to do your own menu processing

	virtual CMenu* OnGetSysMenu();
	// --- In  : 
	// --- Out : 
	// --- Returns : 
	// --- Effect : Override this function to provide an alternative system
	//				menu for your Rollup

	virtual void PostNcDestroy();

	// helper functions
	void SetArrangeFlagTrue();
    void DetermineFrameStyle();
	void DrawCaption(int nDisplayElement);
  
	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV support

	// Generated message map functions
	//{{AFX_MSG(CRollup)
	afx_msg void OnClickedRoll();
	virtual void OnCloseRollup();
	afx_msg LRESULT OnRollMessage(WPARAM,LPARAM);
	afx_msg void OnRollUpAbout();
	afx_msg void OnSize(UINT nType, int cx, int cy);
	afx_msg void OnActivate(UINT,CWnd*,BOOL);
	// v9.3 - update 03 - 64-bit - using OXTPARAM here - see UTB64Bit.h
	afx_msg void OnTimer(OXTPARAM nIDEvent);
	afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
	afx_msg void Arrange();
	afx_msg void ArrangeAll();
	afx_msg void OnDestroy();
	afx_msg void OnNcPaint();
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

// inlined functions
inline BOOL COXRollup::IsRolledUp()
	{ 	return m_bRolledUp; }

inline BOOL COXRollup::IsOwner(const CWnd* pRecipWnd) const
	{
	ASSERT(pRecipWnd != NULL && IsWindow(pRecipWnd->GetSafeHwnd()));
	return (m_hWndMR == pRecipWnd->GetSafeHwnd());
	}

inline BOOL COXRollup::CanResize() 
	{ 	return m_bResizingFrame; }

inline BOOL COXRollup::RUpdateData(BOOL bUpdateFlag)
	{	
	if (GetSafeHwnd() == NULL)
		return FALSE;
	
	return UpdateData(bUpdateFlag);
	}  

inline WORD COXRollup::GetRollupID()
	{	return m_nRollup; }

inline LPCTSTR COXRollup::GetTitleBarBitmap()
	{	
	CString sTitle;
	VERIFY(sTitle.LoadString(IDS_OX_ROLLUPBITMAP));
	return sTitle;
	}

inline BOOL COXRollup::IsArranged()
	{ return m_bIsArranged; }

inline void COXRollup::SetArrangeFlagTrue()
	{ m_bIsArranged = TRUE; }

#endif

// ==========================================================================

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Web Developer
Canada Canada
In January 2005, David Cunningham and Chris Maunder created TheUltimateToolbox.com, a new group dedicated to the continued development, support and growth of Dundas Software’s award winning line of MFC, C++ and ActiveX control products.

Ultimate Grid for MFC, Ultimate Toolbox for MFC, and Ultimate TCP/IP have been stalwarts of C++/MFC development for a decade. Thousands of developers have used these products to speed their time to market, improve the quality of their finished products, and enhance the reliability and flexibility of their software.
This is a Organisation

476 members

Comments and Discussions