提交 3f0934fe 编写于 作者: mysterywolf's avatar mysterywolf 提交者: guo
上级 15cd71ba
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
#if USE_WIN32DRV #if USE_WIN32DRV
#include <windowsx.h> #include <windowsx.h>
#include <process.h>
#include <stdbool.h> #include <stdbool.h>
#include <stdint.h> #include <stdint.h>
...@@ -38,6 +38,16 @@ ...@@ -38,6 +38,16 @@
* TYPEDEFS * TYPEDEFS
**********************/ **********************/
typedef struct _WINDOW_THREAD_PARAMETER
{
HANDLE window_mutex;
HINSTANCE instance_handle;
HICON icon_handle;
lv_coord_t hor_res;
lv_coord_t ver_res;
int show_window_mode;
} WINDOW_THREAD_PARAMETER, * PWINDOW_THREAD_PARAMETER;
/********************** /**********************
* STATIC PROTOTYPES * STATIC PROTOTYPES
**********************/ **********************/
...@@ -132,9 +142,8 @@ static void lv_win32_display_driver_flush_callback( ...@@ -132,9 +142,8 @@ static void lv_win32_display_driver_flush_callback(
const lv_area_t* area, const lv_area_t* area,
lv_color_t* color_p); lv_color_t* color_p);
static void lv_win32_display_driver_rounder_callback( static void lv_win32_display_refresh_handler(
lv_disp_drv_t* disp_drv, lv_timer_t* param);
lv_area_t* area);
static void lv_win32_pointer_driver_read_callback( static void lv_win32_pointer_driver_read_callback(
lv_indev_drv_t* indev_drv, lv_indev_drv_t* indev_drv,
...@@ -154,8 +163,8 @@ static LRESULT CALLBACK lv_win32_window_message_callback( ...@@ -154,8 +163,8 @@ static LRESULT CALLBACK lv_win32_window_message_callback(
WPARAM wParam, WPARAM wParam,
LPARAM lParam); LPARAM lParam);
static void lv_win32_message_handler( static unsigned int __stdcall lv_win32_window_thread_entrypoint(
lv_timer_t* param); void* raw_parameter);
/********************** /**********************
* GLOBAL VARIABLES * GLOBAL VARIABLES
...@@ -171,7 +180,6 @@ EXTERN_C lv_indev_t* lv_win32_encoder_device_object = NULL; ...@@ -171,7 +180,6 @@ EXTERN_C lv_indev_t* lv_win32_encoder_device_object = NULL;
* STATIC VARIABLES * STATIC VARIABLES
**********************/ **********************/
static HINSTANCE g_instance_handle = NULL;
static HWND g_window_handle = NULL; static HWND g_window_handle = NULL;
static HDC g_buffer_dc_handle = NULL; static HDC g_buffer_dc_handle = NULL;
...@@ -179,6 +187,7 @@ static UINT32* g_pixel_buffer = NULL; ...@@ -179,6 +187,7 @@ static UINT32* g_pixel_buffer = NULL;
static SIZE_T g_pixel_buffer_size = 0; static SIZE_T g_pixel_buffer_size = 0;
static lv_disp_t* g_display = NULL; static lv_disp_t* g_display = NULL;
static bool volatile g_display_refreshing = false;
static bool volatile g_mouse_pressed = false; static bool volatile g_mouse_pressed = false;
static LPARAM volatile g_mouse_value = 0; static LPARAM volatile g_mouse_value = 0;
...@@ -236,104 +245,42 @@ EXTERN_C bool lv_win32_init( ...@@ -236,104 +245,42 @@ EXTERN_C bool lv_win32_init(
lv_coord_t ver_res, lv_coord_t ver_res,
HICON icon_handle) HICON icon_handle)
{ {
WNDCLASSEXW WindowClass; PWINDOW_THREAD_PARAMETER parameter =
(PWINDOW_THREAD_PARAMETER)malloc(sizeof(WINDOW_THREAD_PARAMETER));
WindowClass.cbSize = sizeof(WNDCLASSEX); parameter->window_mutex = CreateEventExW(NULL, NULL, 0, EVENT_ALL_ACCESS);
parameter->instance_handle = instance_handle;
WindowClass.style = 0; parameter->icon_handle = icon_handle;
WindowClass.lpfnWndProc = lv_win32_window_message_callback; parameter->hor_res = hor_res;
WindowClass.cbClsExtra = 0; parameter->ver_res = ver_res;
WindowClass.cbWndExtra = 0; parameter->show_window_mode = show_window_mode;
WindowClass.hInstance = instance_handle;
WindowClass.hIcon = icon_handle; _beginthreadex(
WindowClass.hCursor = LoadCursorW(NULL, IDC_ARROW);
WindowClass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
WindowClass.lpszMenuName = NULL;
WindowClass.lpszClassName = L"lv_sim_visual_studio";
WindowClass.hIconSm = icon_handle;
if (!RegisterClassExW(&WindowClass))
{
return false;
}
g_instance_handle = instance_handle;
g_window_handle = CreateWindowExW(
WINDOW_EX_STYLE,
WindowClass.lpszClassName,
L"LVGL Simulator for Windows Desktop",
WINDOW_STYLE,
CW_USEDEFAULT,
0,
CW_USEDEFAULT,
0,
NULL,
NULL,
instance_handle,
NULL);
if (!g_window_handle)
{
return false;
}
g_dpi_value = lv_win32_get_dpi_for_window(g_window_handle);
RECT WindowSize;
WindowSize.left = 0;
WindowSize.right = MulDiv(
hor_res * WIN32DRV_MONITOR_ZOOM,
g_dpi_value,
USER_DEFAULT_SCREEN_DPI);
WindowSize.top = 0;
WindowSize.bottom = MulDiv(
ver_res * WIN32DRV_MONITOR_ZOOM,
g_dpi_value,
USER_DEFAULT_SCREEN_DPI);
AdjustWindowRectEx(
&WindowSize,
WINDOW_STYLE,
FALSE,
WINDOW_EX_STYLE);
OffsetRect(
&WindowSize,
-WindowSize.left,
-WindowSize.top);
SetWindowPos(
g_window_handle,
NULL, NULL,
0, 0,
lv_win32_window_thread_entrypoint,
parameter,
0, 0,
WindowSize.right, NULL);
WindowSize.bottom,
SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOMOVE);
lv_win32_register_touch_window(g_window_handle, 0);
lv_timer_create(lv_win32_message_handler, 0, NULL);
lv_win32_enable_child_window_dpi_message(g_window_handle);
HDC hNewBufferDC = lv_win32_create_frame_buffer(
g_window_handle,
hor_res,
ver_res,
&g_pixel_buffer,
&g_pixel_buffer_size);
DeleteDC(g_buffer_dc_handle); WaitForSingleObjectEx(parameter->window_mutex, INFINITE, FALSE);
g_buffer_dc_handle = hNewBufferDC;
static lv_disp_draw_buf_t display_buffer; static lv_disp_draw_buf_t display_buffer;
#if (LV_COLOR_DEPTH == 32) || \
(LV_COLOR_DEPTH == 16 && LV_COLOR_16_SWAP == 0) || \
(LV_COLOR_DEPTH == 8) || \
(LV_COLOR_DEPTH == 1)
lv_disp_draw_buf_init(
&display_buffer,
(lv_color_t*)g_pixel_buffer,
NULL,
hor_res * ver_res);
#else
lv_disp_draw_buf_init( lv_disp_draw_buf_init(
&display_buffer, &display_buffer,
(lv_color_t*)malloc(hor_res * ver_res * sizeof(lv_color_t)), (lv_color_t*)malloc(hor_res * ver_res * sizeof(lv_color_t)),
NULL, NULL,
hor_res * ver_res); hor_res * ver_res);
#endif
static lv_disp_drv_t display_driver; static lv_disp_drv_t display_driver;
lv_disp_drv_init(&display_driver); lv_disp_drv_init(&display_driver);
...@@ -341,8 +288,11 @@ EXTERN_C bool lv_win32_init( ...@@ -341,8 +288,11 @@ EXTERN_C bool lv_win32_init(
display_driver.ver_res = ver_res; display_driver.ver_res = ver_res;
display_driver.flush_cb = lv_win32_display_driver_flush_callback; display_driver.flush_cb = lv_win32_display_driver_flush_callback;
display_driver.draw_buf = &display_buffer; display_driver.draw_buf = &display_buffer;
display_driver.rounder_cb = lv_win32_display_driver_rounder_callback; display_driver.direct_mode = 1;
g_display = lv_disp_drv_register(&display_driver); g_display = lv_disp_drv_register(&display_driver);
lv_timer_del(g_display->refr_timer);
g_display->refr_timer = NULL;
lv_timer_create(lv_win32_display_refresh_handler, 0, NULL);
static lv_indev_drv_t pointer_driver; static lv_indev_drv_t pointer_driver;
lv_indev_drv_init(&pointer_driver); lv_indev_drv_init(&pointer_driver);
...@@ -362,9 +312,6 @@ EXTERN_C bool lv_win32_init( ...@@ -362,9 +312,6 @@ EXTERN_C bool lv_win32_init(
encoder_driver.read_cb = lv_win32_encoder_driver_read_callback; encoder_driver.read_cb = lv_win32_encoder_driver_read_callback;
lv_win32_encoder_device_object = lv_indev_drv_register(&encoder_driver); lv_win32_encoder_device_object = lv_indev_drv_register(&encoder_driver);
ShowWindow(g_window_handle, show_window_mode);
UpdateWindow(g_window_handle);
return true; return true;
} }
...@@ -674,79 +621,52 @@ static void lv_win32_display_driver_flush_callback( ...@@ -674,79 +621,52 @@ static void lv_win32_display_driver_flush_callback(
const lv_area_t* area, const lv_area_t* area,
lv_color_t* color_p) lv_color_t* color_p)
{ {
if (lv_disp_flush_is_last(disp_drv))
{
#if (LV_COLOR_DEPTH == 32) || \ #if (LV_COLOR_DEPTH == 32) || \
(LV_COLOR_DEPTH == 16 && LV_COLOR_16_SWAP == 0) || \ (LV_COLOR_DEPTH == 16 && LV_COLOR_16_SWAP == 0) || \
(LV_COLOR_DEPTH == 8) || \ (LV_COLOR_DEPTH == 8) || \
(LV_COLOR_DEPTH == 1) (LV_COLOR_DEPTH == 1)
UNREFERENCED_PARAMETER(area); UNREFERENCED_PARAMETER(color_p);
memcpy(g_pixel_buffer, color_p, g_pixel_buffer_size);
#elif (LV_COLOR_DEPTH == 16 && LV_COLOR_16_SWAP != 0) #elif (LV_COLOR_DEPTH == 16 && LV_COLOR_16_SWAP != 0)
SIZE_T count = g_pixel_buffer_size / sizeof(UINT16); SIZE_T count = g_pixel_buffer_size / sizeof(UINT16);
PUINT16 source = (PUINT16)color_p; PUINT16 source = (PUINT16)color_p;
PUINT16 destination = (PUINT16)g_pixel_buffer; PUINT16 destination = (PUINT16)g_pixel_buffer;
for (SIZE_T i = 0; i < count; ++i) for (SIZE_T i = 0; i < count; ++i)
{ {
UINT16 current = *source; UINT16 current = *source;
*destination = (LOBYTE(current) << 8) | HIBYTE(current); *destination = (LOBYTE(current) << 8) | HIBYTE(current);
++source; ++source;
++destination; ++destination;
} }
#else #else
for (int y = area->y1; y <= area->y2; ++y) for (int y = area->y1; y <= area->y2; ++y)
{
for (int x = area->x1; x <= area->x2; ++x)
{ {
g_pixel_buffer[y * disp_drv->hor_res + x] = lv_color_to32(*color_p); for (int x = area->x1; x <= area->x2; ++x)
color_p++; {
g_pixel_buffer[y * disp_drv->hor_res + x] =
lv_color_to32(*color_p);
color_p++;
}
} }
}
#endif #endif
HDC hWindowDC = GetDC(g_window_handle); InvalidateRect(g_window_handle, NULL, FALSE);
if (hWindowDC)
{
int PreviousMode = SetStretchBltMode(
hWindowDC,
HALFTONE);
StretchBlt(
hWindowDC,
0,
0,
MulDiv(
disp_drv->hor_res * WIN32DRV_MONITOR_ZOOM,
g_dpi_value,
USER_DEFAULT_SCREEN_DPI),
MulDiv(
disp_drv->ver_res * WIN32DRV_MONITOR_ZOOM,
g_dpi_value,
USER_DEFAULT_SCREEN_DPI),
g_buffer_dc_handle,
0,
0,
disp_drv->hor_res,
disp_drv->ver_res,
SRCCOPY);
SetStretchBltMode(
hWindowDC,
PreviousMode);
ReleaseDC(g_window_handle, hWindowDC);
} }
lv_disp_flush_ready(disp_drv); lv_disp_flush_ready(disp_drv);
} }
static void lv_win32_display_driver_rounder_callback( static void lv_win32_display_refresh_handler(
lv_disp_drv_t* disp_drv, lv_timer_t* param)
lv_area_t* area)
{ {
area->x1 = 0; UNREFERENCED_PARAMETER(param);
area->x2 = disp_drv->hor_res - 1;
area->y1 = 0; if (!g_display_refreshing)
area->y2 = disp_drv->ver_res - 1; {
_lv_disp_refr_timer(NULL);
}
} }
static void lv_win32_pointer_driver_read_callback( static void lv_win32_pointer_driver_read_callback(
...@@ -975,6 +895,43 @@ static LRESULT CALLBACK lv_win32_window_message_callback( ...@@ -975,6 +895,43 @@ static LRESULT CALLBACK lv_win32_window_message_callback(
break; break;
} }
case WM_PAINT:
{
g_display_refreshing = true;
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
if (g_display)
{
SetStretchBltMode(hdc, HALFTONE);
StretchBlt(
hdc,
ps.rcPaint.left,
ps.rcPaint.top,
ps.rcPaint.right - ps.rcPaint.left,
ps.rcPaint.bottom - ps.rcPaint.top,
g_buffer_dc_handle,
0,
0,
MulDiv(
ps.rcPaint.right - ps.rcPaint.left,
USER_DEFAULT_SCREEN_DPI,
WIN32DRV_MONITOR_ZOOM * g_dpi_value),
MulDiv(
ps.rcPaint.bottom - ps.rcPaint.top,
USER_DEFAULT_SCREEN_DPI,
WIN32DRV_MONITOR_ZOOM * g_dpi_value),
SRCCOPY);
}
EndPaint(hWnd, &ps);
g_display_refreshing = false;
break;
}
case WM_DESTROY: case WM_DESTROY:
PostQuitMessage(0); PostQuitMessage(0);
break; break;
...@@ -985,23 +942,113 @@ static LRESULT CALLBACK lv_win32_window_message_callback( ...@@ -985,23 +942,113 @@ static LRESULT CALLBACK lv_win32_window_message_callback(
return 0; return 0;
} }
static void lv_win32_message_handler( static unsigned int __stdcall lv_win32_window_thread_entrypoint(
lv_timer_t* param) void* raw_parameter)
{ {
UNREFERENCED_PARAMETER(param); PWINDOW_THREAD_PARAMETER parameter =
(PWINDOW_THREAD_PARAMETER)raw_parameter;
WNDCLASSEXW window_class;
window_class.cbSize = sizeof(WNDCLASSEXW);
window_class.style = 0;
window_class.lpfnWndProc = lv_win32_window_message_callback;
window_class.cbClsExtra = 0;
window_class.cbWndExtra = 0;
window_class.hInstance = parameter->instance_handle;
window_class.hIcon = parameter->icon_handle;
window_class.hCursor = LoadCursorW(NULL, IDC_ARROW);
window_class.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
window_class.lpszMenuName = NULL;
window_class.lpszClassName = L"lv_sim_visual_studio";
window_class.hIconSm = parameter->icon_handle;
if (!RegisterClassExW(&window_class))
{
return 0;
}
MSG Message; HWND window_handle = CreateWindowExW(
BOOL Result = PeekMessageW(&Message, NULL, 0, 0, TRUE); WINDOW_EX_STYLE,
if (Result != 0 && Result != -1) window_class.lpszClassName,
L"LVGL Simulator for Windows Desktop",
WINDOW_STYLE,
CW_USEDEFAULT,
0,
CW_USEDEFAULT,
0,
NULL,
NULL,
parameter->instance_handle,
NULL);
if (!window_handle)
{ {
TranslateMessage(&Message); return 0;
DispatchMessageW(&Message); }
if (Message.message == WM_QUIT) g_dpi_value = lv_win32_get_dpi_for_window(window_handle);
{
lv_win32_quit_signal = true; RECT window_size;
}
window_size.left = 0;
window_size.right = MulDiv(
parameter->hor_res * WIN32DRV_MONITOR_ZOOM,
g_dpi_value,
USER_DEFAULT_SCREEN_DPI);
window_size.top = 0;
window_size.bottom = MulDiv(
parameter->ver_res * WIN32DRV_MONITOR_ZOOM,
g_dpi_value,
USER_DEFAULT_SCREEN_DPI);
AdjustWindowRectEx(
&window_size,
WINDOW_STYLE,
FALSE,
WINDOW_EX_STYLE);
OffsetRect(
&window_size,
-window_size.left,
-window_size.top);
SetWindowPos(
window_handle,
NULL,
0,
0,
window_size.right,
window_size.bottom,
SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOMOVE);
lv_win32_register_touch_window(window_handle, 0);
lv_win32_enable_child_window_dpi_message(window_handle);
HDC hNewBufferDC = lv_win32_create_frame_buffer(
window_handle,
parameter->hor_res,
parameter->ver_res,
&g_pixel_buffer,
&g_pixel_buffer_size);
DeleteDC(g_buffer_dc_handle);
g_buffer_dc_handle = hNewBufferDC;
ShowWindow(window_handle, parameter->show_window_mode);
UpdateWindow(window_handle);
g_window_handle = window_handle;
SetEvent(parameter->window_mutex);
MSG message;
while (GetMessageW(&message, NULL, 0, 0))
{
TranslateMessage(&message);
DispatchMessageW(&message);
} }
lv_win32_quit_signal = true;
return 0;
} }
#endif /*USE_WIN32DRV*/ #endif /*USE_WIN32DRV*/
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册