#if defined(WIN32)
#define WIN32_LEAN_AND_MEAN
+#define String _String
#define Method _Method
+#define strlen _strlen
#include <windows.h>
#undef Method
+#undef String
+#undef strlen
#endif
import "Window"
#define TOP 4
#define BOTTOM 4
#define CORNER (BORDER * 2)
+#if defined(HIGH_DPI)
+#define BUTTON_SIZE 45
+#define CAPTION 60
+#else
+#define BUTTON_SIZE 15
#define CAPTION 20
+#endif
#define DEAD_BORDER 3
#define MIN_WIDTH 60
#define MIN_HEIGHT 3
#define BUTTON_OFFSET 2
+#if defined(HIGH_DPI)
+#define NAME_OFFSET 12
+#else
#define NAME_OFFSET 2
+#endif
#define NAME_OFFSETX 4
#define SB_WIDTH 16
FontResource ::SystemFont()
{
- return FontResource { faceName = "Tahoma", size = 8.25f };
+#if defined(HIGH_DPI)
+ return FontResource { faceName = $"Tahoma", size = 18.25f };
+#else
+ return FontResource { faceName = $"Tahoma", size = 8.25f };
+#endif
}
FontResource ::CaptionFont()
{
- return FontResource { faceName = "Tahoma", size = 8.25f, bold = true };
+#if defined(HIGH_DPI)
+ return FontResource { faceName = $"Tahoma", size = 18.25f, bold = true };
+#else
+ return FontResource { faceName = $"Tahoma", size = 8.25f, bold = true };
+#endif
}
char * ::CursorsBitmaps(uint id, int * hotSpotX, int *hotSpotY, byte ** paletteShades)
*h += statusBarHeight;
}
- if(nativeDecorations && rootWindow == this)
+ if(nativeDecorations && rootWindow == this && windowHandle)
{
#if defined(WIN32)
- RECT rcClient, rcWindow;
- GetClientRect(windowHandle, &rcClient);
- GetWindowRect(windowHandle, &rcWindow);
- *w += (rcWindow.right - rcWindow.left) - rcClient.right;
- *h += (rcWindow.bottom - rcWindow.top) - rcClient.bottom;
+ RECT rcClient = { 0 }, rcWindow = { 0 };
+ if(GetClientRect(windowHandle, &rcClient) && GetWindowRect(windowHandle, &rcWindow))
+ {
+ *w += (rcWindow.right - rcWindow.left) - rcClient.right;
+ *h += (rcWindow.bottom - rcWindow.top) - rcClient.bottom;
+ }
// PrintLn(_class.name, " is at l = ", rcWindow.left, ", r = ", rcWindow.right);
#else
- Box widths;
+ Box widths = { 0 };
+#if !defined(__ANDROID__)
XGetBorderWidths(this, widths);
+#endif
*w += widths.left + widths.right;
*h += widths.top + widths.bottom;
#endif
*w += 2 * BORDER;
*h += TOP + BOTTOM;
}
- if(((BorderBits)borderStyle).fixed && (state != maximized || !parent.menuBar))
+ if(((BorderBits)borderStyle).fixed && (state != maximized || !GetParentMenuBar()))
{
*h += CAPTION;
if(!((BorderBits)borderStyle).sizable || state == minimized)
void SetWindowMinimum(MinMaxValue * mw, MinMaxValue * mh)
{
bool isNormal = (state == normal);
- if(nativeDecorations && rootWindow == this) return;
- if(((BorderBits)borderStyle).fixed && (state != maximized || !parent.menuBar))
+ if(nativeDecorations && rootWindow == this && windowHandle) return;
+ if(((BorderBits)borderStyle).fixed && (state != maximized || !GetParentMenuBar()))
{
*mw = MIN_WIDTH;
*mh = MIN_HEIGHT;
GetDecorationsSize(&aw, &ah);
- if(nativeDecorations && rootWindow == this)
+ if(nativeDecorations && rootWindow == this && windowHandle)
{
#if defined(WIN32)
RECT rcWindow;
*x += client00.x - rcWindow.left;
*y += client00.y - rcWindow.top;
#else
- Box widths;
+ Box widths = { 0 };
+#if !defined(__ANDROID__)
XGetBorderWidths(this, widths);
+#endif
*x += widths.left;
*y += widths.top;
#endif
*y += TOP;
}
- if(((BorderBits)borderStyle).fixed && (state != maximized || !parent.menuBar))
+ if(((BorderBits)borderStyle).fixed && (state != maximized || !GetParentMenuBar()))
{
*y += CAPTION;
if(!((BorderBits)borderStyle).sizable || state == minimized)
{
bool isNormal = (state == normal);
int top = 0, border = 0, bottom = 0;
+ Window parentMenuBar = GetParentMenuBar();
- if(nativeDecorations && rootWindow == this) return;
+ if(nativeDecorations && rootWindow == this && windowHandle) return;
if(state == minimized)
top = border = bottom = DEAD_BORDER;
if(((BorderBits)borderStyle).contour)
{
deepBorder = border;
- deepTop = (((BorderBits)borderStyle).fixed && (state != maximized || !parent.menuBar)) ? (top + CAPTION) : top;
+ deepTop = (((BorderBits)borderStyle).fixed && (state != maximized || !parentMenuBar)) ? (top + CAPTION) : top;
deepBottom = (((BorderBits)borderStyle).sizable && isNormal) ? bottom : border;
}
size.w - deepBorder - deepBorder, size.h - deepBottom - deepTop);
}
- if(((BorderBits)borderStyle).fixed && (state != maximized || !parent.menuBar))
+ if(((BorderBits)borderStyle).fixed && (state != maximized || !parentMenuBar))
{
if(state != maximized || !((BorderBits)borderStyle).sizable)
{
// Frame for ES_CAPTION windows
surface.Bevel(false, 0, 0, size.w, size.h);
- surface.SetForeground(activeBorder);
+ surface.SetForeground(formColor);
surface.Rectangle(2, 2, size.w-3, size.h-3);
// Resizeable frame is 1 pixel thicker
GRADIENT_SMOOTHNESS, GRADIENT_DIRECTION,
border, top, size.w - border - 1, top + CAPTION - 2);
- surface.SetForeground(activeBorder);
+ surface.SetForeground(formColor);
if(state != minimized)
surface.HLine(border, size.w-border-1, top + CAPTION-1);
if(name)
{
int buttonsSize = border +
- ((hasMaximize || hasMinimize) ? 52 : 18);
+ ((hasMaximize || hasMinimize) ? (BUTTON_SIZE*3)+7 : (BUTTON_SIZE+3));
surface.WriteTextDots(left, border + NAME_OFFSETX, top + NAME_OFFSET,
size.w - (buttonsSize + border + 4), name, strlen(name));
}
{
if(sbh && sbh.visible && sbv && sbv.visible)
{
- surface.SetBackground(activeBorder);
+ surface.SetBackground(formColor);
surface.Area(
clientStart.x + clientSize.w,
clientStart.y + clientSize.h,
{
bool isNormal = (state == normal);
bool result = false;
- if(nativeDecorations && rootWindow == this) return false;
+ if(nativeDecorations && rootWindow == this && windowHandle) return false;
- if(((BorderBits)borderStyle).fixed && (state != maximized || !parent.menuBar))
+ if(((BorderBits)borderStyle).fixed && (state != maximized || !GetParentMenuBar()))
{
int corner = 0, border = 0, top = 0;
if(((BorderBits)borderStyle).sizable && isNormal)
bool result = false;
*resizeX = *resizeY = *resizeEndX = *resizeEndY = false;
- if(nativeDecorations && rootWindow == this) return false;
+ if(nativeDecorations && rootWindow == this && windowHandle) return false;
if(((BorderBits)borderStyle).sizable && (state == normal))
{
int top = 0, border = 0;
int insideBorder = 0;
- if(!nativeDecorations || rootWindow != this)
+ if(!nativeDecorations || rootWindow != this || !windowHandle)
{
if(state == minimized)
top = border = DEAD_BORDER;
else if(((BorderBits)borderStyle).sizable)
{
- if(state == maximized && parent.menuBar)
+ if(state == maximized && GetParentMenuBar())
{
top = 2;
border = 2;
else
{
statusBar.visible = true;
- if(nativeDecorations && rootWindow == this)
+ if(nativeDecorations && rootWindow == this && windowHandle)
{
statusBar.anchor = { left = clientStart.x, bottom = (int)(size.h - clientSize.h - clientStart.y - statusBarHeight ) };
statusBar.size.w = size.w - insideBorder * 2;
}
}
}
- if(!nativeDecorations || rootWindow != this)
+ if(!nativeDecorations || rootWindow != this || !windowHandle)
{
if(sysButtons[0])
{
- sysButtons[0].anchor = { right = 35 + border, top = top + BUTTON_OFFSET };
- sysButtons[0].size = { 15, 15 };
+ sysButtons[0].anchor = { right = 2+(2*BUTTON_SIZE+3) + border, top = top + BUTTON_OFFSET };
+ sysButtons[0].size = { BUTTON_SIZE, BUTTON_SIZE };
sysButtons[0].bevel = true;
sysButtons[0].bitmap = { skinBitmaps[(state == minimized) ? restore : minimize] };
sysButtons[0].visible = true;
}
if(sysButtons[1])
{
- sysButtons[1].anchor = { right = 20 + border, top = top + BUTTON_OFFSET };
- sysButtons[1].size = { 15, 15 };
+ sysButtons[1].anchor = { right = 2+(BUTTON_SIZE+3) + border, top = top + BUTTON_OFFSET };
+ sysButtons[1].size = { BUTTON_SIZE, BUTTON_SIZE };
sysButtons[1].bevel = true;
sysButtons[1].bitmap = { skinBitmaps[(state == maximized) ? restore : maximize] };
sysButtons[1].visible = true;
if(sysButtons[2])
{
sysButtons[2].anchor = { right = 2 + border, top = top + BUTTON_OFFSET };
- sysButtons[2].size = { 15, 15 };
+ sysButtons[2].size = { BUTTON_SIZE, BUTTON_SIZE };
sysButtons[2].bevel = true;
sysButtons[2].bitmap = { skinBitmaps[close] };
sysButtons[2].visible = true;
}
-#define PUREVTBL(c) ((int (**)())*(void **)((byte *)class(c).data + 4))
+#define PUREVTBL(c) (*(void ***)((byte *)class(c).data + sizeof(uintptr)))
#define CAPTION_DISTANCE 18
default:
{
if(isRadio)
{
- PUREVTBL(Button)[__ecereVMethodID___ecereNameSpace__ecere__gui__Window_OnRedraw](this, surface);
+ ((void (*)(Window, Surface))PUREVTBL(Button)[__ecereVMethodID___ecereNameSpace__ecere__gui__Window_OnRedraw])(this, surface);
return;
}
// if(bevel)
int start = (clientSize.h - height) / 2;
if(!isEnabled)
- // surface.SetBackground(activeBorder);
+ // surface.SetBackground(formColor);
surface.SetBackground(gainsboro);
else if(active && !text)
- surface.SetBackground((offset ? activeBorder : Color { 0,0,170 }));
+ surface.SetBackground((offset ? formColor : Color { 0,0,170 }));
else
- surface.SetBackground((offset ? activeBorder : white));
+ surface.SetBackground((offset ? formColor : white));
surface.Area(2, start+2,height-3,start+height-3);
surface.SetForeground(Color { 85, 85, 85 });