从源码视角全面解析 Chrome UI 布局系统及 Views 框架的定制化实现方法与实践经验

基于Chrome开源提取的界面开发框架 二   基于Chrome开源提取的界面开发框架 二前段时间的工作1.2d绘图引擎迁移回skia平台2.跟进到Chrome源码的chromium.r78515版本3.ScrollView、Menu等UI元素移植4.修改Chrome的一些Bugs或不足5.目录的整理、调整6.开始以教程的形式深入理解整个UI框架, 发现其中的问题, 为下一步扩展打好基础UI库项目的依赖在library/depends.txtUI库的Bugs在library/bugs.txt所有不确定的地方在代码中均有WLW TODO标记之前的tes 阅读详情

1. 引言

现代浏览器不仅是网页浏览工具,更是一个高度复杂的应用程序,其界面复杂程度接近桌面应用。Chrome 内核为了实现跨平台、高性能的用户界面,设计了 Views 框架,作为 UI 控件管理、布局和事件处理的核心模块。

理解 Chrome 布局系统不仅有助于浏览器开发者,还能让前端框架开发者掌握跨平台桌面 UI 的设计思想。

本文将从三个维度展开:

  • What(是什么):Chrome 布局系统及其组件。

  • How(怎么做):布局原理、源码机制、定制实现。

  • Why(为什么):设计理念、性能考虑、可扩展性分析。

文中包含源码片段、结构示意、定制实现案例,帮助读者系统理解和动手实践。


2. What:Chrome UI 布局系统概述

2.1 Views 框架的核心定位

Chrome 内部 UI 基于 Views 框架,它是一个跨平台的轻量级 C++ UI 库,核心目标包括:

  1. 跨平台一致性:支持 Windows、macOS、Linux。

  2. 高性能渲染:通过控件树、Invalidate 与绘制缓存机制降低重复绘制。

  3. 灵活布局:支持多种布局管理器,便于控件组合。

  4. 可扩展性:易于自定义控件、主题和皮肤。

Views 框架主要包括:

  • View:基本 UI 单元,负责绘制、布局和事件响应。

  • Widget:窗口封装,顶层控件。

  • LayoutManager:控件布局管理器,计算子控件尺寸与位置。

  • ResourceBundle:统一管理图像、字体、颜色等资源。

  • 事件分发机制:处理鼠标、键盘和触控事件。


2.2 View 树结构

Chrome UI 的核心是 树状控件结构:

  • 根节点:通常是 BrowserView 或 Widget。

  • 子节点:每个 View 可以包含任意子 View。

  • 树的层级结构:Parent 负责对子控件布局,事件从 Widget 捕获再逐层分发。

例如,浏览器工具栏可能包含如下树:

BrowserView ├─ ToolbarView │ ├─ BackButton │ ├─ ForwardButton │ └─ AddressBarView ├─ TabStripView └─ ContentView 

每个 View 可以重写 Layout() 和 OnPaint() 方法,自定义位置和绘制逻辑。


2.3 Layout 与布局管理器

布局管理器负责子控件 尺寸计算和位置排列。Views 框架常见 LayoutManager 包括:

  • BoxLayout:水平或垂直排列。

  • GridLayout:网格布局,支持跨行跨列。

  • FlexLayout(定制):类似 Web 弹性布局,支持控件伸缩。

LayoutManager 的接口主要有:

class LayoutManager { public: virtual void Layout(View* host) = 0; virtual gfx::Size GetPreferredSize(const View* host) const = 0; }; 

通过布局管理器,父控件无需关心子控件具体大小,只需委托 LayoutManager 计算。


2.4 ResourceBundle

Chrome UI 使用 ResourceBundle 管理静态资源:

  • 图片:按钮、图标、背景。

  • 字体:统一管理字体列表。

  • 颜色:支持主题、皮肤配置。

  • 文本:多语言资源管理。

资源加载方式包括:

  1. 本地文件:直接读取。

  2. 压缩包(ZIP):支持主题包。

  3. 内存缓存:减少重复读取,提高性能。

定制 ResourceBundle 可以实现类似 Duilib 的皮肤系统。


3. How:布局系统原理与定制实现

3.1 View 树的布局与绘制流程

View 树的布局流程包括:

  1. Invalidate:控件状态变化。

  2. ScheduleLayout:通知父控件重新计算布局。

  3. LayoutManager::Layout():计算子控件位置。

  4. SchedulePaint:触发绘制。

  5. OnPaint:控件实际绘制。

示例:

class MyView : public views::View { public: void Layout() override { int x = 0; for (auto* child : children()) { child->SetBounds(x, 0, child->GetPreferredSize().width(), child->GetPreferredSize().height()); x += child->width() + 5; } } void OnPaint(gfx::Canvas* canvas) override { canvas->DrawColor(SK_ColorWHITE); views::View::OnPaint(canvas); } }; 

3.2 LayoutManager 的自定义

Chrome 的布局系统允许定制 LayoutManager,实现复杂布局,例如工具栏、侧边栏等。

class CustomLayout : public views::LayoutManager { public: void Layout(views::View* host) override { int x = 0, y = 0; for (auto* child : host->children()) { int w = child->GetPreferredSize().width(); int h = child->GetPreferredSize().height(); child->SetBounds(x, y, w, h); x += w + 5; } } gfx::Size GetPreferredSize(const views::View* host) const override { int width = 0, height = 0; for (auto* child : host->children()) { width += child->GetPreferredSize().width() + 5; height = std::max(height, child->GetPreferredSize().height()); } return gfx::Size(width, height); } }; 

3.3 控件定制与资源绑定

自定义控件可以绑定皮肤资源、字体和颜色,实现动态换肤:

class SkinButton : public views::LabelButton { public: SkinButton() { SetBackgroundColor(SkColorSetRGB(50, 100, 200)); SetFontList(gfx::FontList({"Arial"}, 12)); } void OnPaint(gfx::Canvas* canvas) override { canvas->DrawColor(GetBackgroundColor()); LabelButton::OnPaint(canvas); } }; 

结合自定义 ResourceBundle,可以从 ZIP 包动态加载皮肤资源。


3.4 事件分发机制

Chrome UI 事件处理遵循 捕获 → 目标 → 冒泡 模式:

  1. Widget 捕获鼠标、键盘事件。

  2. 调用 View 树分发机制。

  3. 每个 View 可以重写事件处理函数,如 OnMousePressed()、OnKeyPressed()。

  4. 事件可以被拦截、消费或继续冒泡。

示例:

bool MyButton::OnMousePressed(const ui::MouseEvent& event) { // 自定义点击逻辑 DoAction(); return true; // 消费事件 } 

事件机制与布局密切相关,因为控件位置决定事件命中区域。


3.5 动态刷新与缓存优化

为了性能优化,Views 框架引入 控件绘制缓存:

  • Invalidate:标记控件需要刷新。

  • Layer:可选,使用 GPU 加速绘制。

  • SchedulePaint:批量刷新,减少重复绘制。

结合布局管理器和控件缓存,可以实现大规模 UI 的高性能渲染。


3.6 定制 ResourceBundle

通过继承 ui::ResourceBundle::Delegate,可以实现类似 Duilib 的皮肤系统:

class CustomThemeBundle : public ui::ResourceBundle::Delegate { public: gfx::Image GetImageNamed(int resource_id) override { return LoadImageFromZip(resource_id); } base::RefCountedMemory* LoadDataResourceBytes(int resource_id, ui::ResourceScaleFactor scale) override { return LoadResourceBytes(resource_id, scale); } }; 

结合自定义 LayoutManager 和控件,可以实现完整主题布局系统。


3.7 多语言与动态皮肤

Chrome UI 支持多语言和动态主题:

  • 多语言:ResourceBundle 提供 GetLocalizedString() 接口。

  • 动态皮肤:通过切换 ResourceBundle 和控件属性实现。

示例:

void ChangeSkin(const std::string& skin_name) { resource_bundle_->ChangeSkin(skin_name); root_view_->SchedulePaint(); // 触发重新绘制 } 

4. Why:设计理念与价值

  1. 跨平台一致性:View 树 + LayoutManager + ResourceBundle,实现统一界面。

  2. 灵活可扩展:LayoutManager 与控件解耦,自定义布局和控件变更简单。

  3. 性能优化:控件树 + 缓存机制,减少重复绘制。

  4. 支持主题与多语言:统一资源管理,动态切换皮肤和语言。

  5. 易于维护:模块化设计,新增控件或布局不影响整体结构。


5. 定制实现思路

  1. 继承 ResourceBundle::Delegate:统一管理皮肤资源。

  2. 自定义 LayoutManager:实现工具栏、侧边栏或弹性布局。

  3. 封装控件:绑定皮肤资源、字体、颜色,实现动态换肤。

  4. 事件处理:覆盖事件处理函数,实现控件交互逻辑。

  5. 刷新机制:利用 SchedulePaint 和 Invalidate,实现动态更新。

  6. 缓存优化:Layer 和控件绘制缓存减少重复绘制。

  7. 可扩展性:支持主题包和多语言资源加载。


6. 实战案例

6.1 自定义工具栏

class ToolbarView : public views::View { public: ToolbarView() { SetLayoutManager(std::make_unique<CustomLayout>()); AddChildView(std::make_unique<SkinButton>()); AddChildView(std::make_unique<SkinButton>()); } }; 

6.2 动态换肤

CustomThemeBundle theme; theme.LoadSkin("dark_theme.zip"); root_view->SchedulePaint(); // 刷新 UI 

6.3 多语言切换

std::u16string title = resource_bundle->GetLocalizedString(IDS_APP_TITLE); label->SetText(title); 

7. 总结

Chrome UI 布局系统通过 View 树 + LayoutManager + ResourceBundle 构建了高性能、可扩展的跨平台 UI 框架。理解其底层机制,有助于:

  • 构建自定义控件和布局。

  • 实现动态皮肤和多语言支持。

  • 优化刷新与渲染性能。

  • 实现类似 Duilib 风格的定制浏览器界面。

通过定制 LayoutManager 和 ResourceBundle,可以实现灵活、高效、可维护的 UI 系统。

C++中的Thunk技术和它的使用场景 阅读详情

相关推荐

Chrome UI 框架分析

主要是对chrome UI的源代码进行分析和相关讲解

chrome的Views概述

Views Overview This document is an overview of Views concepts, terminology, and architecture. 本文档概述了视图、概念、术语和体系结构。 The target audience is engineers using or working on Views. 目标受众是使用或处理视图的工程师. General Things 概述 Points in this document are written as (x,y),

啊渊的专栏 1102

Dify视觉模型节点避坑指南:我用Qwen2.5-VL做OCR识别时踩过的3个坑(及解决方案)

本文分享了使用Dify平台和Qwen2.5-VL视觉模型进行OCR票据识别时遇到的三个常见问题及解决方案,包括文件变量传递、结构化输出和条件分支判断失效。通过实战经验,帮助开发者优化多模态模型在财务自动化中的应用,提升OCR识别精度和效率。

weixin_29284885的博客 401

Chromium GN目标指南 - views_examples简介(五)

Views 是 Chromium 中用于构建用户界面的框架,它提供了一套丰富的控件(Widgets)、布局管理器(Layout Managers)和事件处理机制,用于创建跨平台的、高效的图形用户界面。在后续的文章中,我们将更深入地探讨 Views 框架的各个方面,例如控件、布局、事件处理、主题和样式等,帮助你更好地掌握 Chromium 的 UI 开发技术。运行后,你将看到一个名为 "Views Examples" 的窗口,其中包含了一系列标签页,每个标签页展示了一个或多个 Views 控件的使用示例。

守城小轩的技术窝棚 1718

手把手教你搭建一个属于自己的网站-适合零基础小白,文末附网站模板

手把手教你搭建一个属于自己的网站-适合零基础小白写在前面搭建需求功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 写在前面 前段时间休息想着搭一个属于自己的网站,几经尝试终于成功了,网上其实有很多教程,但很多,希望这篇文章能够帮助到

qq_46788925的博客 1万+

FIFO的工作原理及其设计

FIFO( First Input First Output)简单说就是指先进先出。FIFO存储器是一个先入先出的双口缓冲器,即第一个进入其内的数据第一个被移出,其中一个口是存储器的输入口,另一个口是存储器的输出口。对于单片FIFO来说,主要有两种结构:触发导向结构和零导向传输结构。触发导向传输结构的FIFO是由寄存器阵列构成的,零导向传输结构的FIFO是由具有读和写地址指针的双口RAM构成。FIFO与普通RAM存储器的是没有外部读写地址线(指针),使用方便,但。

Jackiezhang1993的博客 2万+

Chromium 源码学习-----UI界面

简单总结就是:Widget对应着一个原生的窗口,而View对应着窗口里面的一个控件,如容器,Button,Tab等等。这样在Widget和View之上,Chrome搭建起了自己跨平台的皮肤引擎。这点是和Qt是非常相似的。在chromium源码中,负责管理工具栏(红框区域)的类就是负责管理应用菜单按钮的(绿色区域)的类就是负责管理应用菜单按钮的子项(蓝色区域)的类就是后续如果要修改对应的模块,在对应管理该模块的类下进行修改即可。

FBI_BAIGOU的博客 3350

放弃FFT全频计算!在STM32F407上用DFT单点计算提速50%的优化技巧

本文详细介绍了在STM32F407上通过DFT单点计算实现比FFT快50%的优化技巧,特别适用于生物阻抗分析、振动监测等只需关注单一频点的嵌入式场景。通过预计算相位角、查表法和混合精度计算等策略,显著提升计算效率和内存利用率,同时保持高精度。

weixin_28738397的博客 191

Chrome学习笔记(三):UI组件,皮肤引擎

原创文章,转载请注明:转载自Soul Apogee 本文链接地址:Chrome学习笔记(三):UI组件,皮肤引擎 —— 控件库 这篇文章是接着上篇文章继续聊的,Chrome的代码实在太多,每一个东西单拿出来都可以说很很多,单就一个breakpad都说了两篇。恩,不过也许是我太啰嗦了。 1. UI控件库(Control)简介 我们知道Chrome做这一套皮肤引擎是为了替换掉Windows

wanfengnianhua的专栏 1516

Sigrity System SI Parallel Bus Analysis模式进行DDR3仿真分析操作指导-单个颗粒

Default Strobe Offset:DQS默认偏移时间,自动填充为0.5ns,即DQS默认偏移1/2UI,DQS滞后于DQ 1/2UI,让建立保持时间均分。WLO:写平衡偏移的数值,DataL是0ps,DataU是500ps,是根据WLOSkew自动定义的,可以认为是WLOSkew取整,也可以根据需要手动调整数值。注意AddCmd的UI=T,这里的Data Rate仍然是DQ的速率,并不是地址线的速率,地址线的速率=1/UI=1/2ns=0.5Gbps。

weixin_54787054的博客 365

手把手教你学 GPU KMD--1.2:UMD、KMD 与 DDK 的协作关系(下)——权限提升与安全边界

本文探讨了UMD、KMD与DDK协作中的权限提升与安全边界问题。GPU作为强大DMA引擎,必须通过分层权限模型(用户态/内核态)隔离风险,KMD作为守门人对UMD请求进行严格校验。文章详细分析了权限提升路径、安全边界设计(GPU虚拟内存隔离、命令白名单、IOMMU强制隔离等),并列举历史漏洞案例说明安全边界的重要性。现代增强方案包括虚拟化与可信执行环境。核心安全原则是"永远不信任用户态数据",需对所有地址、命令、资源和DMA进行严格管控。

amy_mhd的博客 323

深入解析 Chrome UI 布局配置的设计思想与实现机制

Chrome浏览器UI布局采用参数化与组件化设计,通过Views框架实现跨平台统一管理。核心机制包括:模块化视图组件、动态布局配置(支持实验功能和用户设置)、多平台适配策略(Windows/macOS/Linux差异化处理)。系统采用LayoutManager进行布局计算,优化性能并支持扩展,如通过API添加工具栏按钮。典型案例chrome://settings展示了参数化布局的优势。未来将加强响应式设计、GPU加速和统一主题系统。该架构平衡了功能迭代、跨平台一致性与性能需求。

John_ToStr的博客 1039

第 5 篇:责任链模式 (Chain of Responsibility) —— 协议栈的流水线

本文介绍了责任链模式在嵌入式通信协议解析中的应用。针对传统"面条式"代码维护困难的问题,提出将各协议解析器解耦为独立处理单元,通过链表形式串联。文章详细展示了模式实现:定义抽象处理者接口、实现具体协议处理器、构建链表管理器。该方案具有内存占用低(O(1)栈空间)、可动态扩展、支持优先级调整等优势,并探讨了性能优化策略及动态插件系统等扩展应用,为嵌入式通信协议处理提供了清晰的架构方案。

一路往蓝-Anbo 的博客 176

Chrome学习小记3:基于Chrome Views框架创建最小示例窗口A(从Example分析开始)

这篇文章介绍了如何在Chrome Views框架下创建一个最小示例窗口的详细步骤。作者首先回顾了前一篇关于GN构建系统的内容,然后展示了如何添加新的构建单元并验证其正确性。接着重点分析了Google Chrome使用Views框架创建窗口的流程,包括初始化命令行解析、测试超时设置、COM初始化、Mojo核心初始化、GPU后端设置、国际化支持等关键步骤。文章还提供了简化后的代码流程,帮助读者理解Chrome窗口创建过程中各子系统如何协调工作,为后续开发自定义demo奠定了基础。

charlie114514191的博客 1317

c\c++: Identifiers, modifier, qualifier, specifier, decorator; systemtap

文章目录参考英语含义在c、C++ 参考 c++ 标准 https://blog.youkuaiyun.com/tyronne/article/details/44016621 英语含义 modifier word or phrase that modifies (modify 2) another word or phrase 修饰语. qualifier (grammar) word, esp an adjective or adverb, that qualifies another word 修饰词; (尤指)形

mzhan017的博客 2421

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Flutter页面跳转

Flutter页面跳转 1、创建Flutter app工程,默认的main.dart文件如下: import 'package:flutter/material.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { // This widget is the root of your application. @override Widget build(BuildContex.

博客,是nsacer先森的 490

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

推荐:Chrome UI Bootstrap - 打造优雅的Chrome风格应用

推荐:Chrome UI Bootstrap - 打造优雅的Chrome风格应用 项目介绍 Chrome UI Bootstrap 是一个轻量级的开源项目,致力于让开发者轻松地创建出与Chrome系统应用风格一致的扩展、应用和其他单页面应用。这个项目提供了一套简洁而强大的CSS样式框架,让你的作品在视觉上更加统一和专业。 项目技术分析 该项目的核心在于提取并封装了Chrome UI的设计元素,包括...

gitblog_01062的博客 362

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Chrome学习笔记(二):UI组件,皮肤引擎

原创文章,转载请注明:转载自Soul Apogee 本文链接地址:Chrome学习笔记(二):UI组件,皮肤引擎 —— 基础设施篇 Chrome的UI是很奇妙的,因为看起来能很好的跨平台,而且可以很好的兼容各个平台的特性,比如在Mac下最小化和关闭按钮在左侧,还兼容全屏的特性,在Linux上,也能加载GTK的外框,外加现在Chrome在推的Aura,更是直接接管了桌面合成器。。。这一切

wanfengnianhua的专栏 2729

这款神器你不学就要落后了!

Flutter——谷歌开源的跨平台UI开发框架 Fluter特性介绍 Flutter官网介绍如下: Flutter is Google’s mobile UI framework for crafting high-quality native interfaces on iOS and Android in record time. Flutter works with exis...

风花散却隽世间,雪月寥落化雨田 1704

01-Chrome架构:仅仅打开了1个页面,为什么有4个进程

在开始之前,我们一起看下,Chrome打开一个页面需要启动多少进程?你可以点击Chrome浏览器右上角的“选项”菜单,选择“更多工具”子菜单,点击“任务管理器”,这将打开Chrome的任务管理器的窗口,如下图 和Windows任务管理器一样,Chrome任务管理器也是用来展示运行中Chrome使用的进程信息的。从图中可以看到,Chrome启动了4个进程,你也许会好奇,只是打开了1个页面,为什么要启动这么多进程呢? 在解答这个问题之前,我们需要了解一下进程的概念,不过由于好多人容易把进程和线程的概念混

LIJIWEI0611的博客 625

chrome之view

看了点其他东西,结果发现以前看的chrome代码有些忘了,看来写博客确实是好事,能帮助人很容易的回忆起来 chrome的是基于wtl的,他的view类比较庞大,具体的子类又分为native和customnative就是windows的自有空间,比如button,custom的就是directui了,界面里划分出不同的区域,区域显示出类似button的效果以radiobutton为例

tompaz的专栏 3795

Chrome UI学习—主界面以及组件分布2

Browser* StartupBrowserCreatorImpl::OpenTabsInBrowser(Browser* browser, bool process_startup, ...

weixin_37972910的博客 984

2018几大主流的UI/JS框架——前端框架

2016年开始应该是互联网飞速发展的几年,同时也是Web前端开发非常火爆的一年,Web 前端技术发展速度让人感觉几乎不是继承式的迭代,而是一次次的变革和创造。这一年中有很多热门的前端开发框架,下面源码时代web小编为大家总结2016年至今最受欢迎的几款前端框架。 在这互联网飞速发展的信息时代,技术的更新迭代也在加快。目前看来,火了十几年的Java技术现在仍然是棵常青树。回想两年前初来咋到,也是想...

SuperMan程序人生(关注微信公众号) 26万+

贪心算法——最大整数问题详解

贪心算法——最大整数问题详解: [最大整数]设有n个正整数,将它们连接成一排,组成一个最大的多位整数。 例如:n=3时,3个整数13,312,343,连成的最大整数为34331213。 又如:n=4时,4个整数7,13,4,246,连成的最大整数为7424613。 输入:n N个数 输出:连成的多位数 算法分析:此题很容易想到使用贪心法,在考试时有很多

John_ToStr的博客 7773

Windows Hook案例分析与技术探索

Hook是Windows中提供的一种用以替换DOS下“中断“的系统机制,中文译为“挂钩”或“钩子”。在对 特定的系统事件进行Hook后,一旦发生已Hook事件,对该事件进行Hook的程序就会收到系统的通知, 这时程序就能在第一时间对该事件做出响应。 钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有 到达目的程序前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理 (改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。..

John_ToStr的博客 7128

浏览器无痕模式机制解析:它与正常模式究竟有何不同?

在日常浏览网页时,很多用户会注意到浏览器提供了“无痕模式”、“隐私窗口”或“InPrivate模式”等选项。这个功能常常被认为是“匿名上网”,但从技术实现角度来看,无痕模式到底和普通浏览模式有什么不同?它真的能完全不留痕迹吗?又有哪些场景下开发者要注意两种模式的行为差异? 本文将从浏览器实现机制出发,系统地讲解无痕模式的原理、与普通模式的区别、以及它在开发调试中的表现差异和典型使用场景。

John_ToStr的博客 6027
上一篇: 内存踩坏、堆栈帧破坏与WinDbg调试:一场Windows底层的猎凶之旅
下一篇: 定制 ResourceBundle 的实现与 DuiLib 思想在 Chromium 架构下的应用解析
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ปรัชญา แค้วคำมูล

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值