150 lines
3.9 KiB
C++
150 lines
3.9 KiB
C++
/*
|
|
* This is a part of the BugTrap package.
|
|
* Copyright (c) 2005-2009 IntelleSoft.
|
|
* All rights reserved.
|
|
*
|
|
* Description: Splitter control class.
|
|
* Author: Maksim Pyatkovskiy.
|
|
*
|
|
* This source code is only intended as a supplement to the
|
|
* BugTrap package reference and related electronic documentation
|
|
* provided with the product. See these sources for detailed
|
|
* information regarding the BugTrap package.
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
/// Splitter control class.
|
|
class CSplitter
|
|
{
|
|
public:
|
|
/// Splitter direction.
|
|
enum SPLITTER_DIRECTION
|
|
{
|
|
/// Vertical splitter.
|
|
SD_VERTICAL = 0,
|
|
/// Horizontal splitter.
|
|
SD_HORIZONTAL = 1,
|
|
};
|
|
|
|
enum
|
|
{
|
|
/// Number of panels.
|
|
NUM_PANELS = 2
|
|
};
|
|
|
|
/// Initialize the object.
|
|
CSplitter(SPLITTER_DIRECTION eDirection = SD_VERTICAL, bool bProportionalMode = false);
|
|
/// Attach splitter object to window handle.
|
|
void Attach(HWND hwnd);
|
|
/// Detach splitter object to window handle.
|
|
void Detach(void);
|
|
/// Get splitter direction.
|
|
SPLITTER_DIRECTION GetDirection(void) const;
|
|
/// Set splitter direction.
|
|
void SetDirection(SPLITTER_DIRECTION eDirection);
|
|
/// Get panel handle.
|
|
HWND GetPanel(int iPanel) const;
|
|
/// Set panel handle.
|
|
BOOL SetPanel(int iPanel, HWND hwndPanel);
|
|
/// Update panels layout.
|
|
void UpdateLayout(void);
|
|
/// Reset splitter position.
|
|
void ResetSplitterPos(void);
|
|
/// Set splitter position.
|
|
void SetSplitterPos(int nSplitterPos);
|
|
/// Get current splitter position.
|
|
int GetSplitterPos(void) const;
|
|
/// Set proportional mode.
|
|
void SetProportionalMode(bool bProportionalMode);
|
|
/// Get proportional mode.
|
|
bool GetProportionalMode(void) const;
|
|
|
|
private:
|
|
/// Protect the class from being accidentally copied.
|
|
CSplitter(const CSplitter& rSplitter);
|
|
/// Protect the class from being accidentally copied.
|
|
CSplitter& operator=(const CSplitter& rSplitter);
|
|
/// Window procedure of splitter window.
|
|
static LRESULT CALLBACK SplitterWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
|
/// Draw splitter area.
|
|
void DrawSplitter(HDC hdc) const;
|
|
/// Draw splitter bar.
|
|
void DrawSplitterBar(HDC hdc) const;
|
|
/// Draw panel area.
|
|
BOOL DrawPanel(HDC hdc, int iPanel) const;
|
|
/// Check if point appears within splitter bar.
|
|
BOOL HitTest(const POINT& point) const;
|
|
/// Check if point appears within splitter bar.
|
|
BOOL HitTest(int x, int y) const;
|
|
/// Calculates splitter bar rectangle.
|
|
void GetSplitterBarRect(RECT& rect) const;
|
|
/// Calculate panel rectangle based on panel index.
|
|
BOOL CalcPanelRect(int iPanel, RECT& rect, bool bShrinkRect) const;
|
|
/// Resize splitter window and update panels layout.
|
|
void ResizeSplitter(int nSplitterSize);
|
|
/// Clear splitter size and position.
|
|
void ClearSplitterPos(void);
|
|
/// Clear panel windows.
|
|
void ClearPanels(void);
|
|
/// Calculate splitter size.
|
|
int CalcSplitterSize(void) const;
|
|
|
|
/// Window handle.
|
|
HWND m_hwnd;
|
|
/// Old window procedure.
|
|
WNDPROC m_pfnOldSplitterWndProc;
|
|
/// Splitter direction.
|
|
SPLITTER_DIRECTION m_eDirection;
|
|
/// Splitter position.
|
|
int m_nSplitterPos;
|
|
/// Ideal slider position.
|
|
int m_nIdealPos;
|
|
/// Keeps ideal window size.
|
|
int m_nSplitterSize;
|
|
/// Proportional mode flag.
|
|
bool m_bProportionalMode;
|
|
/// Panel handles.
|
|
HWND m_arrPanels[NUM_PANELS];
|
|
};
|
|
|
|
/**
|
|
* @return current splitter direction.
|
|
*/
|
|
inline CSplitter::SPLITTER_DIRECTION CSplitter::GetDirection(void) const
|
|
{
|
|
return m_eDirection;
|
|
}
|
|
|
|
/**
|
|
* @param iPanel - panel number.
|
|
* @return panel window handle.
|
|
*/
|
|
inline HWND CSplitter::GetPanel(int iPanel) const
|
|
{
|
|
return (iPanel >= 0 && iPanel < NUM_PANELS ? m_arrPanels[iPanel] : NULL);
|
|
}
|
|
|
|
/**
|
|
* @return current splitter position.
|
|
*/
|
|
inline int CSplitter::GetSplitterPos(void) const
|
|
{
|
|
return m_nSplitterPos;
|
|
}
|
|
|
|
/**
|
|
* @param bProportionalMode - new proportional mode.
|
|
*/
|
|
inline void CSplitter::SetProportionalMode(bool bProportionalMode)
|
|
{
|
|
m_bProportionalMode = bProportionalMode;
|
|
}
|
|
|
|
/**
|
|
* @return active proportional mode.
|
|
*/
|
|
inline bool CSplitter::GetProportionalMode(void) const
|
|
{
|
|
return m_bProportionalMode;
|
|
}
|