RmlUi 初試,hello world

前言

最近在研究GUI的各個方面,最后被導向了web render,真的是一言難盡。
這里就其中一個比較有意思的項目 RmlUi 淺試一下,沒想要還挺麻煩!這里留下note以供后人參考。

環境搭建

Windows + VS2022 + pre-binary library

需要指出的是 RmlUi官方的sample和demo很爛,對,可以說很爛!
因為按照他們的教程和示例,我玩了兩天也沒搞出來一個hello world!
也可能是我水平太菜了吧,但是我還是認為官方的資料是真的不行,只能提供思路的參考。

以當前最新版本v5.1為例,關鍵步驟如下:

  1. VS創建一個console C++項目,我們以x86為目標
  2. 將從 https://github.com/mikke89/RmlUi/releases 下載 RmlUi-vs2017-win32.zip. 解壓到指定目錄,將對應 include/lib/link 三件套手動配置到project中。添加 freetype.lib 的文件夾路徑到project, 添加 freetype.lib, RmlCore.lib依賴。
  3. 添加 Backends文件夾到 include, 復制 freetype.dll, RmlCore.Dll到可執行文件夾。
  4. 修改 主 cpp文件。內容參考下面。
  5. 直接編譯,100% 各種error! 并且沒有教程可以參考!

到這里,你需要考慮一個問題:

你的GUI跑在什么后端上?

什么意思呢?

你的GUI渲染引擎是什么?OpenGL? Vulkan? SDL?
你的繪制引擎是什么?SDL? FLFW? SDL? X11? Win32?

如果回答不了,這里就無法進行下去了。

當然,有人說,我想要 GDI + Win32。我不想使用顯卡渲染!

對不起,不好意思,這個也不支持!!

RmlUi 實際上是一個更側重2D/3D渲染的引擎,對于UI渲染的目標就是 顯卡/SDL 渲染!

那么,我能選擇的是什么呢?

渲染引擎可選:GL2/GL3/SDL/VK
繪制引擎可選:SFML/SDL/WIn32/GLFW/X11

注意:以上兩種選擇,目前不支持自由組合!!


這里我選擇了windows上最容易準備的環境:SDL + SDL, 這個組合官方有現成的支持!


繼續配置:

  • 將SDL和SDL_image的release包從GitHub下載下來,include/lib/link 三件套配置好
  • 在VS project中將 RmlUi_Platform_SDL.h/.cpp, RmlUi_Renderer_SDL.h/.cpp, RmlUi_Backend_SDL_SDLrenderer.cpp 三套源文件加入。
  • 準備 字體ttf 文件, 需要中文的,字體也要支持中文。
  • 準備 rml 和 rcss 文件。
    這里需要注意,rcss一定要通過 rml 中的 link 方式加載進去。
  • 最后,debug 起來, 注意查看 VS 調試窗口的提示!

幾個常見問題:

1. Font load error。大概率是字體路徑或者權限問題,確保有讀寫權限。
2. No font face。font-family xxx ?rcss 文件可能沒加載,或者widget沒有設置 font-family.所有widget都需要設置,最好使用*篩選器設置全部的。還有一種可能:你沒有在rml中link 正確的rcss文件。一定要查看debug窗口里的提升輸出。

參考代碼

// rmldemo.cpp : 此文件包含 "main" 函數。程序執行將在此處開始并結束。
//#include <RmlUi/Core.h>
#include <RmlUi_Backend.h>struct ApplicationData {bool show_text = true;Rml::String animal = "dog";
} my_data;int main()
{int window_width = 1024;int window_height = 768;// Initializes the shell which provides common functionality used by the included samples.//if (!Shell::Initialize())//	return -1;// // Constructs the system and render interfaces, creates a window, and attaches the renderer.if (!Backend::Initialize("Template Tutorial", window_width, window_height, true)){//Shell::Shutdown();return -1;}// Install the custom interfaces constructed by the backend before initializing RmlUi.Rml::SetSystemInterface(Backend::GetSystemInterface());Rml::SetRenderInterface(Backend::GetRenderInterface());// RmlUi initialisation.Rml::Initialise();// Create the main RmlUi context.Rml::Context* context = Rml::CreateContext("main", Rml::Vector2i(window_width, window_height));if (!context){Rml::Shutdown();Backend::Shutdown();//Shell::Shutdown();return -1;}//Rml::Debugger::Initialise(context);// Tell RmlUi to load the given fonts.Rml::LoadFontFace("C:\\myfont\\MappleMono\\MapleMono-NF-CN-Regular.ttf");// Fonts can be registered as fallback fonts, as in this case to display emojis.//Rml::LoadFontFace("C:\\Users\\andy\\Desktop\\myfont\\JetBrainsMono\\JetBrainsMono-Regular.ttf", true);// Set up data bindings to synchronize application data.if (Rml::DataModelConstructor constructor = context->CreateDataModel("animals")){constructor.Bind("show_text", &my_data.show_text);constructor.Bind("animal", &my_data.animal);}// Load and show the tutorial document.if (Rml::ElementDocument* document = context->LoadDocument("hello.rml"))document->Show();bool running = true;while (running){running = Backend::ProcessEvents(context, nullptr, true);context->Update();Backend::BeginFrame();context->Render();Backend::PresentFrame();}// Shutdown RmlUi.Rml::Shutdown();Backend::Shutdown();//Shell::Shutdown();return 0;
}

hello.rml

<rml>
<head><title>Hello world</title><link type="text/rcss" href="hello.rcss"/>
</head>
<body data-model="animals"><h1>RmlUi</h1><p>Hello <span id="world">world</span>!</p><p data-if="show_text">The quick brown fox jumps over the lazy {{animal}}.</p><input type="text" data-value="animal"/>
</body>
</rml>

hello.rcss

* {font-family: "Maple Mono NF CN";
}
body {font-size: 18px;color: #02475e;background: #fefecc;text-align: center;padding: 2em 1em;position: absolute;border: 2px #ccc;width: 500px;height: 200px;margin: auto;
}h1 {color: #f6470a;font-size: 1.5em;font-weight: bold;margin-bottom: 0.7em;
}p { margin: 0.7em 0;
}input.text {background-color: #fff;color: #555;border: 2px #999;padding: 5px;tab-index: auto;cursor: text;box-sizing: border-box;width: 200px;font-size: 0.9em;
}

后記

如果不想使用SDL,使用OpenGL怎么辦呢?

和一開始的問題一樣:你選擇什么組合?
我們以 GFLW + OpenGL2 為例:

  • 需要準備 OpenGL2 開發SDK,將三件套添加到 project 中。
  • 需要添加 RmlUi_Backend_GLFW_GL2.h/.cpp, RmlUi_Platform_GLFW.h/.cpp, RmlUi_Renderer_GL2.h/.cpp 添加到project中。
  • 如果遇到 OpenGL2 依賴其他 image庫一類的,繼續下載對應 SDK 添加到 project中。

備注: RmlUi 對輸入法支持不行,目前作者還在開發中。

個人估計,IME 這塊開源項目想要自己實現,幾乎不可能!參考flutter,這么多年了,也沒修的很好。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/15246.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/15246.shtml
英文地址,請注明出處:http://en.pswp.cn/web/15246.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

高通Android 12/13 設置和獲取ADB狀態

/*** 設置ADB狀態** param isEnable*/public void setADB(boolean isEnable) {Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.ADB_ENABLED, isEnable ? 1 : 0);}/*** 獲取ADB狀態** return*/public boolean getADB() {return Settings.Global.getIn…

虛擬化技術[3]之網絡虛擬化

網絡虛擬化 網絡虛擬化簡介核心層網絡虛擬化接入層網絡虛擬化虛擬機網絡虛擬化案例: VMware網絡虛擬化技術虛擬網絡接口卡虛擬交換機vSwitch分布式交換機端口組VLAN 網絡虛擬化簡介 傳統的數據中心&#xff1a;服務器之間操作系統和上層軟件異構、接口與數據格式不統一&#x…

鏈表相交-力扣

在做這道題時&#xff0c;首先想到的解法是遍歷第一個鏈表&#xff0c;將其全部添加到哈希表中&#xff0c;然后遍歷第二個鏈表&#xff0c;如果能夠再哈希表中查到元素&#xff0c;則返回這個元素&#xff0c;否則返回NULL。 但在實際寫代碼時&#xff0c;第一次寫默認為鏈表相…

Redis實現MQ

MQ的提出 上游發出請求后阻塞等待下游給到反饋&#xff0c;否則整個流程將一直阻塞。 提出mq之后&#xff1a;即有producer mq consumer 三者 MQ的特點 異步解耦 在有了 mq 后&#xff0c;producer 不需要過分關心 consumer 的身份信息&#xff0c;只需要把消息按照指定的協議…

Python 潮流周刊#52:Python 處理 Excel 的資源

本周刊由 Python貓 出品&#xff0c;精心篩選國內外的 250 信息源&#xff0c;為你挑選最值得分享的文章、教程、開源項目、軟件工具、播客和視頻、熱門話題等內容。愿景&#xff1a;幫助所有讀者精進 Python 技術&#xff0c;并增長職業和副業的收入。 本期周刊分享了 12 篇文…

基于hive的酒店價格數據可視化分析系統設計和實現

摘要 本文基于Django框架和Hive技術&#xff0c;設計和實現了一種酒店價格數據可視化分析系 統&#xff0c;旨在為酒店管理者提供直觀、清晰的數據洞察和決策支持。在研究中&#xff0c;首先深入分 析了酒店價格數據可視化分析系統的背景和意義&#xff0c;認識到對于酒店行…

3.Redis之Redis的環境搭建redis客戶端介紹

1.版本的選取 安裝 Redis&#xff1a;Redis 5 系列~~ 在 Linux 中進行安裝~~ Redis 官方是不支持 Windows 版本的~~ 微軟維護了一個 Windows 版本的 Redis 分支 Centos和Ubuntu.Docker 2.如何進行安裝&#xff1f;&#xff1f;&#xff1f; 1.ubuntu 2.centos yum instal…

arcgisPro將一個圖層的要素復制到另一個圖層

1、打開兩個圖層&#xff0c;如下&#xff0c;其中一個圖層中有兩個要素&#xff0c;需要將其中一個要素復制到另一個圖層中&#xff0c;展示如下&#xff1a; 2、選中待復制要素&#xff0c;點擊復制按鈕&#xff0c;如下&#xff1a; 3、下拉粘貼按鈕列表&#xff0c;選擇【選…

利用oracle默認事務隔離級別(提交讀)提升多表聯查速度

利用oracle默認事務隔離級別(提交讀)提升查詢速度) 背景介紹&#xff1a; 數據量大查詢緩慢&#xff0c;添加太多條件&#xff0c;使用IN走了全表查詢導致查詢速度緩慢。 解決方案&#xff1a; 版本一&#xff1a; 新建臨時表&#xff0c;在查詢是將數據插入到臨時表中&#…

Python 根據點云索引提取點云

點云索引濾波 一、介紹1.1 概念1.2 參數設置二、代碼示例三、結果示例一、介紹 1.1 概念 點云索引濾波 是一種常用的點云濾波方法,根據給定的索引列表獲取點云中的索引點,或著根據給定的索引列表獲取點云中的非索引點。 1.2 參數設置 核心函數: def select_by_index(self, …

Ubuntu22.04虛擬機設置靜態IP

虛擬機設置靜態IP 按下電腦的 “win”鍵&#xff0c;在彈出的輸入框中輸入“控制面板”&#xff0c;選中控制面板 1.選擇 “網絡和Internet” 2.選擇 “網絡和共享中心” 3.選擇 “更改適配器設置” 4.選擇 “VMnet8”&#xff0c;雙擊打開 5.選擇 “屬性” 找到 “Internet …

【idea】idea2024最新版本下載_安裝_破解

1、下載 下載地址&#xff1a;下載 IntelliJ IDEA – 領先的 Java 和 Kotlin IDE 下載完成&#xff1a; idea破解腳本下載鏈接&#xff1a;https://pan.baidu.com/s/1L5qq26cRABw8XuEn_CngKQ 提取碼&#xff1a;6666 下載完成&#xff1a; 2、安裝 1、雙擊idea的安裝包&…

《計算機網絡微課堂》1-6 計算機體系結構

常見的計算機網絡體系結構 從本節課開始&#xff0c;我們要用 4 次課的時間來介紹有關計算機網絡體系結構的知識&#xff0c;具體包含以下內容&#xff1a; 一&#xff0c;常見的計算機網絡體系結構二&#xff0c;計算機網絡體系結構分層的必要性三&#xff0c;計算機網絡體系…

給我瞅瞅呀

專業 流程&#xff08;一條龍服務&#xff09; 需求溝通-需求分析-產品架構-ue原型-ui設計-產品研發-產品測試-產品交付-產品運維 保障 1、按需定制&#xff0c;簽訂功能清單&#xff0c;根據功能報價 2、價格透明&#xff0c;簽訂合同保障&#xff0c;保障客戶合法權益 3、源…

python(4) : pip安裝使用國內源

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple requests

低代碼應用:云原生與Kubernetes的應用實戰

隨著云原生技術的發展&#xff0c;低代碼開發平臺&#xff08;Low-Code Development Platforms, LCDPs&#xff09;在企業級應用開發中扮演著越來越重要的角色。本文將探討低代碼平臺如何與Kubernetes結合&#xff0c;實現高效、靈活且可擴展的企業級應用開發。 低代碼平臺概述…

監控員工電腦屏幕的五大軟件(電腦監控軟件大盤點)

監控員工電腦屏幕是企業為了提升工作效率、確保信息安全和合規性而采取的一種常見做法。以下是五款在2024年備受推薦的員工電腦屏幕監控軟件&#xff0c;每款軟件都具有其獨特的功能和優勢&#xff1a; 1. 域智盾 域智盾是一款全面的終端管理系統&#xff0c;集成了實時屏幕監…

動態代理,反射,注解的復習筆記

1.動態代理的作用 動態代理最主要的用途就是在各種框架中&#xff0c;很方便的在運行期間生成代理類&#xff0c;通過代理類就可以完成AOP、過濾器、攔截器等操作 &#xff08;注&#xff1a;代理就是被代理者沒有能力或者不愿意去完成某件事情&#xff0c;需要找個人代替自己…

02.爬蟲---HTTP基本原理

02.HTTP基本原理 1.URI 和 URL 的區別2.HTTP 和 HTTPS 的區別3.請求過程 1.URI 和 URL 的區別 URL&#xff08;Uniform Resource Locator&#xff09;即-統一資源定位符 URL是用來定位和訪問互聯網上資源的獨特標識&#xff0c;它包括了資源的位置&#xff08;如IP地址或域名&a…

移動硬盤難題:不顯示容量與無法訪問的解決策略

在使用移動硬盤的過程中&#xff0c;有時會遇到一些棘手的問題&#xff0c;比如移動硬盤不顯示容量且無法訪問。這種情況讓人十分頭疼&#xff0c;因為它不僅影響了數據的正常使用&#xff0c;還可能導致重要數據的丟失。接下來&#xff0c;我們就來詳細探討一下這個問題及其解…