
MFC日常开发记录
文章平均质量分 59
SunkingYang
C++资深工程师,拥有14年C++实战开发经验。
期间从事Windows客户端及Linux服务端开发。客户端有ActiveX、MFC、QT,医疗虚拟与现实(Ogre、QT、OpenCV等),三维人脸识别。
拥有4年天网视频监控开发经验,包含ocx插件开发、国标解码库:软解码和硬解码开发等(Windows平台),2年雪亮工程国标服务开发经验,包含国标28181级联服务、国标流媒体等(Linux平台)。
目前在从事半导体行业,负责应用程序、驱动开发。
展开
-
C++中如何使用Cshapes类的addpicture函数将图片插入excel
原因:项目未正确导入 Excel 的类型库。解决在 Visual Studio 中,右键项目 ->添加类->类型库中的 MFC 类。选择 Excel 的类型库(如勾选_WorksheetShapes等需要的接口,生成包装类。的作用:获取工作表的图形集合接口,用于插入和管理图片。关键步骤初始化 COM 并创建 Excel 对象。获取CWorksheet对象并调用。使用插入图片,指定位置和大小。注意事项使用绝对路径和宽字符字符串(L"..."操作完成后释放 COM 资源(原创 2025-04-10 16:55:11 · 1125 阅读 · 0 评论 -
如果窗口创建后被隐藏了或者创建时就是隐藏的,通过FindWindow还能查到句柄吗
隐藏窗口可被找到FindWindow不依赖窗口可见性,仅需类名和标题匹配。实际应用场景:适用于后台自动化控制(如关闭弹窗、操作隐藏配置窗口)或监控其他进程的窗口状态。若查找失败:优先检查类名/标题的准确性、窗口生命周期(是否已销毁)及权限问题。在 Windows 程序开发中,FindWindow是一个关键的 API 函数,用于通过窗口类名(ClassName)和窗口标题(Window Title)查找顶层窗口的句柄(HWND)。原创 2025-04-03 14:27:27 · 1002 阅读 · 0 评论 -
C++中使用ShellExecute函数调用其他窗口程序时,参数设置为隐藏,后续能通过发消息给这个被调用程序显示,能显示出来窗口吗
可行但非万能:通过发送消息显示窗口在技术上是可行的,但高度依赖目标程序的消息处理逻辑。推荐直接控制:优先使用直接显示窗口,避免依赖消息机制。健壮性建议结合FindWindow和确保准确获取句柄。添加重试逻辑应对窗口创建延迟。处理权限问题确保跨权限层级控制。思路来源使用C++中的ShellExecute函数启动一个窗口程序时设置为隐藏,后续能否通过发送消息让被调用的程序显示窗口。原创 2025-03-26 20:15:02 · 964 阅读 · 0 评论 -
MFC中如何判断一个窗口当前状态是显示还是隐藏
方法适用场景局限性快速判断窗口可见性标志受父窗口隐藏影响递归检查父窗口链精确判断实际可见性需遍历所有父窗口GetStyle()直接访问窗口样式标志不处理父窗口隐藏逻辑选择方法时应根据需求权衡:若仅需检查窗口自身的WS_VISIBLE状态,使用;若需确保窗口在屏幕上实际可见,需递归验证父窗口链的可见性。思路来源如何在MFC中判断一个窗口当前是显示还是隐藏状态。我需要先理解MFC中窗口状态的相关知识,然后给出准确的方法。原创 2025-03-26 20:11:46 · 1043 阅读 · 0 评论 -
MFC中字符串string类型和CString类型互转方法
在Unicode环境下,CString本质上是CStringW// 方法1:使用 WideCharToMultiByteCStringW cstrW = L"你好,MFC";// 方法2:使用 CT2A 宏(需包含 <atlstr.h>)多字节环境下,CString为CStringA// 或使用 CA2W 宏(需包含 <atlstr.h>)转换方向Unicode项目方法多字节项目方法CString→CT2A或直接赋值→CStringCA2T或直接赋值。原创 2025-03-26 20:08:29 · 1058 阅读 · 0 评论 -
C++中ShellExecute函数使用方法说明,如果一开始参数为隐藏,后面还能再显示出来吗
隐藏后显示可行:通过FindWindowShowWindow间接控制。推荐替代方案:若需精细控制进程窗口,优先选择。错误处理关键:始终检查API返回值,确保操作可靠性。思路来源关于C++中ShellExecute函数的使用方法,以及如果在启动时参数设置为隐藏,之后能否再显示窗口的问题。首先,我应该回顾一下ShellExecute的基本用法,然后看看隐藏窗口的参数是什么,接着考虑是否有办法在程序启动后修改窗口的显示状态。用户的问题分为两部分:使用方法和隐藏后能否显示。原创 2025-03-26 20:04:29 · 925 阅读 · 0 评论 -
C++中捕获异常类型_com_error、std::exception、CException、CMemoryException, COleDispatchException有什么区别,如何来选择它们
异常类型选择标准库异常:优先用(引用捕获)。COM异常:用_com_error(引用捕获)。MFC异常:用及其派生类(指针捕获,需手动释放)。指针 vs 引用指针捕获专用于MFC框架。必须检查空指针并手动释放内存(Delete()引用捕获用于标准C++异常。更安全、简洁,支持多态。最佳实践MFC项目:严格遵循捕获规则,避免内存泄漏。标准C++:始终用引用捕获,避免对象切片(slicing)。混合项目:明确区分捕获顺序(先派生类后基类)。原创 2025-03-25 20:27:46 · 1139 阅读 · 0 评论 -
MFC中CString类型是如何怎么转std::string的
在 MFC 开发中,CString与Unicode 项目优先使用CT2A宏或函数,确保宽字符到多字节的安全转换;多字节项目可直接通过构造函数赋值,简洁高效。无论选择哪种方法,务必统一字符编码(如 UTF-8),避免因编码差异导致乱码或兼容性问题。若需跨配置适配,可通过_T()宏和条件编译提升代码灵活性。希望本文能为您提供清晰的解决方案,若有更多疑问,欢迎探索微软官方文档或社区资源,祝编程愉快!🚀上一篇:使用C++写一个递推计算均方差和标准差的用例。原创 2025-03-21 13:49:07 · 1138 阅读 · 0 评论 -
MFC中使用Create或CreateDialog创建对话框失败,GetLastError错误码为1813(找不到映像文件中指定的资源类型)
功能:确保跨模块调用时,MFC 正确访问资源、类型和消息映射。何时使用:涉及多模块(DLL、COM、多线程)且使用 MFC 功能时。核心价值:避免资源错乱、崩溃和逻辑错误,提升代码健壮性。上一篇:通过简单示例来展示C/C++中是如何计算指针中字符串的长度技术世界如同浩瀚的海洋,每一处看似复杂的暗流,实则是通向更深理解的航道。你探索的每一个 MFC 模块状态、每一行看似晦涩的代码,都是在驾驭底层逻辑的力量。也许今天的曾让你困惑,但当你跨越这道门槛,你会发现自己已悄然解锁了构建健壮软件的核心密钥。原创 2025-03-14 21:10:06 · 863 阅读 · 0 评论 -
C/C++中如何动态加载dll并获取函数地址,然后赋值给函数指针,通过代码示例说明。如果参数是输出参数,函数指针参数个数多于导出函数参数,会出现哪些问题?
动态加载DLL并获取函数地址时,确保函数指针的类型与DLL中导出的函数类型完全匹配是非常重要的。特别是对于输出参数,参数个数不匹配可能导致堆栈不平衡、内存访问冲突、数据错误甚至程序崩溃。因此,在调用动态加载的函数时,务必仔细检查函数指针的参数个数和类型,确保它们与函数的声明一致。此后为废话,纯粹是为了应对csdn质量分,没有任何价值,不要浏览。思路来源:问题分为两部分:一是如何在C/C++中动态加载DLL并获取函数地址,然后赋值给函数指针;二是如果函数指针的参数个数多于导出函数参数,会出现哪些问题。原创 2025-03-06 10:14:25 · 872 阅读 · 0 评论 -
图形化手把手教你如何通过VS2022创建动态链接库,并导出函数
通过上述步骤,你可以在Visual Studio 2022中创建一个动态链接库,并通过或.def文件导出函数。这样,其他模块就可以通过动态加载的方式使用这些导出的函数。参考:https://learn.microsoft.com/zh-cn/cpp/build/reference/building-an-import-library-and-export-file?思路来源:如何通过 Visual Studio 2022 创建动态链接库(DLL),并导出函数。原创 2025-03-05 17:59:44 · 1519 阅读 · 0 评论 -
C/C++中如何通过函数指针调用其他dll模块封装的函数,调用时,如果参数不匹配,会出现什么哪些错误?
参数不匹配可能导致堆栈崩溃、内存错误或数据损坏。解决此类问题的核心是严格保证函数指针声明与 DLL 函数实际签名的完全一致,包括调用约定、参数类型/数量和返回值类型。思路来源:在C/C++中如何通过函数指针调用其他DLL模块封装的函数,以及参数不匹配会导致哪些错误。首先,我得回想一下DLL调用的基本步骤。通常,使用LoadLibrary加载DLL,然后用GetProcAddress获取函数地址,转换成合适的函数指针,再进行调用。那问题来了,如果参数不匹配的话会发生什么情况呢?原创 2025-03-05 15:57:04 · 671 阅读 · 0 评论 -
C/C++中函数指针和指针函数的原理和区别是什么,分别通过用例说明。
函数指针:用于指向函数的地址,可以通过函数指针调用对应的函数。指针函数:返回一个指针类型的值,可以是任何类型的指针(如int*char*等)。通过上述用例和区别,可以更清晰地理解函数指针和指针函数在C/C++中的原理和使用方法。思路来源:首先,我得确认自己对这两个概念的理解是准确的。函数指针,顾名思义,是指向函数的指针变量。它存储的是函数的地址,通过这个指针可以调用对应的函数。至于指针函数,嗯,这个术语其实有点容易混淆。它应该是指返回值是指针的函数,也就是函数的返回类型是指针类型。原创 2025-03-04 20:35:26 · 389 阅读 · 0 评论 -
c变量命名规则有哪些,有什么作用,为什么要做这些限制?C代码应该怎么写?
这样可以使编译器能够按照统一的规则来解析代码,避免因为变量名的不规范而导致的语法分析困难。例如,如果允许变量名使用任意字符,编译器就需要处理更多的特殊情况,增加了编译器设计的复杂度。C语言标准没有严格限制变量名的长度,但大多数编译器和系统对变量名的有效长度有一定的限制,通常是前 31 个字符有效。清晰、规范的变量名使得其他开发者能够更容易地理解代码的意图和逻辑,便于团队协作和代码的长期维护。等作为变量名,虽然编译器会报错,但在开发时应该避免此类错误,因为这些关键字在C语言中有特定的含义。原创 2025-02-14 16:50:45 · 854 阅读 · 0 评论 -
C++ 类static成员变量如何申明及定义?
注意,静态成员变量的定义(即内存分配)只能在类的外部进行,且只能定义一次。如果在多个源文件中使用同一个类的静态成员变量,则应在其中一个源文件中进行定义,并确保该定义对其他源文件可见(通常是通过包含类的头文件来实现的)。在C++中,类的静态成员变量是属于类本身的,而不是类的某个具体对象。静态成员变量需要在类外部进行定义(即分配内存空间),但在类内部进行声明。类的静态成员变量可以通过类名和作用域解析运算符来访问,也可以通过类的对象来访问(尽管这样做在语义上可能不太清晰,因为静态成员变量与具体的对象无关)。原创 2025-01-13 14:44:33 · 553 阅读 · 0 评论 -
C/C++中,const、static关键字有什么作用,如何定义、初始化,什么情形下需要用到这两关键字?
在C和C++中,const变量的定义和初始化方式与普通变量类似,只是需要在类型前加上const关键字。在C++中,还可以定义const成员变量,这需要在类声明中进行初始化(C++11及以后版本支持在构造函数初始化列表中初始化非静态constpublic:静态局部变量:在函数内部定义,只在第一次进入该函数时初始化。// 只在第一次调用时初始化count++;静态全局变量:在文件作用域内定义,但使用static关键字限制其作用域。// 只在当前文件内可见静态函数:在文件作用域内定义,但使用。原创 2025-01-13 14:35:59 · 754 阅读 · 0 评论 -
CArray原理是什么,通过示例来展示如何使用?
CArray是MFC(Microsoft Foundation Class)库中的一个模板类,用于实现动态数组的功能。它类似于C语言中的数组,但具有自动增长和缩小的能力,从而方便管理动态数据。以下是对CArray原理的解析以及一个使用示例。原创 2025-01-06 15:11:06 · 641 阅读 · 0 评论 -
C++中如何使用SYSTEMTIME获取系统时间并格式化为字符串?
结构体通常与Windows API一起使用来获取系统时间,但直接将其格式化为字符串并不是最直接的方法。通常,更简便和跨平台的方法是使用标准库中的。这个方法更加简洁,并且不需要处理时区转换的复杂性,因为它直接使用了系统本地时间。头文件来处理时间和日期。然而,如果你确实需要使用。原创 2024-10-26 10:48:03 · 1242 阅读 · 0 评论 -
C++中如何获取时间并格式化为字符串?
在C++中,你可以使用标准库中的和头文件来获取当前时间并将其格式化为字符串。原创 2024-10-26 10:40:57 · 812 阅读 · 0 评论 -
在Windows编程中,MFC\C++中如何在OnCopyData中传递Vector类型数据?
我们在通过 WM_COPYDATA 消息实现进程间通信时,发送char 数组或其他类型数组与发送vector是有区别的。原创 2024-08-05 11:55:01 · 613 阅读 · 0 评论 -
在Windows编程中,MFC\C++中通过例子来演示如何在OnCopyData中传递STL类型数据?
在Windows编程中,使用MFC框架并通过OnCopyData处理消息来传递STL类型数据,实际上并不直接支持STL容器的直接传递,因为的结构期望的是一个指向连续内存块的指针。然而,我们可以通过序列化STL容器的内容到一个连续的内存块中,然后发送这个内存块。以下是一个完整的例子,演示了如何在MFC应用程序中通过发送,并在接收方窗口中接收并处理这些数据。原创 2024-08-05 11:24:54 · 631 阅读 · 0 评论 -
在Windows编程中,MFC\C++中OnCopyData如何传递结构体类型数据?
当使用MFC(Microsoft Foundation Classes)进行C++开发时,OnCopyData 函数通常用于处理 WM_COPYDATA 消息,该消息允许一个应用程序向另一个应用程序的窗口发送数据。由于 WM_COPYDATA 消息通过 COPYDATASTRUCT 结构体传递数据,而 COPYDATASTRUCT 的 lpData 成员是一个指向数据的指针(通常是 void* 类型),因此你可以通过该指针传递任何类型的数据,包括结构体类型数据。原创 2024-08-05 10:55:53 · 547 阅读 · 0 评论 -
在Windows MFC\C++编程中的WM_COPYDATA是什么,工作原理是什么,有什么作用,如何来使用它?
WM_COPYDATA 是一种非标准但广泛使用的Windows消息,它允许一个应用程序向另一个应用程序的窗口发送数据。虽然 WM_COPYDATA 不是Windows API中正式定义的标准消息之一,但Windows操作系统确实支持并处理这个消息,使得它成为在不同应用程序之间安全传递数据的一种流行方式。原创 2024-08-05 10:52:20 · 675 阅读 · 0 评论 -
在Windows MFC\C++编程中,如何使用OnCopyData函数
函数通常不是标准C++库的一部分,而是与特定的图形用户界面(GUI)框架相关联,如Microsoft Foundation Classes (MFC) 或 Windows API 编程。在这种情况下,你可能想要探索其他机制,如全局变量、共享内存、消息映射中的其他消息等。另外,如果你不是在MFC环境中,而是在使用Windows API进行原生Win32编程,那么你将需要手动处理。这通常在你的类的头文件(.h)中声明,并在源文件(.cpp)中实现。消息,并编写相应的处理代码。在你的类中,你需要实现。原创 2024-08-05 10:36:35 · 648 阅读 · 0 评论 -
在Windows编程中,MFC\C++中OnCopyData如何传递基础类型数据?
要在OnCopyData中传递基础类型数据(如int、float、char等),你首先需要将这些数据打包到一个结构体中,因为WM_COPYDATA消息期望的是一个指向COPYDATASTRUCT结构的指针,该结构包含指向数据的指针和数据的长度。原创 2024-08-05 10:31:56 · 923 阅读 · 0 评论 -
GridCtrl成员函数及功能简要说明
●使用鼠标可以进行单元格的选择,还可以辅助ctrl和shift的组合键进行选择。也可以取消选择。● 行和列可以按照大小进行重排,还可以取消对行、列或两者的排序。● 双击区分点,行或者列可以按照大小自动排序● 可以对任何列或行固定● 单元格可以有不同文本和背景颜色的个性化设置● 单元格可以有字体的个性化设置● 单元格可以标注"只读"或者其他的状态设置及检测● OLE的拖放动作● Ctrl-C, Ctrl-X和Ctrl-V执行拷贝、剪切、粘贴操作,Ctrl-A全选。原创 2024-05-06 19:47:20 · 1195 阅读 · 0 评论 -
GridCtrl包含哪些成员函数、变量,分别有什么功能?
数据展示:GridCtrl能够以表格形式展示数据,包括文本、图片等。编辑功能:用户可以编辑单元格的内容,如文本、数字等。排序和过滤:支持对行或列进行排序,以及根据条件过滤数据。打印支持:能够打印GridCtrl的内容,包括打印预览功能。自定义外观:可以自定义单元格的文本、字体、颜色等外观属性。交互性:支持鼠标和键盘操作,如选择单元格、滚动表格等。事件处理:能够响应用户操作,如点击、双击、选择等,并执行相应的操作或触发事件。原创 2024-05-06 16:51:22 · 517 阅读 · 0 评论 -
MFC中CPropertyPage与CDialogEx的作用是什么,有什么区别,什么情况下会需要继承这两个类?
是用于创建不同类型用户界面的类。以下是它们的作用、区别、使用方式以及何时需要继承这两个类的详细说明。都是MFC中用于创建用户界面的重要类,选择使用哪个类取决于你的具体需求和设计。在MFC(Microsoft Foundation Classes)库中,四、何时需要继承这两个类。原创 2024-04-20 09:09:33 · 1073 阅读 · 0 评论 -
MFC中CString类都有哪些成员函数,分别什么作用,如何使用它们?
CString类在 MFC(Microsoft Foundation Classes)中提供了丰富的成员函数来操作和处理字符串。以下是一些主要的CString。原创 2024-03-15 16:27:01 · 1055 阅读 · 0 评论 -
MFC中CString的用法及使用示例
CString是 Microsoft Foundation Classes (MFC) 库中的一个类,用于处理 C 风格的字符串。它提供了很多有用的方法和函数,使得字符串的操作变得更加简单和安全。下面是一些CString。原创 2024-03-15 16:15:59 · 1677 阅读 · 0 评论 -
MFC中手动create创建的窗口,如何销毁释放?
这通常涉及删除窗口对象并调用其析构函数,这将负责清理与窗口相关联的资源。总之,当你手动创建MFC窗口时,确保通过删除窗口对象或调用适当的销毁函数来正确释放资源。一旦窗口被销毁,任何尝试访问其句柄或成员的操作都应该是无效的。如果你的窗口是父窗口(例如主框架窗口)的子窗口,确保在销毁子窗口之前将其从父窗口中移除。请注意,如果你直接管理窗口句柄,还需要确保在销毁句柄之前释放与该窗口相关的所有资源,例如字体、位图等。删除窗口对象时,其析构函数将被调用,MFC将负责执行必要的清理操作,包括销毁窗口句柄。原创 2024-03-13 15:53:51 · 1370 阅读 · 0 评论 -
C++中FindWindow函数使用方法及示例
在C++的Windows编程中,FindWindow函数是用于根据窗口的类名或窗口名来查找窗口句柄的API函数。这对于与特定窗口进行交互,比如发送消息或操作窗口控件,非常有用。原创 2024-03-13 15:40:19 · 3035 阅读 · 0 评论 -
C++中PostMessage和SendMessage函数的用途、区别、使用方法及使用示例
在C++的Windows编程中,和是用于进程间通信(IPC)的重要函数,特别是在同一应用程序的不同部分或不同应用程序之间发送消息时。这两个函数都用于向窗口发送消息,但它们在发送方式和行为上有所不同。原创 2024-03-13 14:32:04 · 2174 阅读 · 0 评论 -
C++中,不同进程间进行内存共享的方法及使用示例
在C++中,直接实现进程间内存共享的功能通常需要借助操作系统的支持。原创 2024-03-13 09:13:16 · 1313 阅读 · 0 评论 -
在windows系统中,如何使用C++调用在不同进程间进行内存共享的方法及使用示例
在Windows系统中,实现不同进程间内存共享的方法通常涉及使用命名内存映射文件(Named Memory-Mapped Files)或者Windows的API来创建共享内存区域。原创 2024-03-13 09:12:13 · 857 阅读 · 0 评论 -
MFC中内存共享调用方法及使用示例
注意,在使用共享内存时,必须确保所有进程都使用相同的共享内存名称,并且正确管理内存的生命周期和访问权限。此外,当多个进程或线程同时访问共享内存时,需要使用同步机制(如互斥锁、信号量等)来确保数据的一致性和完整性。在实际应用中,你可能还需要考虑如何同步访问、处理错误和异常情况,以及如何优雅地关闭和清理资源。该函数允许你指定共享内存的大小、访问权限和名称。在App2中,你需要使用相同的共享内存名称来打开和映射共享内存。返回的指针,你可以像访问常规内存一样访问共享内存。函数解除对共享内存的映射,并使用。原创 2024-03-12 19:32:22 · 1506 阅读 · 0 评论 -
MFC中字符串string类型和CString类型互转方法
在Microsoft Foundation Classes (MFC)中,CString是一个非常方便的类,用于处理C风格的字符串。有时,你可能需要在MFC的CString和C++标准库中的之间进行转换。原创 2024-03-11 09:03:20 · 3337 阅读 · 0 评论 -
MFC中CString的MakeUpper使用方法
在上面的示例中,我们创建了一个CString对象str,并将其初始化为"Hello, World!然后,我们调用了MakeUpper函数来将字符串中的字符全部转换为大写,并将返回的结果赋值给了另一个CString对象upperStr。然后,我们调用了MakeUpper函数来将字符串中的字符全部转换为大写。请注意,MakeUpper函数会修改原始的CString对象,而不是创建一个新的CString对象。在MFC中,CString类提供了MakeUpper函数来将字符串中的字符全部转换为大写。原创 2024-03-04 11:30:27 · 492 阅读 · 0 评论 -
C++中GetPrivateProfileInt用法详解
以上代码假设存在名为example.ini的INI文件,其中包含了一个名为Section的节和一个名为Key的键,并且该键的值为一个整型值。GetPrivateProfileInt是C++中一个用于读取INI文件中指定节(section)和键(key)的整型值的函数。如果成功读取到了整型值,将输出该值;返回读取到的整型值。原创 2024-03-04 11:05:52 · 1740 阅读 · 0 评论 -
MFC开发的功能如何进行UT测试
MFC(Microsoft Foundation Classes)是Microsoft提供的一个用于Windows应用程序开发的类库。在MFC开发中,单元测试(UT,Unit Testing)是一个重要的环节,它有助于确保各个功能模块按预期工作。单元测试通常针对代码中的最小可测试单元(如函数、方法或类)进行。记住,单元测试是软件开发过程中的一个重要环节,它有助于提高代码质量、减少错误并加快开发速度。在MFC开发中,通过遵循上述步骤,你可以有效地实施单元测试策略。原创 2024-02-07 08:46:16 · 630 阅读 · 0 评论