AWTK-WIDGET-WEB-VIEW 实现笔记 (2) - Windows

embedded/2024/12/27 4:42:34/

在 Windows 平台上的实现,相对比较顺利,将一个窗口嵌入到另外一个窗口是比较容易的事情。

在这里插入图片描述

1. 创建窗口

这里有点需要注意:

  • 父窗口的大小变化时,子窗口也要跟着变化,否则 webview 显示不出来。
  • 创建时窗口的大小先设置为 0,后面再调整,否则 webview 也显示不出来。
#include <windows.h>
#include <SDL_syswm.h>LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {switch (uMsg) {case WM_SIZE: {HWND hwndSub = FindWindowEx(hwnd, NULL, NULL, NULL);if (hwndSub) {RECT rcClient;int width = 0;int height = 0;GetClientRect(hwnd, &rcClient);width = rcClient.right - rcClient.left;height = rcClient.bottom - rcClient.top;MoveWindow(hwndSub, 0, 0, width, height, TRUE);}break;}case WM_PAINT: {PAINTSTRUCT ps;HDC hdc = BeginPaint(hwnd, &ps);FillRect(hdc, &ps.rcPaint, (HBRUSH)(COLOR_WINDOW + 1));EndPaint(hwnd, &ps);break;}default:return DefWindowProc(hwnd, uMsg, wParam, lParam);}return 0;
}static const char CLASS_NAME[] = "WebViewContainer";static ret_t webview_os_window_init(HINSTANCE hInstance) {WNDCLASSEX wc;ZeroMemory(&wc, sizeof(WNDCLASSEX));wc.cbSize = sizeof(WNDCLASSEX);wc.hInstance = hInstance;wc.lpszClassName = CLASS_NAME;wc.lpfnWndProc = WindowProc;RegisterClassEx(&wc);return RET_OK;
}webview_os_window_t webview_os_window_create(SDL_Window* parent, int x, int y, int w, int h) {SDL_SysWMinfo wmInfo;SDL_VERSION(&wmInfo.version);SDL_GetWindowWMInfo(parent, &wmInfo);HWND hwndParent = wmInfo.info.win.window;HINSTANCE hInstance = wmInfo.info.win.hinstance;webview_os_window_init(hInstance);HWND hwndSub = CreateWindowEx(0, CLASS_NAME, "Container Window", WS_CHILD | WS_VISIBLE, x, y, 0,0, hwndParent, NULL, hInstance, NULL);if (hwndSub == NULL) {return 0;}ShowWindow(hwndSub, SW_SHOW);UpdateWindow(hwndSub);if (!hwndSub) {printf("Failed to create subwindow: %lu\n", GetLastError());return NULL;}return (webview_os_window_t)hwndSub;
}

2. 调整窗口大小

resize 窗口时,需要调整子窗口的大小。要注意的是,窗口的大小是以像素为单位的,所以需要考虑缩放因子。

void webview_os_window_move_resize(SDL_Window* parent, webview_os_window_t subwindow, int x, int y,int w, int h) {HWND hwndSub = (HWND)subwindow;float scale = system_info()->device_pixel_ratio;MoveWindow(hwndSub, x, y, w * scale, h * scale, TRUE);
}

3. 销毁窗口

销毁窗口时,需要销毁子窗口。

void webview_os_window_destroy(webview_os_window_t subwindow) {HWND hwndSub = (HWND)subwindow;DestroyWindow(hwndSub);
}

http://www.ppmy.cn/embedded/143234.html

相关文章

Rust : 生成日历管理markdown文件的小工具

需求&#xff1a; 拟生成以下markdown管理小工具&#xff0c;这也是我日常工作日程表。 可以输入任意时间段&#xff0c;运行后就可以生成以上的markdown文件。 一、toml [package] name "rust-workfile" version "0.1.0" edition "2021"[d…

ElementPlus 组件中的 el-tree 属性

文章目录 样式模板 el-tree 组件跳转&#xff1a; 点击跳转 样式 模板 html <!-- 左侧树形列表 --> <a-col :span"4"><a-card class"card-height"><template #title><a-input-searchstyle"width: 90%"placeholder…

基于Matlab地形和环境因素的森林火灾蔓延模拟与可视化研究

森林火灾的蔓延受多种因素的影响&#xff0c;包括地形、气候条件、植被类型等。为了更好地理解火灾蔓延的动态过程&#xff0c;本文提出了一种基于地形和环境参数的森林火灾蔓延模拟方法。通过综合考虑海拔高度、湿度、温度和风速等因素&#xff0c;我们使用 MATLAB 编写了一种…

Scala 的match case 匹配元组

object test2 {//match case 匹配元组def main(args: Array[String]): Unit {// val d1 (1,2,3)val d1 (1,2,3,4) // val d1 (1,2,3,4,5)val d: Any d1 //d的类型是Anyd match {case (x,y,z) > println(s"这是一个有三个元素的元组&#xff0c;它的第二个元…

ElasticSearch 与向量数据库的结合实践:突破亿级大表查询瓶颈20241204

&#x1f4a1; ElasticSearch 与向量数据库的结合实践&#xff1a;突破亿级大表查询瓶颈 &#x1f4da; 引言 随着业务规模的不断扩大&#xff0c;传统关系型数据库在处理 亿级大表 时&#xff0c;性能瓶颈愈加凸显。关键词检索、模糊查询、多条件筛选等需求逐步升级&#xff…

深度学习Python基础(2)

二 数据处理 一般来说PyTorch中深度学习训练的流程是这样的&#xff1a; 1. 创建Dateset 2. Dataset传递给DataLoader 3. DataLoader迭代产生训练数据提供给模型 对应的一般都会有这三部分代码 # 创建Dateset(可以自定义) dataset face_dataset # Dataset部分自定义过的…

开发者如何使用GCC提升开发效率Opencv操作

看此篇前请先阅读 https://blog.csdn.net/qq_20330595/article/details/144134160?spm=1001.2014.3001.5502 https://blog.csdn.net/qq_20330595/article/details/144134160?spm=1001.2014.3001.5502 https://blog.csdn.net/qq_20330595/article/details/144216351?spm=1001…

PHP使用RabbitMQ(正常连接与开启SSL验证后的连接)

代码中包含了PHP在一般情况下使用方法和RabbitMQ开启了SSL验证后的使用方法&#xff08;我这边消费队列是使用接口请求的方式&#xff0c;每次只从中取出一条&#xff09; 安装amqp扩展 PHP使用RabbitMQ前&#xff0c;需要安装amqp扩展&#xff0c;之前文章中介绍了Windows环…