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
4648enum SurfaceTaskType {
4749 TASK_MOVE ,
@@ -68,25 +70,27 @@ typedef struct LCUI_SurfaceTask {
6870
6971/** 适用于 windows 平台的 surface 数据结构 */
7072struct 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 下图形显示功能所需的数据 */
8486static 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 */
9195static 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
452455static 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
479496static 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