|
|
// File: GenContainers.h
#ifndef _GENCONTAINERS_H_
#define _GENCONTAINERS_H_
#include "GenWindow.h"
// A bordered window class. A BorderWindow will layout its children on the 8
// points of the compas plus the center. The creator should set the m_uParts
// member to a bitmask of flags saying which parts are actually used. Then the
// children will be layed out in those parts, in the order of the Parts enum
class // DECLSPEC_UUID("")
CBorderWindow : public CGenWindow { public: // Which parts of the border window are filled with children. The order of
// the children in the window is the same as the order of these contants
enum Parts { TopLeft = 0x0001, Top = 0x0002, TopRight = 0x0004, Left = 0x0008, Center = 0x0010, Right = 0x0020, BottomLeft = 0x0040, Bottom = 0x0080, BottomRight = 0x0100, } ; enum { NumParts = 9 } ;
// BUGBUG georgep: We should probably use setters and getters for all of
// these, so we can force a relayout
// The horizontal gap between components
int m_hGap; // The vertical gap between components
int m_vGap;
// One of the Alignment enum
UINT m_uParts : 9;
// Default constructor; inits a few intrinsics
CBorderWindow();
// Create the window
BOOL Create( HWND hWndParent // The parent of the toolbar window
);
#if FALSE
HRESULT STDMETHODCALLTYPE QueryInterface(REFGUID riid, LPVOID *ppv) { if (__uuidof(CBorderWindow) == riid) { *ppv = this; AddRef(); return(S_OK); } return(CGenWindow::QueryInterface(riid, ppv)); } #endif // FALSE
virtual void GetDesiredSize(SIZE *ppt);
virtual void Layout();
protected: virtual ~CBorderWindow() {}
// Forward WM_COMMAND messages to the parent window
virtual LRESULT ProcessMessage(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
virtual void OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify);
private: UINT CBorderWindow::GetDesiredSize( HWND hwnds[CBorderWindow::NumParts], SIZE sizes[CBorderWindow::NumParts], int rows[3], int cols[3], SIZE *psize); } ;
// A toolbar window class. A toolbar window will layout its children generally
// from left-to-right or top-to-bottom, with margins around and gaps between
// children, filling the window if specified. See the definitions for the
// public fields.
class DECLSPEC_UUID("{0BFB8454-ACA4-11d2-9C97-00C04FB17782}") CToolbar : public CGenWindow { public: // Where to align the children in the direction perpendicular to the flow:
// in a horizontal toolbar, TopLeft will mean Top,and BottomRight will
// mean Bottom
enum Alignment { TopLeft = 0, Center, BottomRight, Fill, } ;
// BUGBUG georgep: We should probably use setters and getters for all of
// these, so we can force a relayout
// The maximum gap between components
int m_gap; // The left and right margin
int m_hMargin; // The top and bottom margin
int m_vMargin; // Start index of right-aligned children; they will still get layed out
// left to right
UINT m_uRightIndex;
// One of the Alignment enum
// HACKHACK georgep: I need to use an extra bit, or C++ gets confused by
// the top bit (thinks it's signed)
Alignment m_nAlignment : 3; // Vertical layout if TRUE
BOOL m_bVertical : 1; // If TRUE, the child before m_uRightIndex will fill the center are of the
// toolbar
BOOL m_bHasCenterChild : 1; // HACKHACK georgep: Layout in reverse order if TRUE; this lets me fix
// weird tabbing order problems
BOOL m_bReverseOrder : 1; // Set this if you don't want the gaps calculated in the desired size
BOOL m_bMinDesiredSize : 1;
// Default constructor; inits a few intrinsics
CToolbar();
// Create the toolbar window
BOOL Create( HWND hWndParent, // The parent of the toolbar window
DWORD dwExStyle=0 // The extended style of the toolbar window
);
HRESULT STDMETHODCALLTYPE QueryInterface(REFGUID riid, LPVOID *ppv) { if (__uuidof(CToolbar) == riid) { *ppv = this; AddRef(); return(S_OK); } return(CGenWindow::QueryInterface(riid, ppv)); }
IGenWindow* FindControl(int nID);
virtual void GetDesiredSize(SIZE *ppt);
virtual void Layout();
protected: virtual ~CToolbar() {}
// Forward WM_COMMAND messages to the parent window
virtual LRESULT ProcessMessage(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
virtual void OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify);
private: void AdjustPos(POINT *pPos, SIZE *pSize, UINT width);
// Get the first child to layout
HWND GetFirstKid(); // Get the next child to layout
HWND GetNextKid( HWND hwndCurrent // The current child
); } ;
// Just makes the first child fill the client area
class CFillWindow : public CGenWindow { public: // Just makes the first child fill the client area
virtual void Layout();
virtual void GetDesiredSize(SIZE *psize);
// Get the info necessary for displaying a tooltip
virtual void GetSharedTooltipInfo(TOOLINFO *pti);
protected: HWND GetChild() { return(GetTopWindow(GetWindow())); } } ;
// Maybe someday I will add a label for this, and multiple border types
class CEdgedWindow : public CGenWindow { private: enum { s_nBorder = 2 }; int GetBorderWidth() { return(s_nBorder); }
public: // BUGBUG georgep: We should probably use setters and getters for all of
// these, so we can force a relayout
// The left and right margin
int m_hMargin; // The top and bottom margin
int m_vMargin;
CEdgedWindow(); ~CEdgedWindow();
BOOL Create(HWND hwndParent);
// Just makes the first child fill the client area - the border
virtual void Layout();
virtual void GetDesiredSize(SIZE *psize);
void SetHeader(CGenWindow *pHeader); CGenWindow *GetHeader() { return(m_pHeader); }
private: CGenWindow *m_pHeader;
// Get the content window
HWND GetContentWindow();
void OnPaint(HWND hwnd);
protected: LRESULT ProcessMessage(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); } ;
class CLayeredView : public CGenWindow { public: enum LayoutStyle { Center = 0, Fill, NumStyles } ;
// I should make accessor methods for this
// The layout style for the window
LayoutStyle m_lStyle;
CLayeredView() : m_lStyle(Center) {}
BOOL Create( HWND hwndParent, // The parent of this window
DWORD dwExStyle=WS_EX_CONTROLPARENT // The extended style
);
virtual void GetDesiredSize(SIZE *psize);
virtual void Layout(); } ;
class DECLSPEC_UUID("{5D573806-CD09-11d2-9CA9-00C04FB17782}") CFrame : public CFillWindow { public: BOOL Create( HWND hWndOwner, // Window owner
LPCTSTR szWindowName, // Window name
DWORD dwStyle, // Window style
DWORD dwEXStyle, // Extended window style
int x, // Window pos: x
int y, // Window pos: y
int nWidth, // Window size: width
int nHeight, // Window size: height
HINSTANCE hInst, // The hInstance to create the window on
HICON hIcon=NULL, // The icon for the window
HMENU hmMain=NULL, // Window menu
LPCTSTR szClassName=NULL // The class name to use
);
HRESULT STDMETHODCALLTYPE QueryInterface(REFGUID riid, LPVOID *ppv) { if (__uuidof(CFrame) == riid) { *ppv = this; AddRef(); return(S_OK); } return(CFillWindow::QueryInterface(riid, ppv)); }
virtual void OnDesiredSizeChanged();
BOOL SetForeground();
// Update the size immediately
void Resize();
void MoveEnsureVisible(int x, int y);
protected: virtual LRESULT ProcessMessage(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
private: // Handle messages
void OnPaletteChanged(HWND hwnd, HWND hwndPaletteChange); BOOL OnQueryNewPalette(HWND hwnd);
// Delayed resizing when the desired size changes
static void Resize(CGenWindow *pThis, WPARAM wParam);
// Select and realize the proper palette
BOOL SelAndRealizePalette(BOOL bBackground); } ;
#endif // _GENCONTAINERS_H_
|