39
39
#include LCUI_DISPLAY_H
40
40
#include LCUI_EVENTS_H
41
41
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)
45
47
46
48
enum SurfaceTaskType {
47
49
TASK_MOVE ,
@@ -68,25 +70,27 @@ typedef struct LCUI_SurfaceTask {
68
70
69
71
/** 适用于 windows 平台的 surface 数据结构 */
70
72
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 ; /**< 帧缓存,保存当前窗口内呈现的图像内容 */
79
81
LCUI_SurfaceTask tasks [TASK_TOTAL_NUM ]; /**< 任务缓存 */
80
82
LinkedListNode node ; /**< 在链表中的结点 */
81
83
};
82
84
83
85
/** windows 下图形显示功能所需的数据 */
84
86
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 ; /**< 事件触发器 */
88
90
} win ;
89
91
92
+ /* clang-format on */
93
+
90
94
/** 根据 hwnd 获取 Surface */
91
95
static LCUI_Surface GetSurfaceByHWND (HWND hwnd )
92
96
{
@@ -265,7 +269,6 @@ static void WinSurface_ExecResize(LCUI_Surface surface, int w, int h)
265
269
}
266
270
WinSurface_ExecResizeFrameBuffer (surface , w , h );
267
271
SurfaceSizeToWindowSize (surface , & w , & h );
268
- // SetWindowLong( surface->hwnd, GWL_STYLE, WIN32_WINDOW_STYLE );
269
272
SetWindowPos (surface -> hwnd , HWND_NOTOPMOST , 0 , 0 , w , h ,
270
273
SWP_NOMOVE | SWP_NOZORDER );
271
274
}
@@ -451,36 +454,51 @@ static void OnWMPaint(LCUI_Event e, void *arg)
451
454
452
455
static void OnWMGetMinMaxInfo (LCUI_Event e , void * arg )
453
456
{
457
+ int style ;
454
458
MSG * msg = arg ;
455
459
LCUI_DisplayEventRec dpy_ev ;
460
+ LCUI_MinMaxInfo info = & dpy_ev .minmaxinfo ;
456
461
LCUI_Surface surface = GetSurfaceByHWND (msg -> hwnd );
457
462
MINMAXINFO * mminfo = (PMINMAXINFO )msg -> lParam ;
458
463
459
464
if (!surface ) {
460
465
return ;
461
466
}
467
+
462
468
dpy_ev .surface = surface ;
463
469
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
+
468
476
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 );
477
494
}
478
495
479
496
static void OnWMSize (LCUI_Event e , void * arg )
480
497
{
481
498
MSG * msg = arg ;
482
499
LCUI_Surface surface ;
483
500
LCUI_DisplayEventRec dpy_ev ;
501
+
484
502
surface = GetSurfaceByHWND (msg -> hwnd );
485
503
if (!surface ) {
486
504
return ;
0 commit comments