当前位置: 首页 > news >正文

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

在 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);
}

相关文章:

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

在 Windows 平台上的实现&#xff0c;相对比较顺利&#xff0c;将一个窗口嵌入到另外一个窗口是比较容易的事情。 1. 创建窗口 这里有点需要注意&#xff1a; 父窗口的大小变化时&#xff0c;子窗口也要跟着变化&#xff0c;否则 webview 显示不出来。创建时窗口的大小先设置…...

Linux四剑客及正则表达式

正则表达式 基础正则&#xff08;使用四剑客命令时无需加任何参数即可使用&#xff09; ^ # 匹配以某一内容开头 如&#xff1a;^grep匹配所有以grep开头的行。 $ # 匹配以某一内容结尾 如&#xff1a;grep$ 匹配所有以grep结尾的行。 ^$ # 匹配空行。 . # 匹配…...

ALS 推荐算法案例演示(python)

数学知识补充&#xff1a;矩阵 总结来说&#xff1a; Am*k X Bk*n Cm*n ----至于乘法的规则,是数学问题, 知道可以乘即可,不需要我们自己计算 反过来 Cm*n Am*k X Bk*n ----至于矩阵如何拆分/如何分解,是数学问题,知道可以拆/可以分解即可 ALS 推荐算法案例&#xff1a;电影推…...

labview中连接sql server数据库查询语句

当使用数据库查询功能时&#xff0c;我们需要用到数据库的查询语句&#xff0c;这里已调用sql server为例&#xff0c;我们需要按照时间来查询&#xff0c;这里在正常调用数据库查询语句时&#xff0c;我们需要在前面给他加一个限制条件这里用到了&#xff0c;数据库的查询语句…...

leetcode_二叉树最大深度

对二叉树的理解 对递归调用的理解 对内存分配的理解 基础数据结构&#xff08;C版本&#xff09; - 飞书云文档 每次函数的调用 都会进行一次新的栈内存分配 所以lmax和rmax的值不会混在一起 /*** Definition for a binary tree node.* struct TreeNode {* int val;* …...

Elasticsearch 重建索引 数据迁移

Elasticsearch 重建索引 数据迁移 处理流程创建临时索引数据迁移重建索引写在最后 大家都知道&#xff0c;es的索引创建完成之后就不可以再修改了&#xff0c;包括你想更改字段属性或者是分词方式等。那么随着业务数据量的发展&#xff0c;可能会出现需要修改索引&#xff0c;或…...

2411rust,异步函数

原文 Rust异步工作组很高兴地宣布,在实现在特征中使用异步 fn的目标方面取得了重大进度.将在下周发布稳定的Rust1.75版,会包括特征中支持impl Trait注解和async fn. 稳定化 自从RFC#1522在Rust1.26中稳定下来以来,Rust就允许用户按函数的返回类型(一般叫"RPIT")编…...

前端网络性能优化问题

DNS预解析 DNS 解析也是需要时间的&#xff0c;可以通过预解析的⽅式来预先获得域名所对应的 IP。 <link rel"dns-prefetch" href"//abcd.cn"> 缓存 强缓存 在缓存期间不需要请求&#xff0c; state code 为 200 可以通过两种响应头实现&#…...

优选算法——双指针

前言 本篇博客为大家介绍双指针问题&#xff0c;它属于优选算法中的一种&#xff0c;也是一种很经典的算法&#xff1b;算法部分的学习对我们来说至关重要&#xff0c;它可以让我们积累解题思路&#xff0c;同时也可以大大提升我们的编程能力&#xff0c;本文主要是通过一些题…...

【Rabbitmq篇】RabbitMQ⾼级特性----消息确认

目录 前言&#xff1a; 一.消息确认机制 • ⾃动确认 • ⼿动确认 手动确认方法又分为三种&#xff1a; 二. 代码实现&#xff08;spring环境&#xff09; 配置相关信息&#xff1a; 1&#xff09;. AcknowledgeMode.NONE 2 &#xff09;AcknowledgeMode.AUTO 3&…...

开源TTS语音克隆神器GPT-SoVITS_V2版本地整合包部署与远程使用生成音频

文章目录 前言1.GPT-SoVITS V2下载2.本地运行GPT-SoVITS V23.简单使用演示4.安装内网穿透工具4.1 创建远程连接公网地址 5. 固定远程访问公网地址 前言 本文主要介绍如何在Windows系统电脑使用整合包一键部署开源TTS语音克隆神器GPT-SoVITS&#xff0c;并结合cpolar内网穿透工…...

【idea】更换快捷键

因为个人习惯问题需要把快捷键替换一下。我喜欢用CTRLD删除一下&#xff0c;用CTRLY复制一样。恰好这两个快捷键需要互换一下。 打开file——>setting——>Keymap——>Edit Actions 找到CTRLY并且把它删除 找到CTRLD 并且把它删除 鼠标右键添加CTRLY 同样操作在Delet…...

最小的子数组(leetcode 209)

给定一个正整数数组&#xff0c;找到大于等于s的连续的最小长度的区间。 解法一&#xff1a;暴力解法 两层for循环&#xff0c;一个区间终止位置&#xff0c;一个区间起始位置&#xff0c;找到大于等于s的最小区间长度&#xff08;超时了&#xff09; 解法二&#xff1a;双指…...

IDEA-Plugins无法下载插件(网络连接问题-HTTP Proxy Settings)

IDEA-Plugins无法下载插件&#xff08;网络连接问题&#xff09; 改成如下配置&#xff1a; 勾选 添这个url即可&#xff1a;https://plugins.jetbrains.com/ 重启插件中心&#xff0c;问题解决。...

AWTK-WIDGET-WEB-VIEW 发布

awtk-widget-web-view 是通过 webview 提供的接口&#xff0c;实现的 AWTK 自定义控件&#xff0c;使得 AWTK 可以方便的显示 web 页面。 项目网址&#xff1a; https://gitee.com/zlgopen/awtk-widget-web-view webview 提供了一个跨平台的 webview 接口&#xff0c;是一个非…...

Mysql每日一题(if函数)

两种写法if()和case if()函数 select *,if(T.xT.y>T.z and T.xT.z>T.y and T.yT.z>T.x,Yes,No) as triangle from Triangle as T; case方法 select *, case when T.xT.y>T.z and T.xT.z>T.y and T.yT.z>T.x then Yes else No end as triangle from Trian…...

Spring Cloud Alibaba [Gateway]网关。

1 简介 网关作为流量的入口&#xff0c;常用功能包括路由转发、权限校验、限流控制等。而springcloudgateway 作为SpringCloud 官方推出的第二代网关框架&#xff0c;取代了Zuul网关。 1.1 SpringCloudGateway特点: &#xff08;1&#xff09;基于Spring5&#xff0c;支持响应…...

【动手学深度学习Pytorch】2. Softmax回归代码

零实现 导入所需要的包&#xff1a; import torch from IPython import display from d2l import torch as d2l定义数据集参数、模型参数&#xff1a; batch_size 256 # 每次随机读取256张图片 train_iter, test_iter d2l.load_data_fashion_mnist(batch_size) # 将展平每个…...

技术周总结 11.11~11.17 周日(Js JVM XML)

文章目录 一、11.11 周一1.1&#xff09;问题01&#xff1a;js中的prompt弹窗区分出来用户点击的是 确认还是取消进一步示例 1.2&#xff09;问题02&#xff1a;在 prompt弹窗弹出时默认给弹窗中写入一些内容 二、11.12 周二2.1) 问题02: 详解JVM中的本地方法栈本地方法栈的主要…...

MATLAB 使用教程 —— 矩阵和数组

矩阵和数组MATLAB 中矩阵和数组长什么样&#xff1f;MATLAB 怎么用矩阵计算&#xff1f;创建和操作矩阵矩阵运算示例串联 访问矩阵的元素 矩阵和数组 MATLAB 是“matrix laboratory”的缩写形式。MATLAB 主要用于处理 整个的矩阵和数组&#xff0c;而其他编程语言大多逐个处理…...

当你的客户想运行自己的工作流,你该怎么办

一个平台开发者绕不开的困境 假设你在构建一个 SaaS 平台&#xff0c;你的客户可以在上面写自己的业务逻辑——也许是一个低代码工具&#xff0c;也许是一个 AI 驱动的自动化平台&#xff0c;也许是一个让每个团队定义自己 CI 流水线的开发工具。 客户的逻辑各不相同&#xff0…...

AMD Ryzen调试神器SMUDebugTool:如何解锁隐藏性能的5个关键步骤?

AMD Ryzen调试神器SMUDebugTool&#xff1a;如何解锁隐藏性能的5个关键步骤&#xff1f; 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. …...

为什么你的AI测试总在“伪自动化”?SITS 2026的3层认知跃迁:从用例驱动→意图驱动→反馈演化

AI原生测试方法革新&#xff1a;SITS 2026自动化测试新思路 更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;为什么你的AI测试总在“伪自动化”&#xff1f; “伪自动化”是当前AI工程实践中最隐蔽的效率陷阱——表面看测试脚本在运行&#xff0c;日…...

CPAL脚本自动化测试 ———— 诊断安全解锁函数的参数配置与实战陷阱解析

1. CPAL脚本与安全解锁函数基础认知 第一次接触CPAL脚本中的安全解锁函数时&#xff0c;我盯着那堆参数配置整整懵了半小时。这就像拿到一把复杂的电子锁&#xff0c;明明知道每个按钮的功能&#xff0c;但就是找不到正确的组合方式。安全解锁函数本质上是车辆诊断中用于通过27…...

如何5分钟完成高质量AI语音转文字:免费音频转录神器终极指南

如何5分钟完成高质量AI语音转文字&#xff1a;免费音频转录神器终极指南 【免费下载链接】faster-whisper-GUI faster_whisper GUI with PySide6 项目地址: https://gitcode.com/gh_mirrors/fa/faster-whisper-GUI 还在为会议录音整理而烦恼吗&#xff1f;还在为视频字幕…...

API中转站统一管理工具:基于Electron的自动化运维实践

1. 项目概述&#xff1a;一个桌面端API中转站管理工具如果你正在使用或管理多个AI模型的API中转服务&#xff0c;比如OpenAI、Claude、Anthropic、Gemini等&#xff0c;那么你大概率会遇到一个非常头疼的问题&#xff1a;管理混乱。不同的中转站有不同的后台地址、不同的账号密…...

MVDR算法在5G毫米波基站中的实战:如何用Capon波束形成提升用户侧向精度?

MVDR算法在5G毫米波基站中的实战&#xff1a;如何用Capon波束形成提升用户侧向精度&#xff1f; 毫米波频段作为5G网络的关键技术支柱&#xff0c;其大规模MIMO系统的波束管理能力直接决定了用户体验。当基站需要同时服务多个移动终端时&#xff0c;传统数字波束形成&#xff0…...

51单片机通过继电器模块实现智能灯光控制

1. 从点灯到智能控制&#xff1a;51单片机与继电器的完美组合 记得我第一次用51单片机点亮LED时&#xff0c;那种成就感至今难忘。但后来发现&#xff0c;单纯的点灯只是电子世界的"Hello World"&#xff0c;真正的乐趣在于让灯光变得"聪明"起来。这就是为…...

Docker工具箱镜像构建:Alpine集成开发调试工具链实战

1. 项目概述&#xff1a;一个为开发者定制的“瑞士军刀”式Docker镜像在开发与运维的日常工作中&#xff0c;我们常常会遇到一些高频但琐碎的任务&#xff1a;需要快速验证一个API接口、临时搭建一个测试环境、或者只是想在一个干净的环境里跑一段脚本。每次都要从零开始安装依…...

从手机录屏到游戏直播:搞懂FPS和分辨率,让你的视频告别卡顿和模糊

从手机录屏到游戏直播&#xff1a;搞懂FPS和分辨率&#xff0c;让你的视频告别卡顿和模糊 当你用手机录制一段《原神》战斗画面&#xff0c;上传到B站后却发现视频卡成PPT&#xff1b;或是用OBS直播《王者荣耀》时&#xff0c;观众总抱怨画面模糊得像打了马赛克——这些问题背后…...