Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

315 lines
7.6 KiB

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