MFC
MFC学习过程中的心德记录
迪迦 • 奥特曼
C/C++ coder
展开
-
MFC新添加的菜单项在没有任何处理时菜单项呈 灰色
MFC新添加的菜单项在没有任何处理时是呈灰色的,只有添加了COMMAND命令后才会不显示灰色。在只添加ON_UPDATE_COMMAND_UI消息也还是灰色,在OnUpdateAddUser(CCmdUI *pCmdUI)函数中可以添加pCmdUI->Enable(true);也可以去掉灰色【注意】只是修改菜单项的属性 enable为true也是不可以的。消息区别:ON_UPDATE_COMMAND_UI: 是点击 菜单上的 主菜单时就会调用 红色框 系统管理 如果是界面处理,可以在此进行。【点击系转载 2022-06-14 17:51:56 · 1295 阅读 · 0 评论 -
WM_CREATE ,WM_NCCREATE,WM_DESTROY,WM_NCDESTROY详解
通常我们理解在窗口创建时发出消息WM_CREATE,但是在这个消息之前还有一个消息是被发出的WM_NCCREATE。即:WM_NCCREATEWM_CREATE对应的,在窗口被关闭时发出消息WM_DESTROY,WM_NCDESTROY。顺序:WM_DESTROYWM_NCDESTROY这里要注意的是,在一个窗口被关闭时,如果这个窗口存在子窗口,那么会先发送子窗口的WM_DESTROY和WM_NCDESTROY消息,接着发送父窗口的WM_DESTROY和WM_NCDESTROY消息。顺序:转载 2022-01-09 22:19:48 · 726 阅读 · 0 评论 -
Windows编程—BroadcastSystemMessage函数详解
介绍BroadcastSystemMessage函数 可以发送一个消息给指定一类接受者(从Broadcast就可以看出,广播的意思)。这里的接受者可以是,一般的应用程序、可装载的驱动程序、网络驱动程序、系统级的设备驱动程序 或者 上述的任意组合。函数原型long BroadcastSystemMessage( // 广播选项 DWORD flags, // in:指定接受这个消息的接受者类别;out:实际接收消息的接受者类别 LPDWORD lpInfo,转载 2022-01-08 22:38:17 · 840 阅读 · 0 评论 -
通过MFC实现数码管显示功能
使用VS2015,如果其他版本不能正常运行自己新建项目,比较简单。功能:通过按钮使数码管显示的数字加1。1、新建MFC应用程序,这里命名为MyTest,引导选择基于对话框,其他默认。2、将3DBar.cpp、3DBar.h和StaticCounter.cpp、StaticCounter.h分别添加到头文件与源文件。相应文件自己到文末链接项目中拷贝出来。3、从工具栏中添加文本框“Static Text”,ID为IDC_LCD_NUM;添加Button,ID为IDC_BUTTON_UP。4、选中文本转载 2020-08-08 08:52:40 · 941 阅读 · 0 评论 -
MFC 的List Control控件实现可编辑
亲测可用,如果出现问题,请留言所谓List Contro l,就是用来做LIist的,至于编辑,估计MS也没提供这个功能。比较诡异的是在给List Control 设置属性的时候居然看到Edit Label ,处于好奇点了点,发现只能修改第一列,改了之后失去焦点又变 回原来的文本。没有深入试下去,我估计可以修改第一列的数据。其实要实现编辑功能,只要做一个Edit Control 就可以了,当需要编辑的时候,把这个Edit Control 动态显示到需要显示的地方。看效果图:双击输入框:输入完成.转载 2020-07-11 23:46:19 · 4535 阅读 · 5 评论 -
MFC中禁掉一个对话框中的所有控件
要点用EnumChildWindows()对所有控件执行某个操作。用GetClassName()获取控件的名称,用于做特殊处理。示例把对话框中的所有控件都Disable掉,——除了OK&Cancel。或者,不处理Button(包括普通的Button、Radio Button、Check Button等)、Edit。在对话框中(凌乱地)放了一些控件,如下:第一种情况:禁掉所有的控件(除了OK、Cancel,否则没法关掉窗口了)示例代码头文件:private: static转载 2020-05-13 20:54:52 · 833 阅读 · 0 评论 -
未能检索对话框的控件
我的解决办法是相应类的头文件里中,有类似如下的代码// 对话框数据#ifdef AFX_DESIGN_TIME enum { IDD = IDD_DIALOG3 };#endif把后面的IDD_DIALOG3 改为新的id就可以了。原创 2020-05-13 21:39:12 · 1806 阅读 · 2 评论 -
CoInitializeSecurity 返回0x80010119 - 在整理或打乱任何接口之前,必须初始化安全机制。一旦初始化,不能再作更改。
错误 0x80010119为:RPC_E_TOO_LATE CoInitializeSecurity has already been called。说明CoInitializeSecurity 已经被调用过,这不算是错误。判断该函数执行是否成功的方法应为:HRESULT hr;hr = CoInitialzieSecurity();if (SUCCEED(hr) || RPC_E_TOO_LATE == hr){ // ... // ...} 另外,MSDN中提到过,这个初始化转载 2020-05-15 20:22:29 · 1851 阅读 · 0 评论 -
MFC窗口style为overlapped popup child三者的区别
中文翻译OVERLAPPED --> 重叠窗口popup —> 弹出式窗口child --> 子窗口基本不同overlapped窗口,从窗口关系的角度,可独立存在。child窗口,依附父窗口,随parentwindow存在而存在,显示在parent内部Popup窗口,弹出窗口,依附于parentwindow窗口,随parentwin...转载 2020-02-21 19:47:39 · 1686 阅读 · 0 评论 -
VS2015调试分析MFC源代码的方法
今后在分析MFC代码的时候,没有办法进入MFC的源代码,后来在查找资料后,终 于解决了,在这里记录一下。很简单,就两步:工具->选项->调试,进入下面的窗口按照上图的方法,把相关的选项给钩上。右击项目,选 择属性,出现如下对像话框,选择成红框的部分,点确定即可。打好断点,就可以开始调试了,如下图所示。注意:在第一次运行的时候,会从微软服务器下载相庆的符...原创 2020-02-18 12:11:33 · 1975 阅读 · 1 评论 -
MFC之IP控件(IP地址与CString的互相转化)
1.获得IP地址:CIPAddressCtrl * pIP = (CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS1);BYTE nf1, nf2, nf3, nf4;pIP->GetAddress(nf1, nf2, nf3, nf4);CString str;str.Format(_T("%d.%d.%d.%d"), nf1, nf2, nf3,...转载 2020-01-07 10:31:08 · 923 阅读 · 1 评论 -
MFC中使用GDI+ 显示图片
打开stdafx.h头文件,添加头文件和库。#pragma comment( lib, "gdiplus.lib" ) // VS2015使用可以去掉#include "gdiplus.h"using namespace Gdiplus;在CXXWinApp 内添加成员变量ULONG_PTR m_gdiplusToken;在CXXWinApp::InitInstance...原创 2019-12-11 21:40:18 · 996 阅读 · 0 评论 -
Win32双缓冲绘图和位图的绘制
前言:为什么需要使用双缓冲技术?可能很多朋友会问,不知道你们有没有发现,当屏幕刷新的时候会有闪烁,这样让人的体验感极差。原因是绘图与显示器刷新不同步,有时间差,为解决这一问题,这就需要用到双缓冲技术来绘图了。双缓冲技术是相对单缓冲而言的,单缓冲就是直接在设备DC上绘图;而双缓冲就是先在一个与设备DC相兼容的内存缓冲区里进行绘图,然后再一次性复制到设备DC上。一次性在屏幕上显示就不会出现闪烁的现象...转载 2019-12-10 12:31:21 · 349 阅读 · 0 评论 -
_USRDLL _AFXDLL _WINDLL 三种dll编译宏的具体含义
常见的编译参数VC建立项目时总会定义"Win32"。控制台程序会定义"_CONSOLE",否则会定义"_WINDOWS"。Debug版定义"_DEBUG",Release版定义"NDEBUG" 与MFC DLL有关的编译常数包括: _WINDLL 表示要做一个用到MFC的DLL _USRDLL 表示做一个用户DLL(相对MFC扩展DLL而言,静态) _AFXDLL 表示使用MFC动...转载 2019-12-05 13:52:07 · 798 阅读 · 0 评论 -
多线程MT和多线程MD的区别
区别1:全局堆句柄不一样。网上有一个说法,就是一个线程一个栈,一个模块一个堆。前者很容易有理解,每个线程创建的时候在CreateThread中都能制定默认栈大小,只是很多情况下都取了默认值。而一个模块一个堆呢?其实很简单测试,如果是一个多线程MT编译方式的程序,你写一个dll,导出一个函数,参数设置为vector,然后在exe中调用,当导出函数结束时就会崩溃掉。其实原因很简单,就是因为初始化向量...转载 2019-12-05 13:46:49 · 160 阅读 · 0 评论 -
静态/共享的规则MFC DLL/MFC扩展DLL详解
在编写MFC程序的时候,通常需要编写dll库以供其他程序调用。关于MFC dll的相关知识很多很杂,这里特酷吧结合自己学习中遇到的问题专门整理了一些MFC dll的基础知识。本部分共上下两篇文章,本文为上篇,MFC DLL应用程序类型分为以下三种:(1)使用共享MFC DLL的规则DLL(2)带静态链接MFC的规则DLL(3)MFC扩展DLL下面重点解释一下这些DLL的含义区别:一,规则...转载 2019-11-29 15:50:35 · 589 阅读 · 0 评论 -
C++ AFX_MANAGE_STATE(AfxGetStaticModuleState())的作用
AFX_MANAGE_STATE(AfxGetStaticModuleState())的作用:用于模块切换时的状态保护,AfxGetStaticModuleState()指向当前模块状态;当前函数调用结束后原模块的状态自动被恢复;用于DLL中所调用MFC函数、类、资源时的模块状态切换;[ MSDN ]By default, MFC uses the resource handle o...转载 2019-11-27 11:22:49 · 531 阅读 · 0 评论 -
MFC OnChar、OnKeyDown、OnKeyUp和PreTranslateMessage的关系
OnKeyDown是所有键盘按下去都会触发,OnChar紧紧是可见字符的按键。假设按下键盘上的任意一个键,则OnChar、OnKeyDown、OnKeyUp均会被调用。它们被调用的先后顺序为:1、OnKeyDown2、OnChar3、OnKeyUp在对话框应用程序中,无论用户是否操作鼠标或键盘,PreTranslateMessage函数始终不断地被调用。MSDN中关于PreTransla...转载 2019-11-22 11:22:49 · 775 阅读 · 0 评论 -
CHARRANGE 结构
CHARRANGE Structure该结构指定位于富编辑器内的字符范围。如果cpMin和cpMax成员相等,范围是空。如果cpMin是0且cpMax是-1,则该范围包含所有内容。语法typedef struct _charrange {LONG cpMin;LONG cpMax;} CHARRANGE;成员cpMinLONG所选范围的第一个字符的前一个位置。cpMax...转载 2019-11-10 17:07:45 · 210 阅读 · 0 评论 -
全面解读通知消息WM_NOTIFY
1、控件通知消息消息的分类有3种:窗口消息、命令消息和控件通知消息,我们这里要谈的是最后一种:控件通知消息。控件通知消息,是指这样一种消息,一个窗口内的子控件发生了一些事情,需要通知父窗口。通知消息只适用于标准的窗口控件,如按钮、列表框、组合框、编辑框,以及Windows公共控件如树状视图、列表视图等。例如,单击或双击一个控件、在控件中选择部分文本、操作控件的滚动条都会产生通知消息。 她类似于命...转载 2019-11-03 18:02:29 · 365 阅读 · 0 评论 -
OnPaint和OnDraw的区别
问题:我在视图画的图象或者文字,当窗口改变后为什么不见了?OnDraw()和OnPaint()两个都是解决上面的问题,有什么不同?答:OnDraw()和OnPaint()好象兄弟俩,因为它们的工作类似。至于不见了的问题简单,因为当你的窗口改变后,会产生无效区域,这个无效的区域需要重画。一般Windows会发送两个消息WM_PAINT(通知客户区 有变化)和WM_NCPAINT(通知非客户区有...转载 2019-10-16 21:26:36 · 263 阅读 · 0 评论 -
HWND、HANDLE、HMODULE、HINSTANCE的区别
HWND、HANDLE、HMODULE、HINSTANCE之间的差别不是在变量类型上,而是在语义上。HWND是线程相关的,你可以通过HWND找到该窗口所属进程和线程Handle 是代表系统的内核对象,如文件句柄,线程句柄,进程句柄。系统对内核对象以链表的形式进行管理,载入到内存中的每一个内核对象都有一个线性地址,同时相对系统来说,在串列中有一个索引位置,这个索引位置就是内核对象的han...转载 2019-02-10 18:42:08 · 1772 阅读 · 0 评论 -
CWnd与HWND的区别与转换 如何获取本窗体对象
一、区别 HWND是句柄,CWnd是MFC窗体类,CWnd中包含HWND句柄成员对象是m_hWnd. HWND是Windows系统中对所有窗口的一种标识,即窗口句柄。这是一个SDK概念。 CWnd是MFC类库中所有窗口类的基类。微软在MFC中将所有窗口的通用操作都封装到了这个类中,如:ShowWindow等等,同时它也封装了窗口句柄即m_hWnd成员。二、如何得到窗口对象指针CWn转载 2017-08-26 13:56:14 · 389 阅读 · 0 评论 -
error LNK2005: _DllMain@12 已经在 XXXX.obj 中定义
出现这种问题的情形有很多,这里只说明下我遇到的这种情形及其解决方法:问题原因:1、 用VS的MFC DLL模板建立DLL项目;2、出于实际需要,将自动生成的App模板代码删掉,改用win32风格的DLL入口: BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_cal...转载 2019-10-06 10:08:03 · 514 阅读 · 0 评论 -
AFX_MANAGE_STATE,DLL关于资源切换
应用程序进程本身及其调用的每个DLL模块都具有一个全局唯一的HINSTANCE句柄,它们代表了DLL或EXE模块在进程虚拟空间中的起始地址。进程本身的模块句柄一般为0x400000,而DLL模块的缺省句柄为0x10000000。如果程序同时加载了多个DLL,则每个DLL模块都会有不同的 HINSTANCE。应用程序在加载DLL时对其进行了重定位。 共享MFC DLL(或MFC扩展DLL)的规则转载 2018-01-19 10:51:08 · 382 阅读 · 1 评论 -
MFC 防止多线程卡死
Par p; p.CmdLine = _T("ping 127.0.0.1"); HANDLE handle = CreateThread(NULL, 0, ExecuteCmd, &p, 0, NULL); while (TRUE){ DWORD result; MSG msg; result = MsgWaitForMult原创 2017-12-20 22:15:35 · 1579 阅读 · 0 评论 -
CFile与CStdioFile的区别
一. CFile类操作文件默认的是Binary模式,CStdioFile类操作文件默认的是Text模式。 在Binary模式下我们必须输入’\r\n’,才能起到回车换行的效果,’\r’只是回车(回到当前行的第一列),’\n’只是换行(到达下一行的当前列)。 而在Text模式下’\r’的工作是自动完成的,当我们写一个’\n’的时候,系统会自动帮我们在其前面加上一个’\r’,然后保存到文件里。转载 2017-12-20 20:31:11 · 795 阅读 · 0 评论 -
MFC 服务管理
#include <winsvc.h>void CStartServiceDlg::OnBnClickedButton1(){ // 打开服务管理对象 SC_HANDLE hSC = ::OpenSCManager( NULL,NULL, GENERIC_EXECUTE); if( hSC == NULL) { TRACE( "open SC转载 2017-10-16 10:52:11 · 398 阅读 · 0 评论 -
matlab2014a + win764bit + vs2013混合编程(.m转成dll供C++调用)
在matlab中可以通过mbuild工具将.m文件编译成dll文件供外部的C++程序调用,这样就可以实现matlab和C++混合编程的目的。 1. 使用matlab生成dll文件 1.1 首先需要带有mcc编译器的matlab软件,这个可以通过在matlab命令行中输入:!mcc命令来查看 1.2然后再命令窗口输入mbuild -setup选中要使用的C++编译器,在这里我选择了VS201转载 2017-08-16 13:36:03 · 534 阅读 · 0 评论 -
后台调用外部程序的完美实现(使用CreateDesktop建立隐藏桌面)
提供思路,可用C++完整实现 最近在做的一个软件,其中有一部分功能需要调用其它的软件来完成,而那个软件只有可执行文件,根本没有源代码,幸好,我要做的事不难,只需要在我的程序启动后,将那个软件打开,在需要的时候,对其中的一个文本矿设置一些文字,再点击一个按钮就可以了。说到这里,相信你也有了对该功能的一些初步设想了,没错,其基本思路就是: 1)调用CreateProcess()打开目标程序。转载 2017-08-21 13:51:39 · 2498 阅读 · 0 评论 -
更改MFC标题栏图标和生成的执行文件图标
创建一个新工程,可以什么都不加。打开.rc, 创建或打开Icon资源(以下都以Icon为例)。 单击工程窗口的资源视图标签,选中资源ID为IDR_MAINFRAME图标资源,然后按Delete键把它删除掉,当然也可以不删,具体后面会讲到。 从资源菜单中选择Resource,然后选择Icon,添加资源,选中Icon类型,点击导入,此时会叫你选择本地的图片,记住必须选择.ioc格式的图片,否则导转载 2017-08-22 14:43:00 · 392 阅读 · 0 评论 -
关于模态/非模态对话框不响应菜单的UPDATE_COMMAND_UI消息
对于模态非模态对话框默认是不响应菜单的UPDATE_COMMAND_UI消息的,需要增加对WM_INITMENUPOPUP消息的处理以后,才可以响应UPDATE_COMMAND_UI。void CXXXDlg::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu) { CDialog::OnInitMenuPo转载 2017-08-24 19:12:27 · 417 阅读 · 0 评论 -
VS2013 MFC 设置组
VS2013 设置组 第一步,进入对话框内,点开格式->tab键顺序,也可以直接按 ctrl+D,表示出每个控件的Tab键顺序,把需要在一组的控件调成连续的数字。 第二步,把要做第一个组的控件的group属性设成True,接下来和它同一组的控件的group属性设为False。直到第二个组开始,第二个组的第一个控件的group属性也设置为True,接下来属于第二组的控件的group属性设原创 2018-02-03 17:01:06 · 450 阅读 · 0 评论 -
MFC编辑框自动换行,垂直滚动条自动下移
1.新建一个编辑框控件(Edit Control),将其多行(Multiline)前面打勾(属性设置为True),Auto HScroll前面的勾去掉(属性设置False),这样就可以实现每一行填满后自动换行了。2.再将垂直滚动条(Vetrical Scroll)前面打勾(属性设置为True),当输入或显示超过编辑框的大小后就会出现垂直滚动条。3.如果是输入,滚动条会自动移动跟随到当前输入...转载 2018-02-20 23:13:39 · 415 阅读 · 0 评论 -
Visual Studio 代码生成 运行时库的选择
运行时库的选项有:多线程(/MT)、多线程调试(/MTD)、多线程DLL(/MD)、多线程调试(/MDd) 有时调用外部的一些库,这个选择不对,老编译不通过; C运行时库 库文件 single thread(static link) ML libc.lib debug single thread(static link) MLd libcd.lib...转载 2018-02-24 21:02:18 · 1401 阅读 · 0 评论 -
CListCtrl选中行
1、设置CListCtrl选中行m_list.SetItemState(nIndex,LVIS_FOCUSED | LVIS_SELECTED,LVIS_FOCUSED | LVIS_SELECTED);注意:这句代码只是让指定行高亮显示,如果使用后再用GetSelectionMark函数来得到选中行,结果往往是错误的。比如,先用鼠标点击选中第5行,调用GetSelectionMark函数得...转载 2019-09-18 18:23:07 · 786 阅读 · 0 评论 -
MFC对话框程序中列表控件(CListCtrl)的响应消息
缩写注解HDNHeader NotifyLVNListView control NotifyNMNotify MessageTVNTreeView control Notify响应消息解析HDN_BEGINTRACK开始拖动控件顶部的分割线HDN_BEGINDRAG开始拖动控件顶部的分栏(item)HDN_BE...转载 2019-09-18 11:06:09 · 957 阅读 · 0 评论 -
ListCtrl 风格
LVS_ICON: 为每个item显示大图标LVS_SMALLICON: 为每个item显示小图标LVS_LIST: 显示一列带有小图标的itemLVS_REPORT: 显示item详细资料直观的理解:windows资源管理器,“查看”标签下的“大图标,小图标,列表,详细资料”...转载 2019-09-17 20:55:45 · 297 阅读 · 0 评论 -
StringCchPrintf
简介StringCchPrintf是sprintf的一个替代品,它接受一个格式字符串和参数列表和返回一个格式化字符串。声明HRESULT StringCchPrintf( LPTSTR pszDest, size_t cchDest, LPCTSTR pszFormat, ...);需要包含的头文件st...转载 2019-09-14 15:21:37 · 2004 阅读 · 0 评论 -
VS生成DLL没有产生lib的解决方法
使用vs生成DLL时,没有产生lib,一般发生在我们自己创建的DLL项目中,产生这个问题的主要原因是没有导出类。导出DLL标记有两种方法,只要采用其中一种就可以解决。1.添加def文件在工程上右键 -&gt; 添加 -&gt; 新建项 -&gt; 选"模块定义文件(.def)" -&gt; 随便输入个名字 -&gt; 添加2.导出类#define __DLL_H__#define原创 2019-01-03 14:53:31 · 28186 阅读 · 0 评论