windows-nt/Source/XPSP1/NT/printscan/ui/uicommon/movewnd.h
2020-09-26 16:20:57 +08:00

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