mirror of
https://github.com/holub/mame
synced 2025-04-28 11:11:48 +03:00
285 lines
8.9 KiB
C++
285 lines
8.9 KiB
C++
// Windows/Window.h
|
|
|
|
#ifndef __WINDOWS_WINDOW_H
|
|
#define __WINDOWS_WINDOW_H
|
|
|
|
#include "../Common/MyWindows.h"
|
|
#include "../Common/MyString.h"
|
|
|
|
#include "Defs.h"
|
|
|
|
#ifndef UNDER_CE
|
|
|
|
#define MY__WM_CHANGEUISTATE 0x0127
|
|
#define MY__WM_UPDATEUISTATE 0x0128
|
|
#define MY__WM_QUERYUISTATE 0x0129
|
|
|
|
// LOWORD(wParam) values in WM_*UISTATE
|
|
#define MY__UIS_SET 1
|
|
#define MY__UIS_CLEAR 2
|
|
#define MY__UIS_INITIALIZE 3
|
|
|
|
// HIWORD(wParam) values in WM_*UISTATE
|
|
#define MY__UISF_HIDEFOCUS 0x1
|
|
#define MY__UISF_HIDEACCEL 0x2
|
|
#define MY__UISF_ACTIVE 0x4
|
|
|
|
#endif
|
|
|
|
namespace NWindows {
|
|
|
|
inline ATOM MyRegisterClass(CONST WNDCLASS *wndClass)
|
|
{ return ::RegisterClass(wndClass); }
|
|
|
|
#ifndef _UNICODE
|
|
ATOM MyRegisterClass(CONST WNDCLASSW *wndClass);
|
|
#endif
|
|
|
|
#ifdef _UNICODE
|
|
inline bool MySetWindowText(HWND wnd, LPCWSTR s) { return BOOLToBool(::SetWindowText(wnd, s)); }
|
|
#else
|
|
bool MySetWindowText(HWND wnd, LPCWSTR s);
|
|
#endif
|
|
|
|
|
|
#ifdef UNDER_CE
|
|
#define GWLP_USERDATA GWL_USERDATA
|
|
#define GWLP_WNDPROC GWL_WNDPROC
|
|
#define BTNS_BUTTON TBSTYLE_BUTTON
|
|
#define WC_COMBOBOXW L"ComboBox"
|
|
#define DWLP_MSGRESULT DWL_MSGRESULT
|
|
#endif
|
|
|
|
class CWindow
|
|
{
|
|
private:
|
|
// bool ModifyStyleBase(int styleOffset, DWORD remove, DWORD add, UINT flags);
|
|
protected:
|
|
HWND _window;
|
|
public:
|
|
CWindow(HWND newWindow = NULL): _window(newWindow){};
|
|
CWindow& operator=(HWND newWindow)
|
|
{
|
|
_window = newWindow;
|
|
return *this;
|
|
}
|
|
operator HWND() const { return _window; }
|
|
void Attach(HWND newWindow) { _window = newWindow; }
|
|
HWND Detach()
|
|
{
|
|
HWND window = _window;
|
|
_window = NULL;
|
|
return window;
|
|
}
|
|
|
|
bool Foreground() { return BOOLToBool(::SetForegroundWindow(_window)); }
|
|
|
|
HWND GetParent() const { return ::GetParent(_window); }
|
|
bool GetWindowRect(LPRECT rect) const { return BOOLToBool(::GetWindowRect(_window,rect)); }
|
|
#ifndef UNDER_CE
|
|
bool IsZoomed() const { return BOOLToBool(::IsZoomed(_window)); }
|
|
#endif
|
|
bool ClientToScreen(LPPOINT point) const { return BOOLToBool(::ClientToScreen(_window, point)); }
|
|
bool ScreenToClient(LPPOINT point) const { return BOOLToBool(::ScreenToClient(_window, point)); }
|
|
|
|
bool CreateEx(DWORD exStyle, LPCTSTR className,
|
|
LPCTSTR windowName, DWORD style,
|
|
int x, int y, int width, int height,
|
|
HWND parentWindow, HMENU idOrHMenu,
|
|
HINSTANCE instance, LPVOID createParam)
|
|
{
|
|
_window = ::CreateWindowEx(exStyle, className, windowName,
|
|
style, x, y, width, height, parentWindow,
|
|
idOrHMenu, instance, createParam);
|
|
return (_window != NULL);
|
|
}
|
|
|
|
bool Create(LPCTSTR className,
|
|
LPCTSTR windowName, DWORD style,
|
|
int x, int y, int width, int height,
|
|
HWND parentWindow, HMENU idOrHMenu,
|
|
HINSTANCE instance, LPVOID createParam)
|
|
{
|
|
_window = ::CreateWindow(className, windowName,
|
|
style, x, y, width, height, parentWindow,
|
|
idOrHMenu, instance, createParam);
|
|
return (_window != NULL);
|
|
}
|
|
|
|
#ifndef _UNICODE
|
|
bool Create(LPCWSTR className,
|
|
LPCWSTR windowName, DWORD style,
|
|
int x, int y, int width, int height,
|
|
HWND parentWindow, HMENU idOrHMenu,
|
|
HINSTANCE instance, LPVOID createParam);
|
|
bool CreateEx(DWORD exStyle, LPCWSTR className,
|
|
LPCWSTR windowName, DWORD style,
|
|
int x, int y, int width, int height,
|
|
HWND parentWindow, HMENU idOrHMenu,
|
|
HINSTANCE instance, LPVOID createParam);
|
|
#endif
|
|
|
|
|
|
bool Destroy()
|
|
{
|
|
if (_window == NULL)
|
|
return true;
|
|
bool result = BOOLToBool(::DestroyWindow(_window));
|
|
if (result)
|
|
_window = NULL;
|
|
return result;
|
|
}
|
|
bool IsWindow() { return BOOLToBool(::IsWindow(_window)); }
|
|
bool Move(int x, int y, int width, int height, bool repaint = true)
|
|
{ return BOOLToBool(::MoveWindow(_window, x, y, width, height, BoolToBOOL(repaint))); }
|
|
|
|
bool ChangeSubWindowSizeX(HWND hwnd, int xSize)
|
|
{
|
|
RECT rect;
|
|
::GetWindowRect(hwnd, &rect);
|
|
POINT p1;
|
|
p1.x = rect.left;
|
|
p1.y = rect.top;
|
|
ScreenToClient(&p1);
|
|
return BOOLToBool(::MoveWindow(hwnd, p1.x, p1.y, xSize, rect.bottom - rect.top, TRUE));
|
|
}
|
|
|
|
void ScreenToClient(RECT *rect)
|
|
{
|
|
POINT p1, p2;
|
|
p1.x = rect->left;
|
|
p1.y = rect->top;
|
|
p2.x = rect->right;
|
|
p2.y = rect->bottom;
|
|
ScreenToClient(&p1);
|
|
ScreenToClient(&p2);
|
|
|
|
rect->left = p1.x;
|
|
rect->top = p1.y;
|
|
rect->right = p2.x;
|
|
rect->bottom = p2.y;
|
|
}
|
|
|
|
bool GetClientRect(LPRECT rect) { return BOOLToBool(::GetClientRect(_window, rect)); }
|
|
bool Show(int cmdShow) { return BOOLToBool(::ShowWindow(_window, cmdShow)); }
|
|
bool Show_Bool(bool show) { return Show(show ? SW_SHOW: SW_HIDE); }
|
|
|
|
#ifndef UNDER_CE
|
|
bool SetPlacement(CONST WINDOWPLACEMENT *placement) { return BOOLToBool(::SetWindowPlacement(_window, placement)); }
|
|
bool GetPlacement(WINDOWPLACEMENT *placement) { return BOOLToBool(::GetWindowPlacement(_window, placement)); }
|
|
#endif
|
|
bool Update() { return BOOLToBool(::UpdateWindow(_window)); }
|
|
bool InvalidateRect(LPCRECT rect, bool backgroundErase = true)
|
|
{ return BOOLToBool(::InvalidateRect(_window, rect, BoolToBOOL(backgroundErase))); }
|
|
void SetRedraw(bool redraw = true) { SendMsg(WM_SETREDRAW, BoolToBOOL(redraw), 0); }
|
|
|
|
LONG_PTR SetStyle(LONG_PTR style) { return SetLongPtr(GWL_STYLE, style); }
|
|
LONG_PTR GetStyle() const { return GetLongPtr(GWL_STYLE); }
|
|
// bool MyIsMaximized() const { return ((GetStyle() & WS_MAXIMIZE) != 0); }
|
|
|
|
LONG_PTR SetLong(int index, LONG newLongPtr) { return ::SetWindowLong(_window, index, newLongPtr); }
|
|
LONG_PTR GetLong(int index) const { return ::GetWindowLong(_window, index); }
|
|
LONG_PTR SetUserDataLong(LONG newLongPtr) { return SetLong(GWLP_USERDATA, newLongPtr); }
|
|
LONG_PTR GetUserDataLong() const { return GetLong(GWLP_USERDATA); }
|
|
|
|
|
|
#ifdef UNDER_CE
|
|
|
|
LONG_PTR SetLongPtr(int index, LONG_PTR newLongPtr) { return SetLong(index, newLongPtr); }
|
|
LONG_PTR GetLongPtr(int index) const { return GetLong(index); }
|
|
|
|
LONG_PTR SetUserDataLongPtr(LONG_PTR newLongPtr) { return SetUserDataLong(newLongPtr); }
|
|
LONG_PTR GetUserDataLongPtr() const { return GetUserDataLong(); }
|
|
|
|
#else
|
|
|
|
LONG_PTR SetLongPtr(int index, LONG_PTR newLongPtr)
|
|
{ return ::SetWindowLongPtr(_window, index,
|
|
#ifndef _WIN64
|
|
(LONG)
|
|
#endif
|
|
newLongPtr); }
|
|
#ifndef _UNICODE
|
|
LONG_PTR SetLongPtrW(int index, LONG_PTR newLongPtr)
|
|
{ return ::SetWindowLongPtrW(_window, index,
|
|
#ifndef _WIN64
|
|
(LONG)
|
|
#endif
|
|
newLongPtr); }
|
|
#endif
|
|
|
|
LONG_PTR GetLongPtr(int index) const { return ::GetWindowLongPtr(_window, index); }
|
|
LONG_PTR SetUserDataLongPtr(LONG_PTR newLongPtr) { return SetLongPtr(GWLP_USERDATA, newLongPtr); }
|
|
LONG_PTR GetUserDataLongPtr() const { return GetLongPtr(GWLP_USERDATA); }
|
|
|
|
#endif
|
|
|
|
/*
|
|
bool ModifyStyle(HWND hWnd, DWORD remove, DWORD add, UINT flags = 0)
|
|
{ return ModifyStyleBase(GWL_STYLE, remove, add, flags); }
|
|
bool ModifyStyleEx(HWND hWnd, DWORD remove, DWORD add, UINT flags = 0)
|
|
{ return ModifyStyleBase(GWL_EXSTYLE, remove, add, flags); }
|
|
*/
|
|
|
|
HWND SetFocus() { return ::SetFocus(_window); }
|
|
|
|
LRESULT SendMsg(UINT message, WPARAM wParam = 0, LPARAM lParam = 0)
|
|
{ return ::SendMessage(_window, message, wParam, lParam); }
|
|
#ifndef _UNICODE
|
|
LRESULT SendMsgW(UINT message, WPARAM wParam = 0, LPARAM lParam = 0)
|
|
{ return ::SendMessageW(_window, message, wParam, lParam); }
|
|
#endif
|
|
|
|
bool PostMsg(UINT message, WPARAM wParam = 0, LPARAM lParam = 0)
|
|
{ return BOOLToBool(::PostMessage(_window, message, wParam, lParam)); }
|
|
#ifndef _UNICODE
|
|
bool PostMsgW(UINT message, WPARAM wParam = 0, LPARAM lParam = 0)
|
|
{ return BOOLToBool(::PostMessageW(_window, message, wParam, lParam)); }
|
|
#endif
|
|
|
|
bool SetText(LPCTSTR s) { return BOOLToBool(::SetWindowText(_window, s)); }
|
|
#ifndef _UNICODE
|
|
bool SetText(LPCWSTR s) { return MySetWindowText(_window, s); }
|
|
#endif
|
|
|
|
int GetTextLength() const
|
|
{ return GetWindowTextLength(_window); }
|
|
UINT GetText(LPTSTR string, int maxCount) const
|
|
{ return GetWindowText(_window, string, maxCount); }
|
|
bool GetText(CSysString &s);
|
|
#ifndef _UNICODE
|
|
/*
|
|
UINT GetText(LPWSTR string, int maxCount) const
|
|
{ return GetWindowTextW(_window, string, maxCount); }
|
|
*/
|
|
bool GetText(UString &s);
|
|
#endif
|
|
|
|
bool Enable(bool enable)
|
|
{ return BOOLToBool(::EnableWindow(_window, BoolToBOOL(enable))); }
|
|
|
|
bool IsEnabled()
|
|
{ return BOOLToBool(::IsWindowEnabled(_window)); }
|
|
|
|
#ifndef UNDER_CE
|
|
HMENU GetSystemMenu(bool revert)
|
|
{ return ::GetSystemMenu(_window, BoolToBOOL(revert)); }
|
|
#endif
|
|
|
|
UINT_PTR SetTimer(UINT_PTR idEvent, UINT elapse, TIMERPROC timerFunc = 0)
|
|
{ return ::SetTimer(_window, idEvent, elapse, timerFunc); }
|
|
bool KillTimer(UINT_PTR idEvent)
|
|
{return BOOLToBool(::KillTimer(_window, idEvent)); }
|
|
|
|
HICON SetIcon(WPARAM sizeType, HICON icon) { return (HICON)SendMsg(WM_SETICON, sizeType, (LPARAM)icon); }
|
|
};
|
|
|
|
#define RECT_SIZE_X(r) ((r).right - (r).left)
|
|
#define RECT_SIZE_Y(r) ((r).bottom - (r).top)
|
|
|
|
inline bool IsKeyDown(int virtKey) { return (::GetKeyState(virtKey) & 0x8000) != 0; }
|
|
|
|
}
|
|
|
|
#endif
|