You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
252 lines
6.1 KiB
252 lines
6.1 KiB
// Windows/Control/Dialog.cpp
|
|
|
|
#include "StdAfx.h"
|
|
|
|
#ifndef _UNICODE
|
|
#include "../../Common/StringConvert.h"
|
|
#endif
|
|
|
|
#include "Dialog.h"
|
|
|
|
extern HINSTANCE g_hInstance;
|
|
#ifndef _UNICODE
|
|
extern bool g_IsNT;
|
|
#endif
|
|
|
|
namespace NWindows {
|
|
namespace NControl {
|
|
|
|
static INT_PTR APIENTRY DialogProcedure(HWND dialogHWND, UINT message, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
CWindow tempDialog(dialogHWND);
|
|
if (message == WM_INITDIALOG)
|
|
tempDialog.SetUserDataLongPtr(lParam);
|
|
CDialog *dialog = (CDialog *)(tempDialog.GetUserDataLongPtr());
|
|
if (dialog == NULL)
|
|
return FALSE;
|
|
if (message == WM_INITDIALOG)
|
|
dialog->Attach(dialogHWND);
|
|
try { return BoolToBOOL(dialog->OnMessage(message, wParam, lParam)); }
|
|
catch(...) { return TRUE; }
|
|
}
|
|
|
|
bool CDialog::OnMessage(UINT message, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
switch (message)
|
|
{
|
|
case WM_INITDIALOG: return OnInit();
|
|
case WM_COMMAND: return OnCommand(wParam, lParam);
|
|
case WM_NOTIFY: return OnNotify((UINT)wParam, (LPNMHDR) lParam);
|
|
case WM_TIMER: return OnTimer(wParam, lParam);
|
|
case WM_SIZE: return OnSize(wParam, LOWORD(lParam), HIWORD(lParam));
|
|
case WM_HELP: OnHelp(); return true;
|
|
/*
|
|
OnHelp(
|
|
#ifdef UNDER_CE
|
|
(void *)
|
|
#else
|
|
(LPHELPINFO)
|
|
#endif
|
|
lParam);
|
|
return true;
|
|
*/
|
|
default: return false;
|
|
}
|
|
}
|
|
|
|
bool CDialog::OnCommand(WPARAM wParam, LPARAM lParam)
|
|
{
|
|
return OnCommand(HIWORD(wParam), LOWORD(wParam), lParam);
|
|
}
|
|
|
|
bool CDialog::OnCommand(int code, int itemID, LPARAM lParam)
|
|
{
|
|
if (code == BN_CLICKED)
|
|
return OnButtonClicked(itemID, (HWND)lParam);
|
|
return false;
|
|
}
|
|
|
|
bool CDialog::OnButtonClicked(int buttonID, HWND /* buttonHWND */)
|
|
{
|
|
switch (buttonID)
|
|
{
|
|
case IDOK: OnOK(); break;
|
|
case IDCANCEL: OnCancel(); break;
|
|
case IDCLOSE: OnClose(); break;
|
|
case IDHELP: OnHelp(); break;
|
|
default: return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
static bool GetWorkAreaRect(RECT *rect)
|
|
{
|
|
// use another function for multi-monitor.
|
|
return BOOLToBool(::SystemParametersInfo(SPI_GETWORKAREA, 0, rect, 0));
|
|
}
|
|
|
|
bool IsDialogSizeOK(int xSize, int ySize)
|
|
{
|
|
// it returns for system font. Real font uses another values
|
|
LONG v = GetDialogBaseUnits();
|
|
int x = LOWORD(v);
|
|
int y = HIWORD(v);
|
|
|
|
RECT rect;
|
|
GetWorkAreaRect(&rect);
|
|
int wx = RECT_SIZE_X(rect);
|
|
int wy = RECT_SIZE_Y(rect);
|
|
return
|
|
xSize / 4 * x <= wx &&
|
|
ySize / 8 * y <= wy;
|
|
}
|
|
|
|
bool CDialog::GetMargins(int margin, int &x, int &y)
|
|
{
|
|
x = margin;
|
|
y = margin;
|
|
RECT rect;
|
|
rect.left = 0;
|
|
rect.top = 0;
|
|
rect.right = margin;
|
|
rect.bottom = margin;
|
|
if (!MapRect(&rect))
|
|
return false;
|
|
x = rect.right - rect.left;
|
|
y = rect.bottom - rect.top;
|
|
return true;
|
|
}
|
|
|
|
int CDialog::Units_To_Pixels_X(int units)
|
|
{
|
|
RECT rect;
|
|
rect.left = 0;
|
|
rect.top = 0;
|
|
rect.right = units;
|
|
rect.bottom = units;
|
|
if (!MapRect(&rect))
|
|
return units * 3 / 2;
|
|
return rect.right - rect.left;
|
|
}
|
|
|
|
bool CDialog::GetItemSizes(int id, int &x, int &y)
|
|
{
|
|
RECT rect;
|
|
if (!::GetWindowRect(GetItem(id), &rect))
|
|
return false;
|
|
x = RECT_SIZE_X(rect);
|
|
y = RECT_SIZE_Y(rect);
|
|
return true;
|
|
}
|
|
|
|
void CDialog::GetClientRectOfItem(int id, RECT &rect)
|
|
{
|
|
::GetWindowRect(GetItem(id), &rect);
|
|
ScreenToClient(&rect);
|
|
}
|
|
|
|
bool CDialog::MoveItem(int id, int x, int y, int width, int height, bool repaint)
|
|
{
|
|
return BOOLToBool(::MoveWindow(GetItem(id), x, y, width, height, BoolToBOOL(repaint)));
|
|
}
|
|
|
|
void CDialog::NormalizeSize(bool fullNormalize)
|
|
{
|
|
RECT workRect;
|
|
GetWorkAreaRect(&workRect);
|
|
int xSize = RECT_SIZE_X(workRect);
|
|
int ySize = RECT_SIZE_Y(workRect);
|
|
RECT rect;
|
|
GetWindowRect(&rect);
|
|
int xSize2 = RECT_SIZE_X(rect);
|
|
int ySize2 = RECT_SIZE_Y(rect);
|
|
bool needMove = (xSize2 > xSize || ySize2 > ySize);
|
|
if (xSize2 > xSize || (needMove && fullNormalize))
|
|
{
|
|
rect.left = workRect.left;
|
|
rect.right = workRect.right;
|
|
xSize2 = xSize;
|
|
}
|
|
if (ySize2 > ySize || (needMove && fullNormalize))
|
|
{
|
|
rect.top = workRect.top;
|
|
rect.bottom = workRect.bottom;
|
|
ySize2 = ySize;
|
|
}
|
|
if (needMove)
|
|
{
|
|
if (fullNormalize)
|
|
Show(SW_SHOWMAXIMIZED);
|
|
else
|
|
Move(rect.left, rect.top, xSize2, ySize2, true);
|
|
}
|
|
}
|
|
|
|
void CDialog::NormalizePosition()
|
|
{
|
|
RECT workRect, rect;
|
|
GetWorkAreaRect(&workRect);
|
|
GetWindowRect(&rect);
|
|
if (rect.bottom > workRect.bottom && rect.top > workRect.top)
|
|
Move(rect.left, workRect.top, RECT_SIZE_X(rect), RECT_SIZE_Y(rect), true);
|
|
}
|
|
|
|
bool CModelessDialog::Create(LPCTSTR templateName, HWND parentWindow)
|
|
{
|
|
HWND aHWND = CreateDialogParam(g_hInstance, templateName, parentWindow, DialogProcedure, (LPARAM)this);
|
|
if (aHWND == 0)
|
|
return false;
|
|
Attach(aHWND);
|
|
return true;
|
|
}
|
|
|
|
INT_PTR CModalDialog::Create(LPCTSTR templateName, HWND parentWindow)
|
|
{
|
|
return DialogBoxParam(g_hInstance, templateName, parentWindow, DialogProcedure, (LPARAM)this);
|
|
}
|
|
|
|
#ifndef _UNICODE
|
|
|
|
bool CModelessDialog::Create(LPCWSTR templateName, HWND parentWindow)
|
|
{
|
|
HWND aHWND;
|
|
if (g_IsNT)
|
|
aHWND = CreateDialogParamW(g_hInstance, templateName, parentWindow, DialogProcedure, (LPARAM)this);
|
|
else
|
|
{
|
|
AString name;
|
|
LPCSTR templateNameA;
|
|
if (IS_INTRESOURCE(templateName))
|
|
templateNameA = (LPCSTR)templateName;
|
|
else
|
|
{
|
|
name = GetSystemString(templateName);
|
|
templateNameA = name;
|
|
}
|
|
aHWND = CreateDialogParamA(g_hInstance, templateNameA, parentWindow, DialogProcedure, (LPARAM)this);
|
|
}
|
|
if (aHWND == 0)
|
|
return false;
|
|
Attach(aHWND);
|
|
return true;
|
|
}
|
|
|
|
INT_PTR CModalDialog::Create(LPCWSTR templateName, HWND parentWindow)
|
|
{
|
|
if (g_IsNT)
|
|
return DialogBoxParamW(g_hInstance, templateName, parentWindow, DialogProcedure, (LPARAM)this);
|
|
AString name;
|
|
LPCSTR templateNameA;
|
|
if (IS_INTRESOURCE(templateName))
|
|
templateNameA = (LPCSTR)templateName;
|
|
else
|
|
{
|
|
name = GetSystemString(templateName);
|
|
templateNameA = name;
|
|
}
|
|
return DialogBoxParamA(g_hInstance, templateNameA, parentWindow, DialogProcedure, (LPARAM)this);
|
|
}
|
|
#endif
|
|
|
|
}}
|