aboutsummaryrefslogtreecommitdiff
path: root/Src/Plugins/Library/ml_online/messageBox.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Plugins/Library/ml_online/messageBox.cpp')
-rw-r--r--Src/Plugins/Library/ml_online/messageBox.cpp193
1 files changed, 193 insertions, 0 deletions
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 <windows.h>
+#include <strsafe.h>
+
+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, &centerRect))
+ 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;
+}