146 lines
3.6 KiB
C
146 lines
3.6 KiB
C
|
#ifndef __MOVEWND_H_INCLUDED
|
||
|
#define __MOVEWND_H_INCLUDED
|
||
|
|
||
|
/*******************************************************************************
|
||
|
*
|
||
|
* (C) COPYRIGHT MICROSOFT CORPORATION, 1998
|
||
|
*
|
||
|
* TITLE: MOVEWND.H
|
||
|
*
|
||
|
* VERSION: 1.0
|
||
|
*
|
||
|
* AUTHOR: ShaunIv
|
||
|
*
|
||
|
* DATE: 7/31/1999
|
||
|
*
|
||
|
* DESCRIPTION: Simplified Wrapper for DeferWindowPos, plus a couple helpers
|
||
|
*
|
||
|
* To use:
|
||
|
*
|
||
|
* CMoveWindow mw;
|
||
|
* mw.MoveWindow( hWnd1, x1, y1, w1, h1, flags1 );
|
||
|
* mw.MoveWindow( hWnd2, x2, y2, w2, h2, flags2 );
|
||
|
* mw.Apply(); // Optional, the destructor will do this if necessary.
|
||
|
*
|
||
|
*******************************************************************************/
|
||
|
|
||
|
#include <windows.h>
|
||
|
|
||
|
class CMoveWindow
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
// Move/Size Flags
|
||
|
enum
|
||
|
{
|
||
|
NO_MOVEX = 0x00000001,
|
||
|
NO_MOVEY = 0x00000002,
|
||
|
NO_MOVE = (NO_MOVEX|NO_MOVEY),
|
||
|
NO_SIZEX = 0x00000004,
|
||
|
NO_SIZEY = 0x00000008,
|
||
|
NO_SIZE = (NO_SIZEX|NO_SIZEY)
|
||
|
};
|
||
|
|
||
|
private:
|
||
|
// Not implemented
|
||
|
CMoveWindow( const CMoveWindow & );
|
||
|
CMoveWindow &operator=( const CMoveWindow & );
|
||
|
|
||
|
private:
|
||
|
HDWP m_hDeferWindowPos;
|
||
|
bool m_bNeedApply;
|
||
|
|
||
|
public:
|
||
|
CMoveWindow( int nNumWindows = 10 )
|
||
|
: m_bNeedApply(false)
|
||
|
{
|
||
|
Initialize(nNumWindows);
|
||
|
}
|
||
|
bool Initialize( int nNumWindows = 10 )
|
||
|
{
|
||
|
m_hDeferWindowPos = BeginDeferWindowPos(nNumWindows);
|
||
|
return(m_hDeferWindowPos != NULL);
|
||
|
}
|
||
|
static bool ScreenToClient( HWND hwnd, RECT &rc )
|
||
|
{
|
||
|
return (MapWindowPoints( NULL, hwnd, reinterpret_cast<POINT*>(&rc), 2 ) != 0);
|
||
|
}
|
||
|
void Move( HWND hWnd, int x, int y, DWORD nFlags = 0 )
|
||
|
{
|
||
|
SizeMove( hWnd, x, y, 0, 0, NO_SIZE|nFlags );
|
||
|
}
|
||
|
void Size( HWND hWnd, int w, int h, DWORD nFlags = 0 )
|
||
|
{
|
||
|
SizeMove( hWnd, 0, 0, w, h, NO_MOVE|nFlags );
|
||
|
}
|
||
|
void SizeMove( HWND hWnd, int x, int y, int w, int h, DWORD nFlags = 0 )
|
||
|
{
|
||
|
m_bNeedApply = true;
|
||
|
|
||
|
RECT rcWndInScreenCoords, rcWndInParentCoords;
|
||
|
GetWindowRect( hWnd, &rcWndInScreenCoords );
|
||
|
|
||
|
rcWndInParentCoords = rcWndInScreenCoords;
|
||
|
HWND hWndParent = GetParent(hWnd);
|
||
|
if (hWndParent)
|
||
|
{
|
||
|
ScreenToClient( hWndParent, rcWndInParentCoords );
|
||
|
}
|
||
|
|
||
|
if (m_hDeferWindowPos)
|
||
|
{
|
||
|
DeferWindowPos( m_hDeferWindowPos, hWnd, NULL,
|
||
|
nFlags&NO_MOVEX ? rcWndInParentCoords.left : x,
|
||
|
nFlags&NO_MOVEY ? rcWndInParentCoords.top : y,
|
||
|
nFlags&NO_SIZEX ? rcWndInParentCoords.right - rcWndInParentCoords.left : w,
|
||
|
nFlags&NO_SIZEY ? rcWndInParentCoords.bottom - rcWndInParentCoords.top : h,
|
||
|
SWP_NOACTIVATE|SWP_NOZORDER
|
||
|
);
|
||
|
}
|
||
|
}
|
||
|
void Hide( HWND hWnd )
|
||
|
{
|
||
|
if (IsWindowVisible(hWnd))
|
||
|
{
|
||
|
ShowWindow( hWnd, SW_HIDE );
|
||
|
}
|
||
|
}
|
||
|
void Show( HWND hWnd )
|
||
|
{
|
||
|
if (!IsWindowVisible(hWnd))
|
||
|
{
|
||
|
ShowWindow( hWnd, SW_SHOW );
|
||
|
}
|
||
|
}
|
||
|
void Enable( HWND hWnd )
|
||
|
{
|
||
|
if (!IsWindowEnabled(hWnd))
|
||
|
{
|
||
|
ShowWindow( hWnd, TRUE );
|
||
|
}
|
||
|
}
|
||
|
void Disable( HWND hWnd )
|
||
|
{
|
||
|
if (IsWindowEnabled(hWnd))
|
||
|
{
|
||
|
ShowWindow( hWnd, FALSE );
|
||
|
}
|
||
|
}
|
||
|
void Apply(void)
|
||
|
{
|
||
|
if (m_bNeedApply && m_hDeferWindowPos)
|
||
|
{
|
||
|
EndDeferWindowPos(m_hDeferWindowPos);
|
||
|
m_hDeferWindowPos = NULL;
|
||
|
}
|
||
|
}
|
||
|
~CMoveWindow(void)
|
||
|
{
|
||
|
Apply();
|
||
|
}
|
||
|
};
|
||
|
|
||
|
|
||
|
#endif // __MOVEWND_H_INCLUDED
|
||
|
|