AWTK-WIDGET-WEB-VIEW 实现笔记 (3) - MacOS

MacOS 上实现 AWTK-WIDGET-WEB-VIEW 有点麻烦,主要原因是没有一个简单的办法将一个 WebView 嵌入到一个窗口中。所以,我们只能通过创建一个独立的窗口来实现。

在这里插入图片描述

1. 创建窗口

我对 Object-C 不熟悉,也不熟悉 Cocoa 框架,在 ChatGPT 的帮助下,实现了一个简单的窗口创建函数。这个函数接受一个 SDL_Window 指针作为父窗口,然后创建一个新的窗口,将其设置为父窗口的子窗口。这样,新窗口就会在父窗口的上方显示。

在移动窗口时,子窗口也会跟着移动,但是有些延迟。

webview_os_window_t webview_os_window_create(SDL_Window* parent, int x, int y, int w, int h) {SDL_SysWMinfo info;SDL_VERSION(&info.version);SDL_GetWindowWMInfo(parent, &info);NSRect frame = NSMakeRect(x, y, w, h);NSWindow *parentWindow = (NSWindow *)info.info.cocoa.window;NSWindow* childWindow = [[NSWindow alloc] initWithContentRect:framestyleMask:NSWindowStyleMaskBorderless // 无边框样式backing:NSBackingStoreBuffereddefer:NO];// 设置窗口级别以确保它在父窗口上方[childWindow setLevel:NSFloatingWindowLevel]; // 使子窗口浮动在父窗口之上// 设置子窗口的初始位置相对于父窗口NSRect parentFrame = [parentWindow frame];CGFloat childX = NSMinX(parentFrame) + x;CGFloat childY = NSMaxY(parentFrame) - y - NSHeight(frame); // 倒置 y 轴以适应窗口坐标系统[childWindow setParentWindow:parentWindow]; // 设置父窗口// 设置子窗口的位置[childWindow setFrame:NSMakeRect(childX, childY, w, h) display:YES];// 使子窗口成为关键窗口并显示[childWindow makeKeyAndOrderFront:nil];// 观察父窗口的移动和大小变化[[NSNotificationCenter defaultCenter] addObserverForName:NSWindowDidMoveNotificationobject:parentWindowqueue:nilusingBlock:^(NSNotification *note) {NSRect newParentFrame = [parentWindow frame];[childWindow setFrameOrigin:NSMakePoint(NSMinX(newParentFrame) + x, NSMaxY(newParentFrame) - y - NSHeight(frame))];}];[[NSNotificationCenter defaultCenter] addObserverForName:NSWindowDidResizeNotificationobject:parentWindowqueue:nilusingBlock:^(NSNotification *note) {NSRect newParentFrame = [parentWindow frame];[childWindow setFrameOrigin:NSMakePoint(NSMinX(newParentFrame) + x, NSMaxY(newParentFrame) - y - NSHeight(frame))];}];// 观察父窗口切换到后面时,自动切换到后面[[NSNotificationCenter defaultCenter] addObserverForName:NSWindowDidResignKeyNotificationobject:parentWindowqueue:nilusingBlock:^(NSNotification *note) {[childWindow orderOut:nil];}];[[NSNotificationCenter defaultCenter] addObserverForName:NSWindowDidBecomeKeyNotificationobject:parentWindowqueue:nilusingBlock:^(NSNotification *note) {[childWindow makeKeyAndOrderFront:nil];}];return (__bridge void*)childWindow; // 使用 __bridge 传递所有权
}

2. 调整窗口大小

奇怪的是从 subwindow 获取父窗口的方法不起作用,所以通过传递父窗口的指针来调整子窗口的大小。

void webview_os_window_move_resize(SDL_Window* parent, webview_os_window_t subwindow, int x, int y, int w, int h) {SDL_SysWMinfo info;SDL_VERSION(&info.version);SDL_GetWindowWMInfo(parent, &info);NSWindow *childWindow = (__bridge NSWindow*)subwindow;NSWindow *parentWindow = info.info.cocoa.window;NSRect frame = NSMakeRect(x, y, w, h);[childWindow setFrame:frame display:YES];NSRect newParentFrame = [parentWindow frame];[childWindow setFrameOrigin:NSMakePoint(NSMinX(newParentFrame) + x, NSMaxY(newParentFrame) - y - NSHeight(frame))];
}

3. 销毁窗口

销毁窗口时,需要将子窗口从父窗口中移除。

void webview_os_window_destroy(webview_os_window_t subwindow) {NSWindow *childWindow = (__bridge NSWindow*)subwindow;[[NSNotificationCenter defaultCenter] removeObserver:childWindow];[childWindow close];
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/18627.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

fiddler抓包24_App流量统计

​课程大纲 使用Fiddler可以实现“APP流量统计”功能。具体操作如下: ① 选中app所有请求,点击右侧菜单标签“Statistics”。 ② 查看请求统计数据,即APP流量统计:“Bytes Sent”(发送的字节数)、“Bytes R…

小白投资理财 - 解读 CCI

小白投资理财 - 解读 CCI 什么是 CCICCI 计算方法CCI 指标的使用首先超买和超卖接下来是背离 CCI 缺点总结 顺着河流能够渡河,逆向河流只会挂彩,今天就来了解一下 CCI(Commodity Channel lndex)中文称之为顺势指标 什么是 CCI 它…

2024 RISC-V中国峰会 安全相关议题汇总

安全之安全(security)博客目录导读 第四届 RISC-V 中国峰会(RISC-V Summit China 2024)于8月21日至23日在杭州成功举办。此次峰会汇聚了 RISC-V 国际基金会、百余家重点企业及研究机构,约3000人线下参与,并在19日至25日间举办了超…

Linux守护Pythom脚本运行——Supervisor学习总结

Supervisor能做什么? 在工作中有时会遇到在Linux服务器上编写各种脚本来实现日志的推送、数据的传输、流量的监控等,这些脚本在整个系统运行中也需要和其他服务端应用程序一样持续且稳定运行,为了达到这种目的就需要使用进程守护工具来对正在…

机器学习基础05_随机森林线性回归

一、随机森林 机器学习中有一种大类叫集成学习(Ensemble Learning),集成学习的基本思想就是将多个分类器组合,从而实现一个预测效果更好的集成分类器。集成算法大致可以分为:Bagging,Boosting 和 Stacking…

leetcode-44-通配符匹配

题解: 代码: 参考: (1)牛客华为机试HJ71字符串通配符 (2)leetcode-10-正则表达式匹配

C++类和对象介绍

目录 一、类的创建 二、访问权限 三、struct与class 四、类域 五、类的大小 一、类的创建 C中【class】为定义类的关键字,【{}】中为类的主体,注意类定义结束时后⾯分号不能省略。一般来说,类规范由两部分组成: 类的声明&…

【自学笔记】推荐系统

文章目录 引入一些记号原理 协同过滤算法使用均值归一化 基于内容的推荐原理基于TensorFlow的代码 从大目录里推荐检索排名 引入 一些记号 记号含义其他 n n n总人数 m m m总样本数 k k k特征数 y i ( j ) y_{i}^{(j)} yi(j)​第 j j j个人对第 i i i个样本的评分 y i , j ∈ …

vue基础

1. vue是什么? Vue.js (读音 /vju ː /, 类似于 view ) 是一套构建用户界面的渐进式框架。 Vue 只关注视图层, 采用自底向上增量开发的设计。 Vue 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。 官…

简单学点位运算(Java)

1. 位运算符 Java中常用的位运算符如下: 2. 详解 (1)按位与 & 规则:同一位上全是 1 时,结果为 1,否则为 0。用途: 清零某些位:x & 0xF0可以保留高 4 位,清除…

637. 二叉树的层平均值【 力扣(LeetCode) 】

文章目录 零、原题链接一、题目描述二、测试用例三、解题思路四、参考代码 零、原题链接 637. 二叉树的层平均值 一、题目描述 给定一个非空二叉树的根节点 root , 以数组的形式返回每一层节点的平均值。与实际答案相差 10-5 以内的答案可以被接受。 二、测试用例 示例 1&a…

111页PPT丨服装零售行业数字化时代的业务与IT转型规划

安踏的数字化转型项目在方法论、计划和组织方面展现出了明确的目标、系统的规划和有效的执行。以下是对这三个方面的详细分析: 方法论 安踏的数字化转型方法论主要围绕以下几个核心点展开: 服务于整体战略:数字化转型不是孤立的项目&#…

人工智能技术的应用前景与我们的应对策略

​ 大家好,我是程序员小羊! 随着人工智能(AI)技术的快速发展,其在社会生活、产业转型以及科技进步中发挥着日益重要的作用。AI正逐步改变着我们的生活和工作方式,同时也带来了技术和伦理上的诸多挑战。本文…

基于Java Springboot论坛系统

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 数据…

Vue2教程001:初识Vue

文章目录 1、初识Vue1.1、Vue2前言1.2、创建Vue实例1.3、插值表达式1.4 Vue响应式特性 1、初识Vue 1.1、Vue2前言 Vue是什么? 概念:Vue是一个用于构建用户界面的渐进式框架。 Vue的两种使用方式: Vue核心包开发 场景:局部模块…

113页PPT制造业研发工艺协同及制造一体化

研发工艺协同及制造一体化解决方案是制造业数字化转型的重要组成部分,它涵盖了从产品设计到生产的全过程,旨在提高生产效率、降低成本、提升产品质量,并增强企业的市场竞争力。以下是对该解决方案的详细阐述: 一、方案概述 研发…

红外遥控信号解码

红外遥控信号解码 之前就已经做过红外遥控的解码了,但是一直没有做记录,最近的项目又使用到了红外遥控,索性就把他捡起来记录一下,对于信号的解码,我一般的习惯都是先用逻辑分析仪抓取一下信号波形,然后对…

Spring:纯注解开发模式-Ioc对bean的管理

我们知道(请见 注解开发定义bean),可以使用注解来配置bean,但是依然有用到配置文件,在配置文件中对包进行了扫描,Spring在3.0版已经支持纯注解开发 Spring3.0开启了纯注解开发模式,使用Java类替代配置文件…

赛元免费开发板申请

在作者网上冲浪的时候,突然发现了一个国内的良心企业,虽然现在不是很有名,但是他现在是有一个样品申请的活动,他就是国内的Redfine新定义,他申请的板子是用的赛元MCU,作者本着有板子就要申请的原则&#xf…

【编译】多图解释 什么是短语、直接短语、句柄、素短语、可归约串

一、什么是短语二、什么是“直接”短语?三、什么是句柄?四、什么是素短语?五、什么是最左素短语可归约串就是“最左素短语” 首先,这些概念 都是相对于【句型】的,都是相对于【句型】的,都是相对于【句型】…