简介这份VC6.0 MFC入门文档面向已具备一定C/C基础、准备转向Windows桌面开发的初学者重点解决从语言语法到MFC框架、从控制台程序到消息驱动编程的过渡问题。内容围绕学习路径展开先强调字符界面练习与C特性掌握再讲解Windows消息的组成、窗口句柄、消息队列、窗口过程与默认消息处理并说明MFC消息映射如何把消息分派到成员函数同时涉及Application Wizard、ClassWizard及参考书选择建议。压缩包共1个doc文件约521KB篇幅集中适合作为入门阶段的要点梳理和查阅材料。已有731人学习读者可借此建立VC6.0与MFC的整体认知理解消息机制和消息映射的关键概念并对照文中学习建议规划后续实践。1. 从零认识 MFC它到底是窗口库还是一套思维方式很多人第一次听到 VC6.0 MFC 入门这几个字脑子里浮出来的画面是一屏看不懂的头文件加上 HWND、UINT、LPARAM 一堆怪词。这种发怵很正常因为 MFC 入门真正卡人的地方不是语法而是要先接受一个反直觉的事实你写的不是「从头跑到尾的程序」而是「一个被系统不停叫醒、问你要不要处理这件事的程序」。MFC 是一层架在 C 之上的类库把窗口、按钮、画笔、字体这些系统里的东西包装成类让你用对象的方式跟系统打交道而不用直接面对句柄和函数指针。它出生得早所以大量工业上位机、教学课件、老旧设备配套软件里至今还能见到它。适合谁学想弄明白 Windows 桌面程序底细的人、要接手维护老工程的人以及单纯想体验一次「消息驱动」到底什么感觉的人。2. 补地基C 底子和 Windows 消息机制先弄明白2.1 为什么建议先写几个字符界面程序再碰窗口刚接触 VC 的时候最容易犯的错是打开向导生成一个窗口工程然后对着满屏自动生成的代码发呆改一行编译一次报错了也不知道是自己写错还是向导写错。我的建议是往回退半步先写几个纯字符界面的小程序把 C 的语法、指针、数组边界、字符串处理这些基本功练到不用想就能写出来再回来碰窗口。这一步看着绕路其实是省时间因为后面 MFC 里到处是CString、CRect、CPoint这些类你对 C 的对象、构造、成员函数不熟看代码就像看天书。下面这个小练习不用窗口就一个控制台程序但把数组、循环、字符处理全用上了是后面操作字符串的底子// 小练习统计一段文字里每个英文字母出现的次数 // 先不碰窗口把循环、数组、字符判断练熟 #include iostream #include string using namespace std; int main() { string line; int count[26] {0}; // 26 个字母的计数器先全部清零 getline(cin, line); // 读一整行空格也算进去 for (size_t i 0; i line.size(); i) { char c line[i]; if (c a c z) count[c - a]; // 小写字母归类 if (c A c Z) count[c - A]; // 大写字母归到同一格 } for (int i 0; i 26; i) if (count[i] 0) cout char(a i) : count[i] endl; return 0; }这段代码里count[c - a]这一句是关键它用字符减字符得到下标把字母映射到数组位置上这种「用减法把范围压到下标」的思路后面处理消息 ID、控件 ID 时会反复出现。getline而不是cin 是为了把空格也读进来不然统计结果永远少一截。写这种小程序的真正目的不是完成作业而是让你在还没被窗口代码淹没的时候先习惯「自己写的 bug 自己找」这件事。我第一次学的时候还干过一件笨事把上面这个程序改成了统计单词、再改成按字母排序输出来回改了三遍。改到第三遍时明显感觉不一样了指针和数组不再是背下来的知识而是手上有数的工具。这种手感是后面看懂 MFC 那一大堆成员函数的前提。2.2 消息是什么一个名字加两个参数Windows 是一个消息驱动的系统。这句话听着抽象理解成一个场景就容易了系统是个前台窗口是各个办公室用户点一下鼠标前台就往对应办公室送一张纸条纸条上写着「什么事」和「两个附加说明」。MFC 里把这张纸条叫消息结构非常固定组成部分类型作用举例消息名称UINT说明发生了什么类型的动作WM_PAINT、WM_LBUTTONDOWN、WM_COMMAND参数一WPARAM附加信息通常是数值或句柄菜单命令的 ID 号放在它的高字里参数二LPARAM附加信息常放坐标等复合数据鼠标点击位置打包成两个 16 位坐标比如菜单被选中时会发出 WM_COMMAND命令的 ID 号就在HIWORD(wParam)里鼠标左键按下时是 WM_LBUTTONDOWN点击的坐标被压进 LPARAM 中MFC 已经帮你拆成了CPoint。窗口需要重画时是 WM_PAINT窗口被创建时是 WM_CREATE尺寸变了是 WM_SIZE定时器到点了是 WM_TIMER。这几个名字建议直接背下来属于入门阶段最常用的词汇表。消息还有一个很重要的性质你不处理它它也不会消失得莫名其妙。系统给每个窗口准备了一份默认的窗口过程负责处理那些你懒得管的杂事——拖动窗口时刷屏、关闭时清理、边框重绘全在默认流程里。所以你写代码的心态应该是「我只挑感兴趣的几条拦下来其余的放行」而不是「所有消息我都要接住」。这个心态差别决定了你后面写的代码是几十行还是几百行。2.3 窗口句柄和消息队列把「谁收信」讲透消息必须送到某个具体窗口系统靠窗口句柄来认门牌号。句柄HWND本质上就是一个整数编号系统在内部用它唯一标识一个窗口你把消息发出去时必须带上这个编号系统才知道该往哪个窗口过程送。想象一下两个窗口用的是同一份处理代码你在窗口一上按了鼠标消息通过窗口一的句柄送到窗口一而不是隔壁那个长得一模一样的窗口二。这就是句柄存在的意义代码可以共享身份不能共享。除了窗口句柄还有设备环境句柄、画笔句柄、字体句柄等等统称 GUI 句柄。入门阶段不用把它们全记住只要建立一个意识句柄是系统给你的「取件码」你拿着它才能对那个对象做事对象销毁了取件码就作废。再看消息循环。每个运行中的程序都有自己的消息队列系统把产生的消息放进队列程序在一个循环里逐条取出来按句柄分派到对应的窗口过程// 消息循环的骨架伪代码只为看清结构 while (true) { MSG msg; if (GetMessage(msg, NULL, 0, 0) 0) // 取到退出信号就返回 0跳出循环 break; TranslateMessage(msg); // 把按键消息翻译成字符消息 DispatchMessage(msg); // 按 msg.hwnd 找到窗口过程把消息送过去 }关键在GetMessage这一句队列里没有消息时它不返回而是把 CPU 让给系统所以你的程序空闲时几乎不占资源。这也是为什么在消息处理函数里写死循环会造成整个界面失去响应——循环卡在窗口过程里消息循环根本没机会回去取新消息系统怎么点你都没反应。这个坑后面第 5 章还会专门讲。3. 消息映射三行宏替代一长串 switch3.1 先看手写版本长什么样在用 MFC 之前得先知道它替你省掉了什么。传统的做法是给窗口写一个窗口过程函数里面用 switch 把各种消息分开处理// 传统写法的窗口过程伪代码MFC 就是把这套东西包起来了 LRESULT CALLBACK MyWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_PAINT: DoPaint(hWnd); // 窗口需要重画时走这里 break; case WM_LBUTTONDOWN: DoClick(LOWORD(lParam), HIWORD(lParam)); // 拆出点击坐标 break; case WM_COMMAND: if (HIWORD(wParam) ID_MY_MENU) // 判断是哪个菜单命令 DoMenu(); break; default: return DefWindowProc(hWnd, msg, wParam, lParam); // 不管的交给默认过程 } return 0; }这种写法能跑但问题很明显所有消息挤在一个函数里加一个功能就往 switch 里塞一个 case几百行下去谁也看不清而且这个函数必须是全局的或者静态的想访问某个对象的成员变量就得来回传指针。这就是为什么很多老代码看着像一锅粥不是作者水平不行是那套机制逼的。3.2 MFC 版本把 switch 藏进宏里MFC 的做法是把「消息」和「成员函数」的对应关系写进一张表用宏展开成 switch。你只需要在类里声明一个带afx_msg前缀的成员函数然后在消息映射表里加一行ON_WM_xxx剩下的分派工作编译期就替你拼好了// 第一步在视图类的头文件里声明处理函数 protected: //{{AFX_MSG(CMyDemoView) afx_msg void OnLButtonDown(UINT nFlags, CPoint point); // 处理鼠标左键按下 //}}AFX_MSG DECLARE_MESSAGE_MAP()// 第二步在实现文件里把消息和函数对上号 BEGIN_MESSAGE_MAP(CMyDemoView, CView) //{{AFX_MSG_MAP(CMyDemoView) ON_WM_LBUTTONDOWN() // 收到 WM_LBUTTONDOWN 就调用 OnLButtonDown //}}AFX_MSG_MAP END_MESSAGE_MAP() // 第三步写具体的处理逻辑 void CMyDemoView::OnLButtonDown(UINT nFlags, CPoint point) { CString s; s.Format(_T(你点在了 (%d, %d)), point.x, point.y); // 拼一段提示文字 AfxMessageBox(s); // 弹个框确认消息真的到了 CView::OnLButtonDown(nFlags, point); // 自己不处理的部分交回父类 }三个地方值得说清楚。afx_msg本身是个空宏写它只是给编译器和 ClassWizard 一个标记告诉你「这是消息处理函数不是普通成员函数」。BEGIN_MESSAGE_MAP和END_MESSAGE_MAP之间那张表才是真正干活的ON_WM_LBUTTONDOWN()括号里是空的因为 MFC 已经按消息名约定好了函数签名你不用手写参数。最后那一行CView::OnLButtonDown(...)是「放行」如果不写某些默认行为就断了比如视图的焦点处理。还有一个细节代码里那两对//{{AFX_MSG和//}}AFX_MSG注释看着像废话其实是 ClassWizard 认的标记。它靠这对花括号找到该往哪儿插代码。血泪经验是别手动删它、别把它们挪位置一旦破坏向导就找不到插入点你得全部手写很麻烦。3.3 跑通第一个例子点一下鼠标弹个框具体操作按这个顺序来一步都别跳打开 VC6.0新建工程类型选 MFC AppWizard(exe)工程名随便取一个比如 MyDemo。第二步选 Single document单文档其他保持默认后面几步直接点 Finish。编译运行一次确认这个空壳工程能正常出窗口这一步是基准线出不来就别往下走。菜单里打开 ClassWizard或者按 CtrlW在 Message 列表里找到 WM_LBUTTONDOWN双击它会自动帮你把声明和映射表都填好。在弹出的函数里写上面那三行代码重新编译运行。在窗口客户区随便点一下应该弹出提示框显示坐标。如果第 6 步没反应先别怀疑代码去实现文件里确认 ON_WM_LBUTTONDOWN() 那一行是不是真在里面。我第一次做这个例子时就翻车了原因是我手贱把//{{AFX_MSG_MAP那行注释删了向导生成的内容插到了错误的位置编译能过但消息永远到不了函数里。这种「编译通过但不生效」的问题是 MFC 入门期最耗时间的类型。4. 第一个 Demo在窗口里画出线、框和文字4.1 从向导生成一个单文档骨架有了上面的手感就可以做一个稍微像样点的东西了。还是那个单文档工程我们要在客户区画一条线、一个填充矩形、一行文字。工程本身不用改所有工作都在视图类的OnDraw成员函数里完成。OnDraw的调用时机是「窗口需要重画」系统会在窗口首次显示、被遮挡后露出、被拖动、尺寸变化时自动调用它。参数CDC* pDC就是设备环境你可以把它理解成一张画布所有绘图动作都通过它发出去。这里有个很值钱的设计打印和打印预览时传进来的 pDC 对应的是打印机而不是屏幕所以你写在这一个函数里的绘图代码窗口显示、打印预览、实际打印三处都能用一份代码三份效果。这也是入门阶段值得花力气理解 OnDraw 的原因。4.2 在 OnDraw 里画第一条线把下面这段整体替换掉视图类里原来的 OnDraw 内容void CMyDemoView::OnDraw(CDC* pDC) { CMyDemoDoc* pDoc GetDocument(); ASSERT_VALID(pDoc); // 1. 画一条深灰色的粗线 CPen penLine; penLine.CreatePen(PS_SOLID, 2, RGB(128, 128, 128)); // 实线宽度 2灰色 CPen* pOldPen pDC-SelectObject(penLine); // 选进画布同时记住旧笔 pDC-MoveTo(20, 20); // 起点 pDC-LineTo(300, 120); // 画到终点 pDC-SelectObject(pOldPen); // 用完换回旧笔 penLine.DeleteObject(); // 再销毁这支笔 // 2. 画一个矩形并填充浅蓝底色 CBrush brushFill; brushFill.CreateSolidBrush(RGB(220, 235, 255)); CBrush* pOldBrush pDC-SelectObject(brushFill); pDC-Rectangle(CRect(20, 150, 300, 260)); // 左、上、右、下四个坐标 pDC-SelectObject(pOldBrush); brushFill.DeleteObject(); // 3. 在矩形里写一行字 CFont fontText; fontText.CreateFont(24, 0, 0, 0, FW_BOLD, FALSE, FALSE, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, _T(宋体)); CFont* pOldFont pDC-SelectObject(fontText); pDC-SetBkMode(TRANSPARENT); // 文字背景透明 pDC-SetTextColor(RGB(0, 0, 128)); // 深蓝色字 pDC-TextOut(40, 170, _T(第一个 MFC 例子)); pDC-SelectObject(pOldFont); fontText.DeleteObject(); }逐段解释一下。CreatePen三个参数分别是线型、线宽、颜色RGB(128,128,128)是灰色三个分量都是 0 到 255。CRect(20, 150, 300, 260)的四个数是左上角 x、左上角 y、右下角 x、右下角 y不是宽和高这个顺序新手经常记反画出来的框位置离谱多半就是这里错了。SetBkMode(TRANSPARENT)让文字背景透明不设的话字后面会拖一块底色压在图形上很丑。TextOut只能输出单行坐标是文字左上角。想输出多行、想居中、想自动换行就得换DrawText它接收一个矩形区域和一组格式开关格式开关作用DT_SINGLELINE只输出一行遇到回车也不换行DT_CENTER水平居中DT_VCENTER垂直居中必须和 DT_SINGLELINE 一起用DT_WORDBREAK超出行宽时在单词之间自动折行DT_END_ELLIPSIS放不下时结尾显示省略号DT_CALCRECT不画只计算出这段文字需要多大的矩形DT_CALCRECT特别实用先算尺寸再决定画在哪儿或者用它来给一行文字做居中的位置计算。几个开关要组合时用竖线连起来比如DT_CENTER | DT_SINGLELINE | DT_VCENTER就是单行完全居中。4.3 钢笔、刷子、字体GDI 对象的三条规矩上面代码里每段都有「选进去、画、换回来、销毁」这个套路看着啰嗦但必须遵守否则程序会以各种玄学方式出问题。规矩归纳起来三条第一条用之前必须先创建成功。CreatePen、CreateSolidBrush、CreateFont这些函数都有返回值虽然大多是失败才返回假但入门阶段养成「创建完就用」的直线思路别在创建和使用之间插一堆逻辑。第二条选进设备环境时要保存旧的句柄。SelectObject会返回被替换下来的那个对象指针你必须接住它画完再选回去。原因是设备环境里本来就有默认的笔、刷、字体你不还原系统就一直拿着一支已经被销毁的笔后面的绘制全乱。第三条同一个对象重新创建之前必须先销毁。DeleteObject释放的是对象占的系统资源一个CPen对象只能对应一支笔想换颜色就得先 Delete 再 Create不能直接再调一次 CreatePen。这也是为什么很多老程序跑久了会变慢甚至报错——GDI 资源是有限额的漏掉几十个就可能让整个进程的绘图失效。提示如果只是想快速用个默认颜色不必自己创建对象用pDC-SelectStockObject(BLACK_PEN)这类库存对象更省事。库存对象不需要你销毁用完不还原也不会出事适合试验阶段。5. 避坑清单新手最容易翻车的 5 个地方5.1 一运行就弹 Debug Assertion Failed现象程序启动或点击几下之后弹出断言失败对话框提示信息里带着某个文件名和行号点重试能看到调用栈。原因八成是 GDI 对象没还回去就销毁了。典型写法是创建一支笔、选进设备环境、画完直接让笔对象出了作用域旧笔没选回来。对象析构时笔被销毁可设备环境里还留着它的引用下一次绘制就撞上断言。解决把「选进去、记住旧指针、画完选回来、再 Delete」当成一个不可拆的整体写别为了省一行把还原语句删掉。已经出问题的代码重点检查 OnDraw 里每个 SelectObject 后面有没有对应的还原。5.2 改了代码界面一点变化都没有现象明明改了绘制代码重新编译也没报错跑起来还是老样子。原因VC6 的增量编译有时候判断不准尤其是改的是头文件或者资源文件。另一种常见情况是断点打在了 Release 配置下符号对不上看着像没执行。解决先做一次 Rebuild All把所有中间文件清掉重来这一招能解决大半「改了没反应」。再确认右上角配置下拉框选的是 Debug 而不是 Release。这个坑我踩过不止一次后来养成了习惯只要现象诡异先 Rebuild 一遍再说比盯着代码找半小时高效。5.3 中文输出成乱码或者问号现象TextOut 出去的中文显示成一堆乱七八糟的符号或者干脆只显示第一个字。原因字符串编码和工程设置不匹配。一种情况是源码里直接写了双引号中文而工程被设成了 Unicode 编译窄字符串被当宽字符串用另一种是从别处拷贝来的代码用了char*却塞进CString的宽字符接口。解决字符串统一用_T(...)包起来让编译器按工程设置自动选窄或宽检查工程设置里字符集那一项前后一致别一半代码按 Unicode 写、一半按多字节写。入门阶段建议就盯着一种设置用到底别两边混。5.4 消息处理函数写了但断点从来不进现象函数体写得好好的编译也过运行起来点击、按键都没反应断点打上去是空心圆。原因三个地方最容易漏。头文件里函数的声明忘了加afx_msg消息映射表里没写对应的ON_WM_xxx那一行或者曾经手动动过//{{AFX_MSG_MAP那对花括号注释导致向导生成的内容插错位置。解决别手写用 ClassWizard 加消息它会把声明、映射、函数体三处一次填好。已经乱了的话把函数声明和映射表那几行对照着一个能跑的工程抄一遍结构。判断标准很简单映射表里没有那一行函数写得再对也永远不会被调用。5.5 点一下按钮整个窗口卡住不动现象触发某个操作后窗口变成白板拖不动也关不掉任务管理器里显示程序「无响应」。原因在消息处理函数里写了耗时操作或者死循环。前面说过消息循环是单线程的你的处理函数不返回循环就没法去取新消息界面自然全部僵住。哪怕只是一个看起来很短的循环只要里面有等待或者大量计算都会造成这个结果。解决入门阶段最省事的办法是把耗时任务拆小用定时器一段一段做稍微进阶一点就开一个工作线程让界面线程只负责刷新。另外排查时可以在可疑函数里加几行日志看看到底卡在哪一句别靠猜。6. 下一步学什么从跑通一个例子到能看懂别人的工程跑通上面那个小 Demo 之后最容易出现的状态是「离开了教程就写不出东西」。这不是能力问题是路径还没铺开。我给自己的学生安排顺序时一般按下面这个表往下走每一步都能独立验证不至于一次摊太多阶段重点内容怎么算过关起步消息名称、窗口句柄、消息映射三件套能说清点击一次鼠标经过了哪几步上手CRect、CPoint、CString 三个基础类不看资料能算出矩形中心点、拼出带变量的字符串加厚对话框、控件、按钮响应能自己做一个输入框加按钮的小工具进阶文档视图结构、文件读写能把数据存成文件下次打开还能读回来独立看懂别人工程的主干拿到一个陌生工程能在一小时内说清它大概怎么跑起来的几个具体建议。第一把 Help 用起来别一遇到不认识的函数就上网搜。VC6 自带的手册里每个函数都有参数说明和返回值CreateFont那十几个参数我就是一条一条查下来的查过一遍比看十篇教程都牢。第二刻意记一些高频词WM_PAINT、WM_COMMAND、WM_LBUTTONDOWN、WM_CREATE、WM_SIZE、WM_TIMER还有AfxMessageBox、AfxGetApp这几个全局函数它们出现的频率高到你不得不熟。第三学会看别人的代码找一个能跑的小工程从InitInstance开始顺着读遇到不懂的类就去查它的继承关系你会发现大部分类都是从那么几个基类派出来的读通一个就通一片。关于买书这件事我的教训挺深。刚入门那阵子我一口气买了四本每本翻了不到五十页最后真正看完的只有一本。后来明白过来入门阶段需要的是「内容全面、代码有详细讲解」的那一类一本就够翻烂它比摆一排有用。等你能独立写点东西了再去挑那种讲原理讲得透的那时候你才知道自己缺什么。还有一个习惯我坚持到现在每次动手做一个新例子之前先在纸上把「谁发消息、谁收消息、我在哪个函数里干活」这三件事写下来写完再敲键盘。这个动作看着慢实际省时间因为它拦住了大部分「写了一下午发现方向错了」的情况。从那以后我每次开新工程都强制走一遍这个流程哪怕是三行代码的小实验。希望这些能帮到你别怕开头慢慢过那一段就顺了。本文还有配套的精品资源点击获取
企业数字化 ERP 产品动态
相关推荐
Hypit 一行命令复刻爆款短视频:环境安装、核心链路与自动化实践 短视频创作这件事,最劝退新人的从来不是创意,而是那条从"看到一条爆款"到"自己产出一条差不多的"之间的漫长流水线。你得先下载素材、再扒文案、然后对着时间轴一句句敲字幕、接着找配音、配乐、调色、套模板,一套下来三… · 2026/11/4 18:08:28
DeepSeek Harness插件开发:从manifest契约到灰度验证 DeepSeek Harness 插件开发这件事,我最初是当成一个周末小任务接的——给宿主补两个工具,跑通就行。真上手才发现,插件这根线牵出来的是整套工程约定:manifest 怎么描述能力边界、钩子在什么时机触发、超时算谁的、装上去之后怎么… · 2026/11/4 18:08:28
棘轮式演进:让Harness越用越可靠的工程实践 1. 棘轮与Harness:为什么“可靠”的本质是单向改进先说个我自己的真实经历。装上Harness、跑通第一个agent的时候,我心里是有点得意的,觉得这个工具确实配得上“缰绳”这个名字——它能把模型、技能、工具调用都规整到一套体系里,… · 2026/11/4 18:08:28
数据科学与大数据毕业设计创新选题指南 1. 项目背景与核心价值每年毕业季,数据科学与大数据技术专业的学生们最头疼的问题就是选题。一个好的毕业设计题目既要体现专业核心能力,又要具备创新性和可行性。作为带过7届毕业设计的导师,我见过太多学生在选题阶段浪费大量时间࿰… · 2026/11/4 18:49:13
数据结构与算法分析C语言版解答手册:复杂度、递归与自测方法 简介:这份 PDF 是 Mark Allen Weiss《Data Structures and Algorithm Analysis in C》第二版的配套习题解答手册,面向学习数据结构与算法分析课程、希望对照课后练习查漏补缺的本科生和自学者。内容按教材章节展开,涵盖算法复杂度与大 O 分析… · 2026/11/4 18:49:13
Excalidraw 白板 JSON 导入导出与配置持久化 周五下午四点半,你把一张三十多个节点的手绘架构图在浏览器里画完,顺手点了根烟回来,发现标签页被系统回收了。刷新之后,白色画布上空空如也,那种感觉比丢代码还难受——代码好歹还有 git,白板上的东西是真… · 2026/11/4 18:49:13
无刷电机ax by cz轴系划分:为什么是120度而非垂直? 前两天在技术交流群里看到一个挺有意思的问题:“直流无刷电机 ax by cz 怎么划分的,是按照垂直轴线划分的么?”我一看就猜到,问问题的八成是被电机绕组的轴系概念绕晕了。这里的“ax、by、cz”其实对应的是无刷电机里三相绕组 A、… · 2026/11/4 18:49:13
QtScrcpy投屏鼠标点不动:输入注入权限与通道排查 画面在窗口里跑得飞快,声音也同步,键盘敲字能进输入框,唯独鼠标点下去屏幕纹丝不动——这种“半瘫”状态是 Android 投屏控制里最让人抓狂的一类故障。QtScrcpy 这款基于 scrcpy 内核的图形化投屏工具,靠 ADB 把设备画面拉回电脑&… · 2026/11/4 18:49:13
SQLite清空表的三种方法与性能对比 1. SQLite Truncate Table操作的本质解析 在SQLite中,TRUNCATE TABLE并不是一个原生支持的SQL命令。这个看似简单的操作背后隐藏着数据库引擎设计的深层考量。与MySQL或PostgreSQL不同,SQLite选择通过DELETE FROM语句来实现类似功能,这种设计… · 2026/11/4 18:48:12
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38
AI辅助技术栈评估:提升研发决策效率60% 1. 项目背景与核心价值技术决策一直是研发团队面临的重大挑战。随着技术生态的快速演进,技术栈的选择、维护和迭代变得愈发复杂。我们团队在过去两年里,先后经历了三次重大技术栈迁移,每次都需要投入大量人力进行技术评估和风险分析。直到去年… · 2026/11/4 0:00:17
从生成Token到直接决策:Jev如何重塑AI Agent工程实践 1. 从"生成文字"到"拍板决策":Jev 到底在解决什么问题大多数人第一次接触大模型,脑子里建立的模型是"输入问题、输出文字"。你问它今天天气怎么样,它给你一段描述;你让它写个周报,它给你… · 2026/11/4 0:00:17
32G统一内存跑大模型:内存账、TPS实测与端云分流 想在一台 32G 统一内存的小主机上把大模型跑成"日常可用",这件事我前后折腾了小半年。标题里说的这台 Mac mini M6,是我们这次讨论的目标平台,具体到手规格以实物为准;但下面这套推算方法和实测思路,对任何统… · 2026/11/4 0:00:17
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38