Skip to content

Commit 82fad1b

Browse files
committedNov 18, 2018
feat(display): auto disable window maximize button (#164)
1 parent feab3c5 commit 82fad1b

File tree

2 files changed

+51
-30
lines changed

2 files changed

+51
-30
lines changed
 

‎include/LCUI/display.h

+6-3
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,11 @@ typedef enum LCUI_DisplayEventType {
5555
LCUI_DEVENT_READY
5656
} LCUI_DisplayEventType;
5757

58+
typedef struct LCUI_MinMaxInfoRec_ {
59+
int min_width, min_height;
60+
int max_width, max_height;
61+
} LCUI_MinMaxInfoRec, *LCUI_MinMaxInfo;
62+
5863
/** 显示驱动的事件数据结构 */
5964
typedef struct LCUI_DisplayEventRec_ {
6065
int type;
@@ -65,9 +70,7 @@ typedef struct LCUI_DisplayEventRec_ {
6570
struct {
6671
int width, height;
6772
} resize;
68-
struct {
69-
int min_width, min_height, max_width, max_height;
70-
} minmaxinfo;
73+
LCUI_MinMaxInfoRec minmaxinfo;
7174
};
7275
LCUI_Surface surface;
7376
} LCUI_DisplayEventRec, *LCUI_DisplayEvent;

‎src/platform/windows/windows_display.c

+45-27
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,11 @@
3939
#include LCUI_DISPLAY_H
4040
#include LCUI_EVENTS_H
4141

42-
#define MIN_WIDTH 480
43-
#define MIN_HEIGHT 500
44-
#define WIN32_WINDOW_STYLE (WS_OVERLAPPEDWINDOW | WS_MAXIMIZEBOX)
42+
/* clang-format off */
43+
44+
#define MIN_WIDTH 480
45+
#define MIN_HEIGHT 500
46+
#define WIN32_WINDOW_STYLE (WS_OVERLAPPEDWINDOW | WS_MAXIMIZEBOX)
4547

4648
enum SurfaceTaskType {
4749
TASK_MOVE,
@@ -68,25 +70,27 @@ typedef struct LCUI_SurfaceTask {
6870

6971
/** 适用于 windows 平台的 surface 数据结构 */
7072
struct LCUI_SurfaceRec_ {
71-
HWND hwnd; /**< windows 窗口句柄 */
72-
int mode; /**< 渲染模式 */
73-
int width, height; /**< 窗口宽高 */
74-
HDC hdc_fb; /**< 帧缓存的设备上下文 */
75-
HDC hdc_client; /**< 窗口的设备上下文 */
76-
HBITMAP fb_bmp; /**< 帧缓存 */
77-
LCUI_BOOL is_ready; /**< 是否已经准备好 */
78-
LCUI_Graph fb; /**< 帧缓存,保存当前窗口内呈现的图像内容 */
73+
HWND hwnd; /**< windows 窗口句柄 */
74+
int mode; /**< 渲染模式 */
75+
int width, height; /**< 窗口宽高 */
76+
HDC hdc_fb; /**< 帧缓存的设备上下文 */
77+
HDC hdc_client; /**< 窗口的设备上下文 */
78+
HBITMAP fb_bmp; /**< 帧缓存 */
79+
LCUI_BOOL is_ready; /**< 是否已经准备好 */
80+
LCUI_Graph fb; /**< 帧缓存,保存当前窗口内呈现的图像内容 */
7981
LCUI_SurfaceTask tasks[TASK_TOTAL_NUM]; /**< 任务缓存 */
8082
LinkedListNode node; /**< 在链表中的结点 */
8183
};
8284

8385
/** windows 下图形显示功能所需的数据 */
8486
static struct WIN_Display {
85-
LCUI_BOOL active; /**< 是否已经初始化 */
86-
LinkedList surfaces; /**< surface 记录 */
87-
LCUI_EventTrigger trigger; /**< 事件触发器 */
87+
LCUI_BOOL active; /**< 是否已经初始化 */
88+
LinkedList surfaces; /**< surface 记录 */
89+
LCUI_EventTrigger trigger; /**< 事件触发器 */
8890
} win;
8991

92+
/* clang-format on */
93+
9094
/** 根据 hwnd 获取 Surface */
9195
static LCUI_Surface GetSurfaceByHWND(HWND hwnd)
9296
{
@@ -265,7 +269,6 @@ static void WinSurface_ExecResize(LCUI_Surface surface, int w, int h)
265269
}
266270
WinSurface_ExecResizeFrameBuffer(surface, w, h);
267271
SurfaceSizeToWindowSize(surface, &w, &h);
268-
// SetWindowLong( surface->hwnd, GWL_STYLE, WIN32_WINDOW_STYLE );
269272
SetWindowPos(surface->hwnd, HWND_NOTOPMOST, 0, 0, w, h,
270273
SWP_NOMOVE | SWP_NOZORDER);
271274
}
@@ -451,36 +454,51 @@ static void OnWMPaint(LCUI_Event e, void *arg)
451454

452455
static void OnWMGetMinMaxInfo(LCUI_Event e, void *arg)
453456
{
457+
int style;
454458
MSG *msg = arg;
455459
LCUI_DisplayEventRec dpy_ev;
460+
LCUI_MinMaxInfo info = &dpy_ev.minmaxinfo;
456461
LCUI_Surface surface = GetSurfaceByHWND(msg->hwnd);
457462
MINMAXINFO *mminfo = (PMINMAXINFO)msg->lParam;
458463

459464
if (!surface) {
460465
return;
461466
}
467+
462468
dpy_ev.surface = surface;
463469
dpy_ev.type = LCUI_DEVENT_MINMAXINFO;
464-
dpy_ev.minmaxinfo.min_width = MIN_WIDTH;
465-
dpy_ev.minmaxinfo.min_height = MIN_HEIGHT;
466-
dpy_ev.minmaxinfo.max_width = GetSystemMetrics(SM_CXMAXTRACK);
467-
dpy_ev.minmaxinfo.max_height = GetSystemMetrics(SM_CYMAXTRACK);
470+
471+
info->min_width = MIN_WIDTH;
472+
info->min_height = MIN_HEIGHT;
473+
info->max_width = GetSystemMetrics(SM_CXMAXTRACK);
474+
info->max_height = GetSystemMetrics(SM_CYMAXTRACK);
475+
468476
EventTrigger_Trigger(win.trigger, LCUI_DEVENT_MINMAXINFO, &dpy_ev);
469-
SurfaceSizeToWindowSize(surface, &dpy_ev.minmaxinfo.min_width,
470-
&dpy_ev.minmaxinfo.min_height);
471-
SurfaceSizeToWindowSize(surface, &dpy_ev.minmaxinfo.max_width,
472-
&dpy_ev.minmaxinfo.max_height);
473-
mminfo->ptMinTrackSize.x = dpy_ev.minmaxinfo.min_width;
474-
mminfo->ptMinTrackSize.y = dpy_ev.minmaxinfo.min_height;
475-
mminfo->ptMaxTrackSize.x = dpy_ev.minmaxinfo.max_width;
476-
mminfo->ptMaxTrackSize.y = dpy_ev.minmaxinfo.max_height;
477+
SurfaceSizeToWindowSize(surface, &info->min_width, &info->min_height);
478+
SurfaceSizeToWindowSize(surface, &info->max_width, &info->max_height);
479+
480+
mminfo->ptMinTrackSize.x = info->min_width;
481+
mminfo->ptMinTrackSize.y = info->min_height;
482+
mminfo->ptMaxTrackSize.x = info->max_width;
483+
mminfo->ptMaxTrackSize.y = info->max_height;
484+
485+
style = GetWindowLong(msg->hwnd, GWL_STYLE);
486+
if (info->min_width == info->max_width &&
487+
info->min_height == info->max_height) {
488+
style &= ~(WS_SIZEBOX | WS_MAXIMIZEBOX);
489+
} else if (info->min_width == info->max_width ||
490+
info->min_height == info->max_height) {
491+
style &= ~WS_MAXIMIZEBOX;
492+
}
493+
SetWindowLong(msg->hwnd, GWL_STYLE, style);
477494
}
478495

479496
static void OnWMSize(LCUI_Event e, void *arg)
480497
{
481498
MSG *msg = arg;
482499
LCUI_Surface surface;
483500
LCUI_DisplayEventRec dpy_ev;
501+
484502
surface = GetSurfaceByHWND(msg->hwnd);
485503
if (!surface) {
486504
return;

0 commit comments

Comments
 (0)