mirror of https://github.com/tongzx/nt5src
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
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_
|