<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>masterLazy Blog</title>
        <link>https://masterLazy.github.io/blog</link>
        <description>masterLazy Blog</description>
        <lastBuildDate>Tue, 25 Aug 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>zh-Hans</language>
        <copyright>Copyright © 2026 masterLazy</copyright>
        <item>
            <title><![CDATA[2026 年的一点博客心得]]></title>
            <link>https://masterLazy.github.io/blog/2026/08/25/2026年的一点博客心得</link>
            <guid>https://masterLazy.github.io/blog/2026/08/25/2026年的一点博客心得</guid>
            <pubDate>Tue, 25 Aug 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[转眼这个赛博笔记本都上线一年多了。说是赛博笔记本，其实作用差不多就是一个博客吧。从今天开始，我把 Docusaurus 的 blog 打开了，真的变成半个博客了。]]></description>
            <content:encoded><![CDATA[<p>转眼这个赛博笔记本都上线一年多了。说是赛博笔记本，其实作用差不多就是一个博客吧。从今天开始，我把 Docusaurus 的 blog 打开了，真的变成半个博客了。</p>
<p>想想还真是特别。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="为什么写博客">为什么写博客<a href="https://masterlazy.github.io/blog/2026/08/25/2026%E5%B9%B4%E7%9A%84%E4%B8%80%E7%82%B9%E5%8D%9A%E5%AE%A2%E5%BF%83%E5%BE%97#%E4%B8%BA%E4%BB%80%E4%B9%88%E5%86%99%E5%8D%9A%E5%AE%A2" class="hash-link" aria-label="为什么写博客的直接链接" title="为什么写博客的直接链接" translate="no">​</a></h2>
<p>理由很简单，就像之前我写在博客园的那样：</p>
<blockquote>
<ul>
<li class="">有的东西看完就忘了，得记笔记。</li>
<li class="">觉得好像没找到关于某事物很好的介绍文字，遂自己写。</li>
</ul>
</blockquote>
<p>现在看来，还有一点，就是在信息海洋中提炼一点精华。虽然这点精华估计都要被喂给 AI 了吧，但是确实是自己的一点小天地，这里的文章都是可靠、精心编写的。</p>
<blockquote>
<p>还有一点，就是当时 OI 要写题解，但是洛谷题解区一般都关了，洛谷博客也不是很好看，所以打算把题解之类的当博客写。</p>
</blockquote>
<p>所以就开始有写博客的念头了。起初用的就是博客园。它老牌，可靠，有很多成熟的美化方案，而且免费使用，少量广告。不用自建站，国内访问快。</p>
<p>那为什么后来又不用了呢？</p>
<p>原因有两点。其一，虽然确实有非常成熟的美化方案（awescnb，现在改名 <a href="https://github.com/guangzan/tona" target="_blank" rel="noopener noreferrer" class="">tona</a> 了，我还 fork 过这个仓库来着），但是嘛，总感觉不是特别对我的审美。<del>博客不好看怎么会有动力写呢。</del> 当时有过一个念头，就是自己打造一个好看的皮肤。后来放弃了，不是我的菜。。</p>
<p>其二，网络上有很多神奇的爬虫，整天爬爬爬，我文章刚发出来几十秒就被爬了，比如：<a href="http://www.jsqmd.com/news/4789/" target="_blank" rel="noopener noreferrer" class="">程序杂谈：概述-编程学习网</a>、<a href="http://www.jsqmd.com/news/6598/" target="_blank" rel="noopener noreferrer" class="">C++ GUI 选型记-编程学习网</a>，我真服了。</p>
<p>所以才自己建站，有了 mNotebook。</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="一路走来的-mnotebook">一路走来的 mNotebook<a href="https://masterlazy.github.io/blog/2026/08/25/2026%E5%B9%B4%E7%9A%84%E4%B8%80%E7%82%B9%E5%8D%9A%E5%AE%A2%E5%BF%83%E5%BE%97#%E4%B8%80%E8%B7%AF%E8%B5%B0%E6%9D%A5%E7%9A%84-mnotebook" class="hash-link" aria-label="一路走来的 mNotebook的直接链接" title="一路走来的 mNotebook的直接链接" translate="no">​</a></h2>
<p>我的博客用的是 Docusaurus<sup><a href="https://masterlazy.github.io/blog/2026/08/25/2026%E5%B9%B4%E7%9A%84%E4%B8%80%E7%82%B9%E5%8D%9A%E5%AE%A2%E5%BF%83%E5%BE%97#user-content-fn-1-c004f0" id="user-content-fnref-1-c004f0" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">1</a></sup>，这个选型好像比较少见。 Docusaurus 似乎比较常用于做技术文档之类的吧。选 Docusaurus 是因为开发这个的公司是 Facebook 母公司，比较靠谱，感觉会长期支持。</p>
<p>初看 Docusaurus，外观是不太好的。但是 Docusaurus 基于 React，React 就很有可玩性了。参看 <a class="" href="https://masterlazy.github.io/docs/jot/mnotebook">关于 mNotebook</a>，有很大的自定义空间。所以才有了你现在看到的 mNotebook 的样子，我觉得是非常养眼的。当时我刚刚学会给 Docusaurus 写自定义组件时，开心坏了，<del>整了一大堆花里胡哨的组件</del>。后来稍微收敛一点了。毕竟笔记 / 博客这东西，还是内容大于形式的。况且用了一堆 Markdown 之外的东西，如果未来要迁移什么的，很麻烦啊。</p>
<hr>
<p>我曾经很想把我的笔记都数字化，但是一直都不是很有动力。</p>
<p>一方面是做数字笔记虽然美观、好编辑，但是输入比较麻烦。像这样纯文本的文章还好，如果要穿插插图、公式之类（比如数学笔记），就很麻烦了。纸上做笔记更直接，更快。</p>
<p>另一方面，就是一直盯着屏幕眼睛会很累，也就是数字笔记不太适合长时间阅读。不过这个问题我现在解决了，受 Martial Design 3 启发，我现在把背景从纯白改成了这样的极浅色，会好一点。（还有一点，就是文章的宽度不要太宽，否则眼睛扫视会比较累。这些都是细节，初建站都没有注意到。）</p>
<p>我之前还有一个毛病，就是笔记嵌套很多，比如：计算机科学 / 原生技术栈 / .NET 生态 / WPF，太深了！现在我决定最多嵌套三层，且把分类放粗一点，比如把“原生技术栈”和“Web 技术栈”合并成“软件工程”。如果以后笔记确实很多，再分开。</p>
<hr>
<p>总之，现在的 mNotebook，越来越接近我心目中的理想样子了。</p>
<p>但还是有点缺陷的。比如我现在编辑笔记，就要先启动 <code>yarn start</code>，然后创建 <code>.md</code>，在 Typora 中打开，再挂个浏览器，实时看效果。这么看来，要敲笔记还是比较繁琐。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="遇到的优秀博客">遇到的优秀博客<a href="https://masterlazy.github.io/blog/2026/08/25/2026%E5%B9%B4%E7%9A%84%E4%B8%80%E7%82%B9%E5%8D%9A%E5%AE%A2%E5%BF%83%E5%BE%97#%E9%81%87%E5%88%B0%E7%9A%84%E4%BC%98%E7%A7%80%E5%8D%9A%E5%AE%A2" class="hash-link" aria-label="遇到的优秀博客的直接链接" title="遇到的优秀博客的直接链接" translate="no">​</a></h2>
<p>网上冲浪，看到的有些博客确实很惊艳，浅浅收录到下面，可供日后借鉴。</p>
<blockquote>
<p>网络很大，每个人的博客感觉都像互联网的角落，可遇不可求啊。比如读到这些文字的，估计只有我自己吧。</p>
</blockquote>
<ul>
<li class=""><a href="https://chai.ac.cn/" target="_blank" rel="noopener noreferrer" class="">柴扉 | CHAI</a>：很精致的博客，看出来博主也很用心地打造了博客系统。不过好像目前内容不多。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="写在后面">写在后面<a href="https://masterlazy.github.io/blog/2026/08/25/2026%E5%B9%B4%E7%9A%84%E4%B8%80%E7%82%B9%E5%8D%9A%E5%AE%A2%E5%BF%83%E5%BE%97#%E5%86%99%E5%9C%A8%E5%90%8E%E9%9D%A2" class="hash-link" aria-label="写在后面的直接链接" title="写在后面的直接链接" translate="no">​</a></h2>
<p>从今天开始，我也在这个小站上写博客了。相比于那些放在 <code>docs/</code> 下的笔记，博客可能没有那么精致，也不用那么多花里胡哨的组件了。</p>
<p>我还搬了一些之前写的，现在看来算作博客的文章到这里。</p>
<br>
<!-- -->
<section data-footnotes="true" class="footnotes"><h2 class="anchor anchorTargetStickyNavbar_Vzrq sr-only" id="footnote-label">Footnotes<a href="https://masterlazy.github.io/blog/2026/08/25/2026%E5%B9%B4%E7%9A%84%E4%B8%80%E7%82%B9%E5%8D%9A%E5%AE%A2%E5%BF%83%E5%BE%97#footnote-label" class="hash-link" aria-label="Footnotes的直接链接" title="Footnotes的直接链接" translate="no">​</a></h2>
<ol>
<li class="anchorTargetStickyNavbar_Vzrq" id="user-content-fn-1-c004f0">
<p>笔者打了这个词无数遍，<del>做梦都能拼对</del> <a href="https://masterlazy.github.io/blog/2026/08/25/2026%E5%B9%B4%E7%9A%84%E4%B8%80%E7%82%B9%E5%8D%9A%E5%AE%A2%E5%BF%83%E5%BE%97#user-content-fnref-1-c004f0" data-footnote-backref="" aria-label="Back to reference 1" class="data-footnote-backref">↩</a></p>
</li>
</ol>
</section>]]></content:encoded>
            <category> 碎碎念 </category>
        </item>
        <item>
            <title><![CDATA[C# vs Java]]></title>
            <link>https://masterLazy.github.io/blog/2026/08/20/</link>
            <guid>https://masterLazy.github.io/blog/2026/08/20/</guid>
            <pubDate>Thu, 20 Aug 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Java 和 C# 真是有非常微妙的差异。]]></description>
            <content:encoded><![CDATA[<p>Java 和 C# 真是有非常微妙的差异。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="c-到-java">C# 到 Java<a href="https://masterlazy.github.io/blog/2026/08/20/#c-%E5%88%B0-java" class="hash-link" aria-label="C# 到 Java的直接链接" title="C# 到 Java的直接链接" translate="no">​</a></h3>
<p>前段时间因为要写 mod，又开始写 Java。从 C# 到 Java 的感受，就是那些语法糖全没了，比如 <code>new()</code> 这种，搞个异步就得用 <code>Future&lt;&gt;</code> 之类，代码风格也不太适应。还有就是Java 的一些历史包袱，导致一些地方不如 C# 那么简洁（比如 <code>List.of()</code> 这种东西）。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="java-到-c">Java 到 C#<a href="https://masterlazy.github.io/blog/2026/08/20/#java-%E5%88%B0-c" class="hash-link" aria-label="Java 到 C#的直接链接" title="Java 到 C#的直接链接" translate="no">​</a></h3>
<p>写了两周 Java，今天写回 C#，又感到不适应。首先是编辑器的不适应。VS 是远远没有IDEA精致好用的。就比如 IDEA 提示“可将字段设为readonly”，光标移过去就可以点“设为readonly”，VS 不知道为什么就没有。VS 的自动补全有时候会比较烦人，本来想缩进，按一下 tab 给我补全出来一坨。</p>
<p>其次就是语法不习惯。比如 C# 有属性，Java 没有，只能写 getter/setter。虽然写getter/setter有点烦人，但是它也强迫你尽量封装，不要暴露太多细节。而c#有了属性，感觉就少了点“限制”。还有 C# 允许运算符重载，有时候就会有点懵。这就是所谓设计哲学的差异吧。代码风格也是，当时入门 C# 就搞不懂为什么 C# 的方法要用大驼峰，非得跟 Java 和其他语言对着干似的。</p>
<hr>
<p>总之感觉 Java 虽然历史包袱有点沉，但是设计似乎比较优雅；C# 固然简洁，但也有点接近 C++，有种奇怪的语法丰富但是容易写成史山的感觉。</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[谈谈「语言硅基化」]]></title>
            <link>https://masterLazy.github.io/blog/2026/02/13/</link>
            <guid>https://masterLazy.github.io/blog/2026/02/13/</guid>
            <pubDate>Fri, 13 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[「语言硅基化」？在我看来，背后的操盘手还是人类自己。]]></description>
            <content:encoded><![CDATA[<p>「语言硅基化」？在我看来，背后的操盘手还是人类自己。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="ai-味来自哪里">AI 味来自哪里<a href="https://masterlazy.github.io/blog/2026/02/13/#ai-%E5%91%B3%E6%9D%A5%E8%87%AA%E5%93%AA%E9%87%8C" class="hash-link" aria-label="AI 味来自哪里的直接链接" title="AI 味来自哪里的直接链接" translate="no">​</a></h3>
<p>目前大多数LLM采用的是GPT架构，这是一种序列到序列的自回归模型。如很多人所知，序列的基本元素为「token」。一般来说，其训练有两个步骤。</p>
<p>第一步是预训练，其核心优化（或者说训练）的核心目标是「最大似然估计」，即模型的「输出分布」要尽可能吻合「真实分布」。所谓真实分布，就是研究者采集的数据的分布。数学上，大概是用KL散度或交叉熵来衡量二者的差异。</p>
<p>所以，在经过预训练后，模型的输出分布会接近真实分布，但受技术和训练方法所限，会有一定误差。然而，这个误差应该是随机的，不应该表现定向的差异。而现在说的「人机味」明显是有定向指向的，而非随机的产物。</p>
<p>定向的「偏移」应该来自于「基于人类反馈的强化学习」（RLHF）。这个过程目标是「对齐」，即让模型的输出「迎合」人类预期。比如，「人类」更喜欢严谨、客观的回答，而不是像海量训练数据那样参差不齐的回答。</p>
<p>而正是这个过程让模型输出的文本与人类语言有了可感知的「偏移」，即人机味。本质上，这也算是最大化满足人类期望的产物。这是人机味的第一推手。</p>
<!-- -->
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="ai-为何可以影响语言">AI 为何可以影响语言<a href="https://masterlazy.github.io/blog/2026/02/13/#ai-%E4%B8%BA%E4%BD%95%E5%8F%AF%E4%BB%A5%E5%BD%B1%E5%93%8D%E8%AF%AD%E8%A8%80" class="hash-link" aria-label="AI 为何可以影响语言的直接链接" title="AI 为何可以影响语言的直接链接" translate="no">​</a></h3>
<p>人机味的第二推手，源于AI生成的效率。AI生产文本的速度明显大于人类，于是在公开数据中，AI生产内容的占比会快速上升。事实上在未来的某个时刻，AI写下的句子将超过有史以来所以人类写下的。（谁知道现在没有呢？）AI内容占比的上升，相当于一次「源头投毒」。新AI接受预训练时，其「样本分布」就已经不是人类语言的「真实分布」了。这是一个不可逆的正反馈机制，只会让AI味越来越浓。</p>
<p>再加上AI实在太方便了，不借助AI的「纯人类」内容的生产速度还会下降。</p>
<hr>
<p>「人机味」的泛滥，已经是大势所趋。</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[C++ GUI 选型记]]></title>
            <link>https://masterLazy.github.io/blog/2025/09/30/cppgui选型记</link>
            <guid>https://masterLazy.github.io/blog/2025/09/30/cppgui选型记</guid>
            <pubDate>Tue, 30 Sep 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[若干年前，我入门了 C++，写了一个控制台贪吃蛇，觉得自己逐渐理解一切……]]></description>
            <content:encoded><![CDATA[<p>若干年前，我入门了 C++，写了一个控制台贪吃蛇，觉得自己逐渐理解一切……</p>
<p>“我想创建 GUI！” 于是漫长的选型过程开始了。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="概念">概念<a href="https://masterlazy.github.io/blog/2025/09/30/cppgui%E9%80%89%E5%9E%8B%E8%AE%B0#%E6%A6%82%E5%BF%B5" class="hash-link" aria-label="概念的直接链接" title="概念的直接链接" translate="no">​</a></h3>
<p>还是有必要阐释一下这几个概念：</p>
<ul>
<li class="">GUI：图形用户界面，其实是很宽泛的概念，图形化的程序界面都算。</li>
<li class="">UI：用户界面，我觉得更强调 “和用户交互”，比如一个按钮、一个输入框等。</li>
<li class="">绘图库：只提供绘制（或者图形渲染服务），你可以用它画一个三角形、矩形，可以显示图片，但是做 UI 有点难。</li>
<li class="">UI 库：提供 UI 功能，一方面是不需要自己画按钮，另一方面是提供事件处理等服务。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="easyx">EasyX<a href="https://masterlazy.github.io/blog/2025/09/30/cppgui%E9%80%89%E5%9E%8B%E8%AE%B0#easyx" class="hash-link" aria-label="EasyX的直接链接" title="EasyX的直接链接" translate="no">​</a></h2>
<p>我第一个用的是 EasyX，当时用它写了蛮多程序的。</p>
<!-- -->
<p>主页：<a href="https://easyx.cn/" target="_blank" rel="noopener noreferrer" class="">EasyX Graphics Library for C++</a></p>
<p>文档：<a href="https://docs.easyx.cn/zh-cn/intro" target="_blank" rel="noopener noreferrer" class="">EasyX 文档 - 基本说明</a></p>
<p><img decoding="async" loading="lazy" src="https://easyx.cn/f/a/0/0/6/setup-vc2010-4.1.png" alt="" class="img_ev3q"></p>
<p>EasyX 是一个绘图库，这意味着它是没有 UI 功能的。但是 EasyX 非常简单！如果你是刚学会 <code>printf()</code> 或者 <code>cout &lt;&lt;</code> 的初学者，你一定会觉得上手 EasyX 很轻松。就看这个例子吧：</p>
<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token comment" style="color:hsl(230, 4%, 64%)">// 自 https://www.luogu.com.cn/article/9eazh2lm，略有修改</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token macro property directive-hash" style="color:hsl(5, 74%, 59%)">#</span><span class="token macro property directive keyword" style="color:hsl(301, 63%, 40%)">include</span><span class="token macro property" style="color:hsl(5, 74%, 59%)"> </span><span class="token macro property string" style="color:hsl(119, 34%, 47%)">&lt;easyx.h&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">int</span><span class="token plain"> </span><span class="token function" style="color:hsl(221, 87%, 60%)">main</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token function" style="color:hsl(221, 87%, 60%)">initgraph</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token number" style="color:hsl(35, 99%, 36%)">480</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token number" style="color:hsl(35, 99%, 36%)">600</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"> </span><span class="token comment" style="color:hsl(230, 4%, 64%)">// 初始化窗口</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token function" style="color:hsl(221, 87%, 60%)">setlinecolor</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">WHITE</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token function" style="color:hsl(221, 87%, 60%)">setfillcolor</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">RED</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token function" style="color:hsl(221, 87%, 60%)">fillrectangle</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token number" style="color:hsl(35, 99%, 36%)">150</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> </span><span class="token number" style="color:hsl(35, 99%, 36%)">60</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> </span><span class="token number" style="color:hsl(35, 99%, 36%)">200</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> </span><span class="token number" style="color:hsl(35, 99%, 36%)">85</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"> </span><span class="token comment" style="color:hsl(230, 4%, 64%)">// 画一个矩形</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token function" style="color:hsl(221, 87%, 60%)">Sleep</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token number" style="color:hsl(35, 99%, 36%)">5000</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token function" style="color:hsl(221, 87%, 60%)">closegraph</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"> </span><span class="token comment" style="color:hsl(230, 4%, 64%)">// 关闭窗口</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">return</span><span class="token plain"> </span><span class="token number" style="color:hsl(35, 99%, 36%)">0</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><br></div></code></pre></div></div>
<p>我曾用 EasyX 写过蛮多程序的，如今仅仅是注视着这些程序的名字，就令我十分怀念：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">贝塞尔曲线、单摆、单摆2、物理-粒子撞圆柱阵、五子棋、樱花树</span><br></div></code></pre></div></div>
<p>当时我甚至用 EasyX 写了一个小小的、简陋的 UT 同人小游戏，可惜现在找不到了。</p>
<p>EasyX 默认是没有抗锯齿的，需要自己实现。</p>
<p>EasyX 带来了无尽的绘图的乐趣。但是没有 UI 功能，和用户的交互很有限。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="windows-api">Windows API<a href="https://masterlazy.github.io/blog/2025/09/30/cppgui%E9%80%89%E5%9E%8B%E8%AE%B0#windows-api" class="hash-link" aria-label="Windows API的直接链接" title="Windows API的直接链接" translate="no">​</a></h2>
<p>事实上直接使用 Windows API 做 GUI 是很折磨且不明智的。</p>
<p>当时我看的教程：<a href="https://www.bilibili.com/video/BV1us411A7UE/" target="_blank" rel="noopener noreferrer" class="">【SDK开发】《Windows程序设计》</a></p>
<blockquote>
<p>你可能注意到了，那个视频讲的是 “Windows SDK”。两者的区别比较微妙，我这里想强调我直接使用那些 API 接口来编程，所以写的是 Windows API。</p>
</blockquote>
<p>确实，你可以用 Windows API 来创建窗口、控件。虽然自己写一遍窗口过程挺折磨的（实际上原本开发 GUI 不需要管这么多底层过程的）。这里放一段创建控件的代码，我们鉴赏一下：</p>
<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token comment" style="color:hsl(230, 4%, 64%)">// 创建轨道条</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">hTrackbar</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">[</span><span class="token number" style="color:hsl(35, 99%, 36%)">0</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">]</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token function" style="color:hsl(221, 87%, 60%)">CreateWindow</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">TRACKBAR_CLASS</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    L</span><span class="token string" style="color:hsl(119, 34%, 47%)">""</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    WS_CHILD </span><span class="token operator" style="color:hsl(221, 87%, 60%)">|</span><span class="token plain"> WS_VISIBLE </span><span class="token operator" style="color:hsl(221, 87%, 60%)">|</span><span class="token plain"> TBS_NOTICKS</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token number" style="color:hsl(35, 99%, 36%)">0</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> </span><span class="token number" style="color:hsl(35, 99%, 36%)">0</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> </span><span class="token number" style="color:hsl(35, 99%, 36%)">0</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> </span><span class="token number" style="color:hsl(35, 99%, 36%)">0</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    hWnd</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">HMENU</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token number" style="color:hsl(35, 99%, 36%)">4</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token constant" style="color:hsl(35, 99%, 36%)">NULL</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> </span><span class="token constant" style="color:hsl(35, 99%, 36%)">NULL</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token comment" style="color:hsl(230, 4%, 64%)">// 设置</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token function" style="color:hsl(221, 87%, 60%)">SendMessage</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">hTrackbar</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">[</span><span class="token number" style="color:hsl(35, 99%, 36%)">0</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">]</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> TBM_SETRANGEMIN</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> </span><span class="token boolean" style="color:hsl(35, 99%, 36%)">true</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> </span><span class="token number" style="color:hsl(35, 99%, 36%)">0.5</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">*</span><span class="token plain"> </span><span class="token number" style="color:hsl(35, 99%, 36%)">2</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"> </span><span class="token comment" style="color:hsl(230, 4%, 64%)">// 设置最小值</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token function" style="color:hsl(221, 87%, 60%)">SendMessage</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">hTrackbar</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">[</span><span class="token number" style="color:hsl(35, 99%, 36%)">0</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">]</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> TBM_SETRANGEMAX</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> </span><span class="token boolean" style="color:hsl(35, 99%, 36%)">true</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> </span><span class="token number" style="color:hsl(35, 99%, 36%)">150</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">*</span><span class="token plain"> </span><span class="token number" style="color:hsl(35, 99%, 36%)">2</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"> </span><span class="token comment" style="color:hsl(230, 4%, 64%)">// 设置最大值</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token function" style="color:hsl(221, 87%, 60%)">SendMessage</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token plain">hTrackbar</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">[</span><span class="token number" style="color:hsl(35, 99%, 36%)">0</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">]</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> TBM_SETPOS</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> </span><span class="token boolean" style="color:hsl(35, 99%, 36%)">true</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> </span><span class="token number" style="color:hsl(35, 99%, 36%)">1</span><span class="token plain"> </span><span class="token operator" style="color:hsl(221, 87%, 60%)">*</span><span class="token plain"> </span><span class="token number" style="color:hsl(35, 99%, 36%)">2</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"> </span><span class="token comment" style="color:hsl(230, 4%, 64%)">// 设置默认值</span><br></div></code></pre></div></div>
<p>可以看到，我为了设置这个轨道条的属性，还要手动发送消息，现在看来真是十分繁琐。可就是这么繁琐的实现方法，我也用了一段时间，写了几个程序。</p>
<p>比如这个：<a href="https://www.bilibili.com/video/BV1YQ4y1Q78m/" target="_blank" rel="noopener noreferrer" class="">自制程序-八种排序的可视化</a>（上面的代码片段就摘自这个程序）</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="gdi-和-gdi">GDI (和 GDI+)<a href="https://masterlazy.github.io/blog/2025/09/30/cppgui%E9%80%89%E5%9E%8B%E8%AE%B0#gdi-%E5%92%8C-gdi" class="hash-link" aria-label="GDI (和 GDI+)的直接链接" title="GDI (和 GDI+)的直接链接" translate="no">​</a></h3>
<p>Windows API 提供的绘图功能实际上叫做 GDI（Graphics Device Interface，图形设备接口）。</p>
<p>GDI 是 “历史悠久” 的图形组件，事实上已经过时了。GDI 也没有抗锯齿。而且其十分低级，比如需要自己实现 “双缓冲机制”。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="direct2d">Direct2D<a href="https://masterlazy.github.io/blog/2025/09/30/cppgui%E9%80%89%E5%9E%8B%E8%AE%B0#direct2d" class="hash-link" aria-label="Direct2D的直接链接" title="Direct2D的直接链接" translate="no">​</a></h2>
<p>Direct2D 是一个绘图库，没有 UI 功能。但如果你使用 Visual C++，可以把它和 Windows API 搭配使用。Direct2D 的绘图更加强大，抗锯齿什么的自然不在话下。（当然比 GDI 强）</p>
<p>当时我看的教程：<a href="https://www.bilibili.com/video/BV125411V74f/" target="_blank" rel="noopener noreferrer" class="">Direct2D Tutorial</a>（是的这个是英文的，当时我居然看得下去）</p>
<p>直接用 Direct2D 的 API 还绘图显然也不太方便。当时我跟着那个教程搭建了一个自己的包装，像是这样：</p>
<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token keyword" style="color:hsl(301, 63%, 40%)">class</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(35, 99%, 36%)">Graphics</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">private</span><span class="token operator" style="color:hsl(221, 87%, 60%)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">	ID2D1Factory</span><span class="token operator" style="color:hsl(221, 87%, 60%)">*</span><span class="token plain"> pFactory</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain">				</span><span class="token comment" style="color:hsl(230, 4%, 64%)">// Direct2D的接口</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">	IDWriteFactory</span><span class="token operator" style="color:hsl(221, 87%, 60%)">*</span><span class="token plain"> pWriteFactory</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain">		</span><span class="token comment" style="color:hsl(230, 4%, 64%)">// DirectWrite的接口</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">	ID2D1RenderTarget</span><span class="token operator" style="color:hsl(221, 87%, 60%)">*</span><span class="token plain"> pRenderTarget</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain">	</span><span class="token comment" style="color:hsl(230, 4%, 64%)">// 渲染目标</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token comment" style="color:hsl(230, 4%, 64%)">// ...</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token operator" style="color:hsl(221, 87%, 60%)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">void</span><span class="token plain"> </span><span class="token function" style="color:hsl(221, 87%, 60%)">draw_line</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token keyword" style="color:hsl(301, 63%, 40%)">float</span><span class="token plain"> x1</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">float</span><span class="token plain"> y1</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">float</span><span class="token plain"> x2</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">float</span><span class="token plain"> y2</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> Brush_t</span><span class="token operator" style="color:hsl(221, 87%, 60%)">*</span><span class="token plain"> brush</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">float</span><span class="token plain"> lineWidth </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token number" style="color:hsl(35, 99%, 36%)">1</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token comment" style="color:hsl(230, 4%, 64%)">// 绘制矩形</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">void</span><span class="token plain"> </span><span class="token function" style="color:hsl(221, 87%, 60%)">draw_rectangle</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token keyword" style="color:hsl(301, 63%, 40%)">float</span><span class="token plain"> left</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">float</span><span class="token plain"> top</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">float</span><span class="token plain"> right</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">float</span><span class="token plain"> bottom</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> Brush_t</span><span class="token operator" style="color:hsl(221, 87%, 60%)">*</span><span class="token plain"> brush</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">float</span><span class="token plain"> lineWidth </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token number" style="color:hsl(35, 99%, 36%)">1</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">void</span><span class="token plain"> </span><span class="token function" style="color:hsl(221, 87%, 60%)">fill_rectangle</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token keyword" style="color:hsl(301, 63%, 40%)">float</span><span class="token plain"> left</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">float</span><span class="token plain"> top</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">float</span><span class="token plain"> right</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">float</span><span class="token plain"> bottom</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> Brush_t</span><span class="token operator" style="color:hsl(221, 87%, 60%)">*</span><span class="token plain"> brush</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token comment" style="color:hsl(230, 4%, 64%)">// 绘制圆角矩形</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">void</span><span class="token plain"> </span><span class="token function" style="color:hsl(221, 87%, 60%)">draw_r_rectangle</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token keyword" style="color:hsl(301, 63%, 40%)">float</span><span class="token plain"> left</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">float</span><span class="token plain"> top</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">float</span><span class="token plain"> right</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">float</span><span class="token plain"> bottom</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">float</span><span class="token plain"> r</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> Brush_t</span><span class="token operator" style="color:hsl(221, 87%, 60%)">*</span><span class="token plain"> brush</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">float</span><span class="token plain"> lineWidth </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token number" style="color:hsl(35, 99%, 36%)">1</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">void</span><span class="token plain"> </span><span class="token function" style="color:hsl(221, 87%, 60%)">fill_r_rectangle</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token keyword" style="color:hsl(301, 63%, 40%)">float</span><span class="token plain"> left</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">float</span><span class="token plain"> top</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">float</span><span class="token plain"> right</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">float</span><span class="token plain"> bottom</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">float</span><span class="token plain"> r</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> Brush_t</span><span class="token operator" style="color:hsl(221, 87%, 60%)">*</span><span class="token plain"> brush</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token comment" style="color:hsl(230, 4%, 64%)">// 绘制椭圆</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">void</span><span class="token plain"> </span><span class="token function" style="color:hsl(221, 87%, 60%)">draw_ellipse</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token keyword" style="color:hsl(301, 63%, 40%)">float</span><span class="token plain"> x</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">float</span><span class="token plain"> y</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">float</span><span class="token plain"> width</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">float</span><span class="token plain"> height</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> Brush_t</span><span class="token operator" style="color:hsl(221, 87%, 60%)">*</span><span class="token plain"> brush</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">float</span><span class="token plain"> lineWidth </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token number" style="color:hsl(35, 99%, 36%)">1</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">void</span><span class="token plain"> </span><span class="token function" style="color:hsl(221, 87%, 60%)">fill_ellipse</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token keyword" style="color:hsl(301, 63%, 40%)">float</span><span class="token plain"> x</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">float</span><span class="token plain"> y</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">float</span><span class="token plain"> width</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">float</span><span class="token plain"> height</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> Brush_t</span><span class="token operator" style="color:hsl(221, 87%, 60%)">*</span><span class="token plain"> brush</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token comment" style="color:hsl(230, 4%, 64%)">// 绘制正圆</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">void</span><span class="token plain"> </span><span class="token function" style="color:hsl(221, 87%, 60%)">draw_circle</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token keyword" style="color:hsl(301, 63%, 40%)">float</span><span class="token plain"> x</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">float</span><span class="token plain"> y</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">float</span><span class="token plain"> r</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> Brush_t</span><span class="token operator" style="color:hsl(221, 87%, 60%)">*</span><span class="token plain"> brush</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">float</span><span class="token plain"> lineWidth </span><span class="token operator" style="color:hsl(221, 87%, 60%)">=</span><span class="token plain"> </span><span class="token number" style="color:hsl(35, 99%, 36%)">1</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">void</span><span class="token plain"> </span><span class="token function" style="color:hsl(221, 87%, 60%)">fill_circle</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">(</span><span class="token keyword" style="color:hsl(301, 63%, 40%)">float</span><span class="token plain"> x</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">float</span><span class="token plain"> y</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">float</span><span class="token plain"> r</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">,</span><span class="token plain"> Brush_t</span><span class="token operator" style="color:hsl(221, 87%, 60%)">*</span><span class="token plain"> brush</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">)</span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token comment" style="color:hsl(230, 4%, 64%)">// ...</span><span class="token plain"></span><br></div><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(119, 34%, 47%)">}</span><br></div></code></pre></div></div>
<p>实际上，当时我基本上是按照 EasyX 的方式来封装这些接口。基于我自己封装的接口，我也写了几个程序：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:hsl(230, 8%, 24%)"><span class="token plain">三体问题渐进解、手写数字识别（搭配 TensorFlow）、探索复平面</span><br></div></code></pre></div></div>
<p>我记得我还尝试过用 Direct2D 重写我的 “五子棋” 程序，不过好像没有做完。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="openglglfw">OpenGL（GLFW）<a href="https://masterlazy.github.io/blog/2025/09/30/cppgui%E9%80%89%E5%9E%8B%E8%AE%B0#openglglfw" class="hash-link" aria-label="OpenGL（GLFW）的直接链接" title="OpenGL（GLFW）的直接链接" translate="no">​</a></h2>
<p>我尝试过学习这个，想学的原因是跨平台。可是没学会，也许是因为太复杂了吧。</p>
<p>OpenGL 也是绘图库，仍然没有 UI 功能。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="mfc">MFC<a href="https://masterlazy.github.io/blog/2025/09/30/cppgui%E9%80%89%E5%9E%8B%E8%AE%B0#mfc" class="hash-link" aria-label="MFC的直接链接" title="MFC的直接链接" translate="no">​</a></h2>
<p>当时在学 Windows API 的时候就注意到 MFC 了。我没有用 MFC 构建过什么程序，基本上。</p>
<p>事实上，MFC 是蛮旧的框架了，并不适合开发新的软件。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="qt">Qt<a href="https://masterlazy.github.io/blog/2025/09/30/cppgui%E9%80%89%E5%9E%8B%E8%AE%B0#qt" class="hash-link" aria-label="Qt的直接链接" title="Qt的直接链接" translate="no">​</a></h2>
<p>大名鼎鼎的 Qt，我光是安装就费了半天，因为 SDK 很大。Qt 有自己的 Qt Creator，但是我当时用不惯。于是我开始用 Visual Studio 写代码，用 Qt Creator 构建，勉强还行。我觉得 Qt 做出来的 UI 并不好看。事实上可以用 QSS 来自定义控件样式。当时我上网找了模板，也尝试自己搓，但是始终不满意。最终，我没有深入去学 Qt。</p>
<blockquote>
<p>似乎现在有 QML 这样高级的东西了？我没有深入研究过，读者可以研究一下。</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="尾声">尾声...<a href="https://masterlazy.github.io/blog/2025/09/30/cppgui%E9%80%89%E5%9E%8B%E8%AE%B0#%E5%B0%BE%E5%A3%B0" class="hash-link" aria-label="尾声...的直接链接" title="尾声...的直接链接" translate="no">​</a></h2>
<p>好难找到合适的技术。我还尝试了：</p>
<ul>
<li class="">wxWidgets</li>
<li class="">ImGui</li>
<li class="">FLTK</li>
<li class="">别的什么…</li>
</ul>
<p>…但总不是很满意。后来我认定了，用 C++ 开发 GUI 注定是痛苦的。</p>
<p>后来我又探索了 Dart（写了代码）、C#（写了代码）、Java（没写代码）的 GUI，后来选定了 C# + WPF 的方案。目前来说，这仍是我采用的技术栈。</p>]]></content:encoded>
            <category> C/C++ </category>
            <category> 技术栈（技术选型） </category>
            <category> 碎碎念 </category>
        </item>
        <item>
            <title><![CDATA[写 C# 有感]]></title>
            <link>https://masterLazy.github.io/blog/2025/09/07/</link>
            <guid>https://masterLazy.github.io/blog/2025/09/07/</guid>
            <pubDate>Sun, 07 Sep 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[最近用 C# 写了10 几 KB 的代码，越来越觉得C#远远大于 C++。]]></description>
            <content:encoded><![CDATA[<p>最近用 C# 写了10 几 KB 的代码，越来越觉得C#远远大于 C++。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="语言特性">语言特性<a href="https://masterlazy.github.io/blog/2025/09/07/#%E8%AF%AD%E8%A8%80%E7%89%B9%E6%80%A7" class="hash-link" aria-label="语言特性的直接链接" title="语言特性的直接链接" translate="no">​</a></h3>
<p>首先语言特性上就领先 C++ 很多。比如众所周知 C++ 的异常处理基本上是废的，但C#的异常机制可以很好地运作。还有反射机制、各种语法糖（C#应该是出了名的很多语法糖）。另外C#有更严格的静态流检查，可以帮助排除很多玄学问题。体验非常舒适。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="编辑器">编辑器<a href="https://masterlazy.github.io/blog/2025/09/07/#%E7%BC%96%E8%BE%91%E5%99%A8" class="hash-link" aria-label="编辑器的直接链接" title="编辑器的直接链接" translate="no">​</a></h3>
<p>还有不得不提 VS 的 IntelliCode ，向 C# 严重倾斜。C++里 IntelliCode 的作用几乎为零，但是 C# 里 IntelliCode 约等于半个自动驾驶了。只需要按Tab接受自动补全就好了。虽然没有 Copilot 那么智能，但我觉得恰到好处。还有很赞的自动起名功能。 IntelliCode 真的大幅节省了编码时间，提高了生产力。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="配套设施">配套设施<a href="https://masterlazy.github.io/blog/2025/09/07/#%E9%85%8D%E5%A5%97%E8%AE%BE%E6%96%BD" class="hash-link" aria-label="配套设施的直接链接" title="配套设施的直接链接" translate="no">​</a></h3>
<p>还有配套的丰富的 .NET SDK ，比 C++ 的标准库强太多了。很多轮子即拆即用，非常方便。尤其在文件操作、网络操作、序列化这些，非常方便。而且.NET各组件涵盖前后端，所以用 C# 做全栈开发简直是丝滑无比。相比之下C++的标准库，还有什么WindowsAPI，就显得很笨拙。</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[上古笔记本电脑维修记]]></title>
            <link>https://masterLazy.github.io/blog/2025/07/12/</link>
            <guid>https://masterLazy.github.io/blog/2025/07/12/</guid>
            <pubDate>Sat, 12 Jul 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[又名：《废铁转生之再战三年》]]></description>
            <content:encoded><![CDATA[<p>又名：《废铁转生之再战三年》</p>
<p><img decoding="async" loading="lazy" alt="日志图片" src="https://masterlazy.github.io/assets/images/2025-07-12-01-4b8034044b57e9d6516be3d667b437e1.webp" width="800" height="600" class="img_ev3q"></p>
<p>最近两天一直在致力于修一台 12 年前发售的上古笔记本电脑，它可以开机，但是无法引导进入 OS。（注：为了叙述简洁，没有按照时间顺序来写。）</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="part-i">Part I<a href="https://masterlazy.github.io/blog/2025/07/12/#part-i" class="hash-link" aria-label="Part I的直接链接" title="Part I的直接链接" translate="no">​</a></h2>
<p>由于古老性，我严重忧虑它没法运行 Windows 10，所以决定安装 Ubuntu 24.04.2 LTS。然而尝试安装了好几次，都卡在把镜像写入硬盘这一步（File I/O Error、BrokenPipe）。尝试了各种安装选项，重新给硬盘简历分区表和重新格式化，问题依然存在。怀疑是硬盘问题，就测试写入。发现可以写入，很奇怪，又试了一次，还是卡在相同的步骤。</p>
<p>于是乎，把硬盘拆下来连到另外一台电脑上检测，果然发现了四个柱面有坏道，还是分散在三处的。</p>
<p><img decoding="async" loading="lazy" alt="日志图片" src="https://masterlazy.github.io/assets/images/2025-07-12-02-f95cb888d22f987967bb72e23f39ca43.webp" width="800" height="574" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="part-ii">Part II<a href="https://masterlazy.github.io/blog/2025/07/12/#part-ii" class="hash-link" aria-label="Part II的直接链接" title="Part II的直接链接" translate="no">​</a></h2>
<p>换了一块硬盘，成功安装了 Ubuntu。然而我不甘心，还是想用之前的旧硬盘来装 OS。用 DiskGenius 来创建分区，恰避开了损坏的柱面。然而，Ubuntu 24.04.2 LTS 没法安装，后来试了 Ubuntu 22.04.5，也不行。Windows 10 倒是可以装，不过装完过了不久自己卡死了。遂放弃，可能这块盘比较邪吧。</p>
<p>盲猜：系统所在分区前面就是坏道所在，引导的时候可能要一路读过去，遇到坏道就卡了。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="part-iii">Part III<a href="https://masterlazy.github.io/blog/2025/07/12/#part-iii" class="hash-link" aria-label="Part III的直接链接" title="Part III的直接链接" translate="no">​</a></h2>
<p>Ubuntu 很好，但是有一个严重的问题，笔记本的键盘和触控板都失灵了。试着装了 Windows 10，却没有这个问题。而且在运行 Ubuntu Live OS 期间也没有这个问题。尝试询问 Deepseek，但是它没能给出完全解决的方法（不过辅助分析了问题）。后来试了半天，发现惊天的现象：把笔记本合上再打开键盘就能用了，但是触控板不能。还有一个观察就是键盘失灵期间 Capslock一直是亮着的。</p>
<p>检查内核启动日志，果然发现 Error，原来似乎是 ACPI 尝试对键盘调用“显卡亮度控制方法”</p>
<p>（_BCL，Deepseek 告诉我的），出错了。但是没能找到解决方法。想了想，或许试着升级一下主板 BIOS 固件可以解决问题。</p>
<p><img decoding="async" loading="lazy" alt="日志图片" src="https://masterlazy.github.io/assets/images/2025-07-12-03-5f1b10fb945604bbaf2bdb7cd5ed316b.webp" width="800" height="246" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="part-iv">Part IV<a href="https://masterlazy.github.io/blog/2025/07/12/#part-iv" class="hash-link" aria-label="Part IV的直接链接" title="Part IV的直接链接" translate="no">​</a></h2>
<p>到 DELL 官网一搜，吓一跳，发现 BIOS 固件紧急更新。可是更新程序是 .exe 格式的，Linux 就别想跑了。可是为了这个装 Windows 太麻烦了。于是先后尝试用 PE OS，MS-DOS 安装，均失败。最后咬咬牙，装了 Windows 10，然而打开程序说，要求插入电池。然而电池已经坏了，所以 BIOS 固件是别想更新了。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="part-v">Part V<a href="https://masterlazy.github.io/blog/2025/07/12/#part-v" class="hash-link" aria-label="Part V的直接链接" title="Part V的直接链接" translate="no">​</a></h2>
<p>于是尝试了 Ubuntu MATE 24.04.2 LTS，这个发行版据说比较适合旧设备，然而装了不但没解决问题，UI 也不是很好看。又尝试 Ubuntu 22.04.5 LTS，不过问题仍在。看来是要妥协了，装了 Windows 10，不得不说真的是一步一卡，等到我傻。同时在 discourse.ubuntu.com 上创建了一个帖子寻求社区帮助。本来我是对此不抱什么希望的，要么没人理，要么解决周期很长。不过出乎意料，创建一小时后就有人回复了。四小时前，有人给出了尝试方案。我试了下，真的有用，太神了。实际上就是往内核启动参数里面加 i8042.reset。</p>
<p><img decoding="async" loading="lazy" alt="日志图片" src="https://masterlazy.github.io/assets/images/2025-07-12-04-fe7905607a6c6af5c398030128e60996.png" width="800" height="642" class="img_ev3q"></p>
<p>（以下内容追加于同月13日）</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="part-vi">Part VI<a href="https://masterlazy.github.io/blog/2025/07/12/#part-vi" class="hash-link" aria-label="Part VI的直接链接" title="Part VI的直接链接" translate="no">​</a></h2>
<p>还有一点小问题：无线网卡损坏、空格键坏了。</p>
<p>空格键坏了，难修，但是可以把右 Alt 键（反正一年也用不到几次）映射成空格，曲线救国。</p>
<p>网络方面，买了一块无线网卡（就是一个小USB），不过淘宝上买大多数都只提供 Windows 驱动，少部分说支持 Linux，但实际上要求你自己编译，相当于“理论可行，剩下的你自己来吧”，而且不提供技术支持（只是留一个 CSDN 和 GitHub 链接）。于是把网卡接到 Windows 电脑上安装驱动，发现芯片型号是 AIC8800D80，顺藤摸瓜，找到了有人把腾达提供的驱动源码修改了一下上传到了 GitHub 的仓库。clone 之后拷贝 rules 和 firmware，然后 make，然后 sudo make install，就成功安装了驱动。</p>]]></content:encoded>
        </item>
    </channel>
</rss>