2025-11-28 00:35:46 +09:00

161 lines
4.2 KiB
C++

// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
//
// Copyright (c) Microsoft Corporation. All rights reserved
#pragma once
#define RECT_INSIDE (0x0001)
#define RECT_OVER_LEFT (0x0002)
#define RECT_OVER_TOP (0x0004)
#define RECT_OVER_RIGHT (0x0008)
#define RECT_OVER_BOTTOM (0x0010)
#define RECT_TOO_WIDE (0x0020)
#define RECT_TOO_TALL (0x0040)
#define RECT_ERROR (0x0080)
class CStringRange;
//+---------------------------------------------------------------------------
//
// CBaseWindow
//
//----------------------------------------------------------------------------
class CBaseWindow
{
public:
CBaseWindow();
virtual ~CBaseWindow();
static BOOL _InitWindowClass(_In_ LPCWSTR lpwszClassName, _Out_ ATOM *patom);
static void _UninitWindowClass(ATOM atom);
virtual BOOL _Create(ATOM atom, DWORD dwExStyle, DWORD dwStyle, _In_opt_ CBaseWindow *pParentWnd = nullptr, int wndWidth = 0, int wndHeight = 0, _In_opt_ HWND parentWndHandle = nullptr);
virtual void _Destroy();
virtual void _Move(int x, int y);
virtual void _Resize(int x, int y, int cx, int cy);
virtual void _Show(BOOL isShowWnd);
virtual BOOL _IsWindowVisible();
virtual void _Enable(BOOL enableWindowReceiveInput);
virtual BOOL _IsEnabled();
virtual void _InvalidateRect();
virtual BOOL _GetWindowRect(_Inout_ LPRECT lpRect);
virtual BOOL _GetClientRect(_Inout_ LPRECT lpRect);
virtual LRESULT CALLBACK _WindowProcCallback(_In_ HWND wndHandle, UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam) = 0;
virtual void _OnPaint(_In_ HDC dcHandle, _In_ PAINTSTRUCT *pps) { dcHandle; pps; }
virtual void _OnLButtonDown(POINT pt) { pt; }
virtual void _OnLButtonUp(POINT pt) { pt; }
virtual void _OnMouseMove(POINT pt) { pt; }
virtual void _OnTimer() { }
CBaseWindow* _GetTopmostUIWnd();
HRESULT _GetWindowExtent(_In_ const RECT *prcTextExtent, _In_opt_ RECT *prcCandidateExtent, _Inout_ POINT *pptCandidate);
HWND _GetWnd()
{
return _wndHandle;
}
CBaseWindow *_GetParent()
{
return _pParentWnd;
}
void _SetUIWnd(_In_ CBaseWindow *pUIWnd)
{
_pUIWnd = pUIWnd;
}
CBaseWindow* _GetUIWnd()
{
return _pUIWnd;
}
CBaseWindow *_GetCaptureObject()
{
return _pUIObjCapture;
}
CBaseWindow *_GetTimerObject()
{
return _pTimerUIObj;
}
UINT _GetScrollDelay()
{
return (GetDoubleClickTime() * 4 / 5);
}
UINT _GetScrollSpeed()
{
return (_GetScrollDelay() / 8);
}
protected:
LRESULT _NotifyCommand(UINT uMsg, DWORD dwSB, int nPos);
void _StartCapture()
{
_SetCaptureObject(this);
}
void _EndCapture()
{
_SetCaptureObject(nullptr);
}
BOOL _IsCapture();
void _StartTimer(UINT uElapse)
{
_SetTimerObject(this, uElapse);
}
void _EndTimer()
{
_SetTimerObject(nullptr);
}
BOOL _IsTimer();
private:
void _SetCaptureObject(_In_opt_ CBaseWindow *pUIObj);
void _SetTimerObject(_In_opt_ CBaseWindow *pUIObj, UINT uElapse = 0);
void GetWorkAreaFromPoint(_In_ const POINT& ptPoint, _Out_ LPRECT lprcWorkArea);
void CalcFitPointAroundTextExtent(_In_ const RECT *prcTextExtent, _In_ const RECT *prcWorkArea, _In_ const RECT *prcWindow, _Out_ POINT *ppt);
DWORD RectInRect(_In_ const RECT *prcLimit, _In_ const RECT *prcTarget);
static LRESULT CALLBACK _WindowProc(_In_ HWND wndHandle, UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam);
static CBaseWindow *_GetThis(_In_ HWND wndHandle)
{
return (CBaseWindow *)GetWindowLongPtr(wndHandle, GWLP_USERDATA);
}
static void _SetThis(_In_ HWND wndHandle, _In_opt_ void *lpv)
{
SetWindowLongPtr(wndHandle, GWLP_USERDATA, (LONG_PTR)lpv);
}
private:
HWND _wndHandle;
CBaseWindow *_pParentWnd;
CBaseWindow *_pUIWnd;
CBaseWindow *_pTimerUIObj;
CBaseWindow *_pUIObjCapture;
BOOL _enableVirtualWnd;
BOOL _visibleVirtualWnd;
RECT _RectOfVirtualWnd;
};