From 20d28e80a5c861a9d5f449ea911ab75b4f37ad0d Mon Sep 17 00:00:00 2001 From: Jef Date: Tue, 24 Sep 2024 14:54:57 +0200 Subject: Initial community commit --- Src/Plugins/Library/ml_online/messageBox.cpp | 193 +++++++++++++++++++++++++++ 1 file changed, 193 insertions(+) create mode 100644 Src/Plugins/Library/ml_online/messageBox.cpp (limited to 'Src/Plugins/Library/ml_online/messageBox.cpp') diff --git a/Src/Plugins/Library/ml_online/messageBox.cpp b/Src/Plugins/Library/ml_online/messageBox.cpp new file mode 100644 index 00000000..03a850e1 --- /dev/null +++ b/Src/Plugins/Library/ml_online/messageBox.cpp @@ -0,0 +1,193 @@ +#include "main.h" +#include "./api__ml_online.h" +#include "./resource.h" + +#include +#include + +typedef struct __MESSAGEBOX +{ + HWND hParent; + LPCWSTR pszText; + LPCWSTR pszCaption; + UINT uType; + LPCWSTR pszCheck; + INT *checked; +} MESSAGEBOX; + +static INT_PTR CALLBACK OmMessageBox_DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); + +INT OmMessageBox(HWND hParent, LPCWSTR pszText, LPCWSTR pszCaption, UINT uType, LPCWSTR pszCheck, INT *checked) +{ + MESSAGEBOX instance; + instance.hParent = hParent; + instance.pszText = pszText; + instance.pszCaption = pszCaption; + instance.uType = uType; + instance.pszCheck = pszCheck; + instance.checked = checked; + + return (INT)WASABI_API_DIALOGBOXPARAMW(IDD_MESSAGEBOX, hParent, OmMessageBox_DialogProc, (LPARAM)&instance); +} + +static void OmMessgageBox_CenterWindow(HWND hwnd, HWND hCenter) +{ + if (NULL == hwnd || NULL == hCenter) + return; + + RECT centerRect, windowRect; + if (!GetWindowRect(hwnd, &windowRect) || !GetWindowRect(hCenter, ¢erRect)) + return; + windowRect.left = centerRect.left + ((centerRect.right - centerRect.left) - (windowRect.right - windowRect.left))/2; + windowRect.top = centerRect.top + ((centerRect.bottom - centerRect.top) - (windowRect.bottom - windowRect.top))/2; + + SetWindowPos(hwnd, NULL, windowRect.left, windowRect.top, 0, 0, SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOZORDER); +} + +static BOOL OmMessageBox_GetTextBox(HWND hwnd, LPCWSTR pszText, INT cchText, SIZE *sizeText) +{ + HDC hdc = GetDCEx(hwnd, NULL, DCX_CACHE | DCX_NORESETATTRS); + if (NULL == hdc) return FALSE; + + HFONT font = (HFONT)SendMessage(hwnd, WM_GETFONT, 0, 0L); + HFONT fontOrig = (HFONT)SelectObject(hdc, font); + + if (cchText < 0) + cchText = lstrlen(pszText); + + BOOL resultOk = GetTextExtentPoint32(hdc, pszText, cchText, sizeText); + + SelectObject(hdc, fontOrig); + ReleaseDC(hwnd, hdc); + + return resultOk; +} +static HICON OmMessageBox_GetIcon(UINT flags) +{ + LPCWSTR iconName = NULL; + switch(0x000000F0 & flags) + { + case MB_ICONHAND: iconName = IDI_HAND; break; + case MB_ICONQUESTION: iconName = IDI_QUESTION; break; + case MB_ICONEXCLAMATION:iconName = IDI_EXCLAMATION; break; + case MB_ICONASTERISK: iconName = IDI_ASTERISK; break; + } + return (NULL != iconName) ? LoadIcon(NULL, iconName) : NULL; +} + +static BOOL OmMessageBox_GetIconSize(UINT flags, SIZE *iconSize) +{ + if (NULL == iconSize) return FALSE; + + iconSize->cx = 0; + iconSize->cy = 0; + + HICON hIcon = OmMessageBox_GetIcon(flags); + if (NULL == hIcon) + return TRUE; + + ICONINFO iconInfo; + + if (!GetIconInfo(hIcon, &iconInfo) || FALSE == iconInfo.fIcon) + return FALSE; + + BITMAP bm; + if (NULL != iconInfo.hbmColor) + { + if (FALSE == GetObject(iconInfo.hbmColor, sizeof(BITMAP), &bm)) + return FALSE; + + iconSize->cx = bm.bmWidth; + iconSize->cy = bm.bmHeight; + } + else if (NULL != iconInfo.hbmMask) + { + if (FALSE == GetObject(iconInfo.hbmMask, sizeof(BITMAP), &bm)) + return FALSE; + + iconSize->cx = bm.bmWidth; + iconSize->cy = bm.bmHeight/2; + } + + return TRUE; +} + +static BOOL OmMessageBox_GetButtonSize(HWND hwnd, SIZE *buttonSize) +{ + if (NULL == buttonSize) + return FALSE; + + if (FALSE != SendMessage(hwnd, (0x1600 + 0x0001) /*BCM_GETIDEALSIZE*/, 0, (LPARAM)buttonSize)) + return TRUE; + + return FALSE; +} +static INT_PTR OmMessageBox_OnInitDialog(HWND hwnd, HWND hFocus, LPARAM lParam) +{ + MESSAGEBOX *pmb = (MESSAGEBOX*)lParam; + SetWindowText(hwnd, pmb->pszCaption); + + SIZE textSize; + SIZE maxSize; + MONITORINFO mi; + mi.cbSize = sizeof(MONITORINFO); + + HMONITOR hMonitor = MonitorFromWindow(pmb->hParent, MONITOR_DEFAULTTONEAREST); + if (NULL != hMonitor && + GetMonitorInfo(hMonitor, &mi)) + { + RECT rcFrame; + SetRectEmpty(&rcFrame); + AdjustWindowRectEx(&rcFrame, GetWindowStyle(hwnd), FALSE, GetWindowStyleEx(hwnd)); + maxSize.cx = mi.rcWork.right - mi.rcWork.left - (rcFrame.right - rcFrame.left) - 8*2; + maxSize.cy = mi.rcWork.bottom - mi.rcWork.top - (rcFrame.bottom - rcFrame.top) - 8*2; + } + else + { + maxSize.cx = 1200; + maxSize.cy = 800; + } + + HWND hText = GetDlgItem(hwnd, IDC_TEXT); + if (NULL != hText) + { + if (!OmMessageBox_GetTextBox(hText, pmb->pszText, -1, &textSize)) + ZeroMemory(&textSize, sizeof(SIZE)); + + SetWindowPos(hText, NULL, 0, 0, textSize.cx, textSize.cy, SWP_NOACTIVATE | SWP_NOZORDER); + } + else + ZeroMemory(&textSize, sizeof(SIZE)); + + + + OmMessgageBox_CenterWindow(hwnd, pmb->hParent); + SendMessage(hwnd, DM_REPOSITION, 0, 0L); + return FALSE; +} + +static void OmMessageBox_OnDestroy(HWND hwnd) +{ + +} + +static void OmMessageBox_OnCommand(HWND hwnd, INT commandId, INT eventId, HWND hControl) +{ + switch(commandId) + { + case IDOK: + case IDCANCEL: + EndDialog(hwnd, commandId); + break; + } +} +static INT_PTR CALLBACK OmMessageBox_DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + switch(uMsg) + { + case WM_INITDIALOG: return OmMessageBox_OnInitDialog(hwnd, (HWND)wParam, lParam); + case WM_DESTROY: OmMessageBox_OnDestroy(hwnd); break; + case WM_COMMAND: OmMessageBox_OnCommand(hwnd, LOWORD(wParam), HIWORD(wParam), (HWND)lParam); break; + } + return 0; +} -- cgit