// ==========================================================================
// 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
// ==========================================================================