MFC_笔记

我的大学--孙鑫MFC笔记教程 孙鑫MFC笔记教程(1)--Windows程序的内部运行原理   源文档 http://blog.youkuaiyun.com/liufei_learning/archive/2010/09/02/5859925.aspx> 孙鑫MFC笔记教程(2)--C++经典语法与应用 阅读详情

1 调试并查看输出信息

1) 调用TRACE函数,用法类似于printf,但要注意:

 TRACE函数输出是在output窗口的debug选项下的,

只有debug版本调试才有输出,在relaase版本调试或者运行程序时,将看不到输出.

2) 使用AfxMessageBox()函数

3) 将标准输出定向到自己创建的控制台

4)使用OutputDebugString函数

但OutputDebugString只支持输入一个参数,可自定义如下:

void OutputDebugPrintf(const char * strOutputString,...)
{
    char strBuffer[4096]={0};
    va_list vlArgs;
    va_start(vlArgs,strOutputString);
    _vsnprintf(strBuffer,sizeof(strBuffer)-1,strOutputString,vlArgs);
    //vsprintf(strBuffer,strOutputString,vlArgs);
    va_end(vlArgs);
    OutputDebugString(strBuffer);
}
实例:OutputDebugPrintf("DEBUG_INFO | %d %s",600019,"tangxg");


2 项目结构

创建项目后自动生成三个类:

CAboutDlg:关于对话框类

CXXXDlg:主对话框类

CXXXApp:初始化项目的APP类,对本应用程序进行实例化,创建时自动调用其构造函数CXXXApp::CXXXApp() , 这是程序创建的第一步


接下来程序会调用winmain函数

通过InitInstance()函数初始化窗口,

windows程序的事件是通过消息驱动的,每个消息触发一个响应事件,通过DECLARE_MESSAGE_MAP()联系在一起.


在构造函数中赋初值,在初始化函数中初始化控件。


恢复VS初始状态

开始 - 运行 - 输入devenv.exe /resetuserdata


3 常用

在OnInitDialog()函数中添加窗口初始化设置

在构造函数中对变量进行初始化

_T()是一个宏,使程序支持Unicode编码


Update(true)   刷新控件的值到对应的变量

Update(false)  拷贝变量值到控件显示


运行一个外部程序:

ShellExecute(
	hWnd: HWND; {指定父窗口句柄}
	Operation: PChar; {指定动作, 譬如: open、runas、print、edit、explore、find[2]  }
	FileName: PChar; {指定要打开的文件或程序}
	Parameters: PChar; {给要打开的程序指定参数; 如果打开的是文件这里应该是 nil}
	Directory: PChar; {缺省目录}
	ShowCmd: Integer {打开选项}
)



常用消息

WM_TIMER    定时器

WM_CLOSE   窗口关闭

WM_DESTROY    应用程序结束

WM_KEYDOWN   按钮按下


常用虚函数

PreTranslateMessage

PreCreateWindow



按钮常用属性:

Cation : 文本

ID

Disable : 是否可按下

Visible : 是否可见

Multiline : 多行


固定对话框大小:将对话框的外观选项"Boder" 改为 "Dailog Frame”,默认是 Resizing


对于静态文本,notifiy属性必须设置成true,才能响应鼠标点击事件


编辑框常用属性:

Multiline:多行

Password:文本以密码形式显示

Readonly:只读

Number:只输入数字

Lowercase:自动转换小写

Uppercase:自动转换大写

Horizontal sroll:水平滚动条,必须Multiline为true

Vertical croll:垂直滚动条,必须Multiline为true


控件变量分为两种:control 和 value

添加control类型变量用于设置控件的各种属性

添加value类型变量用于保存控件相关的各种变量值


单选按钮分组的第一个按钮的group属性必须为true


复选框属性:

left text :复选框的选框和文本左右互换

push like:复选框样式

GetCheck() :获取复选框状态

SetCheck() :设置复选框状态


定时器

//设置定时器
UINT_PTR SetTimer(
	HWND hWnd, // 窗口句柄
	UINT_PTR nIDEvent, // 定时器ID,多个定时器时,可以通过该ID判断是哪个定时器
	UINT nElapse, // 时间间隔,单位为毫秒
	TIMERPROC lpTimerFunc // 回调函数
);

//定时器响应(响应系统定义WM_TIMER消息):
    OnTimer( UINT nIDEvent );

//释放定时器:
    KillTimer( UINT nIDEvent );
	
//定时器回调函数
void CALLBACK TimerProc(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime )
在定时器消息响应函数OnTimer中,要先判断定时器ID


自定义消息
在类向导 -> 消息 -> 添加自定义消息

自己定义的消息ID必须大于WM_USER


组合框属性

data :添加数据

sort : true系统自动排序, false按照数据输入的顺序

type: simple一般不用, drop down默认,可以输入数据,也可以选择数据, drop list只能选择数据,不能输入数据


windows API

注意:MFC调用系统函数时,必须加::

发送指定消息到一个或多个窗口

LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam)
//hWnd:其窗口程序将接收消息的窗口的句柄。如果此参数为HWND_BROADCAST,则消息将被发送到系统中所有顶层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口,但消息不被发送到子窗口。
//Msg:指定被发送的消息。
//wParam:指定附加的消息特定信息。
//IParam:指定附加的消息特定信息。
//返回值:返回值指定消息处理的结果,依赖于所发送的消息。

AfxGetMainWnd()->m_hWnd :主窗口的句柄


CString <-> char* 转换                                                                                                                                       

参考文章:http://blog.youkuaiyun.com/flydream0/article/details/8543525/

Unicode编码模式下:

Csring -> char*

CString str1 =_T("123");  
int len =WideCharToMultiByte(CP_ACP,0,str1,-1,NULL,0,NULL,NULL);  
char *ptxtTemp =new char[len +1];  
WideCharToMultiByte(CP_ACP,0,str1,-1,ptxtTemp,len,NULL,NULL );  
  
//...  
delete[] ptxtTemp; 


问题1:                                                                                                                                                              

在vs2003, vs2005中用sprintf 会出现warning C4996: 'sprintf' was declared deprecated

或warning C4996: 'strcpy' was declared deprecated

或warning C4996: 'strcat' was declared deprecated的警告。

这里给出解决问题的一些方法。


方法一:调用VS2005鼓吹的那些带“_s”后缀的非标准函数,即在其后加上"_S",如sprintf改为sprintf_s    。
方法二:在文件最开始添加#define _CRT_SECURE_NO_DEPRECATE或#pragma warning(disable:4996)     ,这是忽略警告的方法(一般比较少用)。
方法三:干粹在工程属性中设置(推荐)。


在工程属性中设置的方法如下:
对于VC6:
打开Project----settings----Resources----Preprocessor definitions,
添加_CRT_SECURE_NO_DEPRECATE和_SCL_SECURE_NO_DEPRECATE这两个宏。


对于VS系列的版本:
打开项目----项目属性---配置属性----C/C++ ----预处理器----预处理定义,
添加_CRT_SECURE_NO_DEPRECATE和_SCL_SECURE_NO_DEPRECATE这两个宏。


问题2:                                                                                                                                                            

安装openssl:

1)安装perl

2)打开vs2013本机工具命令提示

3)设置安装路径:perl Configure VC-WIN32 --prefix=c:\some\openssl\dir

4)编译:nmake -f ms\ntdll.mak

5)测试:nmake -f ms\ntdll.mak test

6)安装:nmake -f ms\ntdll.mak install


在VS2013中添加openssl

1)配置属性——VC++目录——在include包含目录中新增"d:\openssl_lib\include"(存放编译后的库文件的目录中);
2)VC++目录——"Library files"选择中新增目录"d:\openssl_lib\lib"。
3)配置属性——链接器——输入——附加依赖项——libeay32.lib 和ssleay32.lib即可

或使用#pragma comment(lib,"libeay32.lib")

#pragma comment(lib,"ssleay32.lib")




100天学习MFC 读书笔记 060719 经过一轮的徘徊,灰心,..........................之后,暂定100天,看看能否入门,为了记念大学时的梦想,为了兴趣.学习内容按孙鑫的教程,>(暂不论这本书好坏,就是贵了点)(后记,原来已经有很多人作这个笔记了...............................................................)白天正常上班,学习只能抽空了 阅读详情

相关推荐

MFC学习笔记001

教程:B站黑马程序员MFC教程(3天) 网址:https://www.bilibili.com/video/BV1JW41147NX?p=1 需要下载API: VC++之MFC类库中文手册(修正者:一怀去意) (注:百度可以找到,百度网盘下载) 课程安排 第一天(Win消息机制,SDK编程基础): 1,基本概念介绍(SDK,API,句柄,消息队列,WinMain函数) 2,第一个Windows界面程序(WinAPI) 3,消息循环和窗口过程函数 4,第一个MFC程序(CWinApp,CFrameWnd)

m0_49218979的博客 1132

va_start和va_end使用详解

  本文主要介绍va_start和va_end的使用及原理。  在以前的一篇帖子Format MessageBox 详解中曾使用到va_start和va_end这两个宏,但对它们也只是泛泛的了解。  介绍这两个宏之前先看一下C中传递函数的参数时的用法和原理: 1.在C中,当我们无法列出传递函数的所有实参的类型和数目时,可以用省略号指定参数表void foo(...);void foo(parm_l...

weixin_33725270的博客 1139

《深入浅出MFC第2版》读书笔记(一)

第0章 你一定要知道(导读)        我是先知道有侯俊杰(侯捷)这样的一个人物,之后才知道有一本叫做《深入浅出MFC》的书是他的。        当我第一次真正有机会亲手捧起这本书的时候,其实我已经度过了MFC入门阶段,并且处于一个桀骜不驯的时期。什么是桀骜不驯的时期呢,当年我正在念大学,那个学期数据结构老师布置了个大作业,要求用VC来做客户端,但是在大学的教程安排里面是没有VC这门

duxiuxing的专栏 1282

【滴水逆向笔记】第一章 进制

目录前言一、进制的定义前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结二、使用步骤1.引入库2.读入数据总结 前言 第一个初级专题就是进制 一、进制的定义 n进制就是由n个符号随意组成,逢n进一 16进制转二进制 把一个十六进制的个位等转成四个数字表示的二进制数# 系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、

qq_46441427的博客 612

VS2015串口通信编程(MFC)笔记

3. 选用MSCOMM控件方式进行串口通信 (1). 只能打开不大于COM16的串口;该控件不能在其他线程中直接被调用,但可以将其操作封装到函数中被间接使用。 (2). 接收:MSCOMM控件中断事件,用于接收下位机消息。 (3). 发送:另外创建一个子线程用于控制发送流程。 m_pThread = AfxBeginThread(UpgradeThread, (LPVOID)(this), THREAD_PRIORITY_BELOW_NORMAL, 256 * 1024);//stack size = 25

sqh9595的博客 2万+

MFC工作笔记0002---MFC HelloWorld程序

技术交流QQ群【JAVA,C++,Python,.NET,BigData,AI】:170933152 1. class MyApp:public CWinApp这个意思是说 MyApp:继承自CWinApp 2. 这里public: BOOL InitInstance() 这个是定义了一个公有的方法 这里是创建了一个类的指针,分配了一块堆内存 给Frame这个对象. 然后: 这里是分别调用这个frame类中的,这两个方法 这个是把这个指针...

添柴程序猿的专栏 538

滴水逆向笔记(六.标志寄存器)

1.pushad 对比上面两图得知,pushad的作用相当于把这八个通用寄存器的值都依次存到了上面的内存单元,栈底对应的内存编号不变,而栈顶对应的内存编号也从原来的7c变为了5c 这个也不知道该咋说,就草率地对比两个图总结 2.popad 这里寄存器对应的内存编号也是稍作了变化,接下来看作用效果 这里可以看到它是将pushad执行之前8个寄存器对应的内存编号还原了回来,但是那些被涉及到的内存单元存储的值并没有变回来 ...

m0_51295934的博客 628

按钮的pushlike属性

介绍radio和checkbox的pushlike属性的使用方法 vc6.0代码

MFC学习笔记

MFC学习笔记(一) window消息机制: 1.1窗口 一个window应用 程序中至少有一个窗口,称做主窗口,供我们在客户区进行绘制。 1.2句柄 一个window应用程序包含光标,图标,画刷等部件,系统为这些资源分配好内存后会返回他们的标识号,就是句柄,例如在window应用程序中,使用窗口句柄来标识每个窗口。对窗口操作时,首先得到这个窗口的标识。 消息与消息队列 window是事件驱动方式的程序设计,主要是基于消息,当window应用程序开始执行时,系统会产生一个消息队列用来保存窗口消息,eg当窗口

LXH177的博客 2003

va_list(),va_start(),va_arg(),va_end() 详细解析

些宏定义在stdarg.h中,所以用到可变参数的程序应该包含这个头文件.下面我们写一个简单的可变参数的函数,该函数至少有一个整数参数,第二个参数也是整数,是可选的.函数只是打印这两个参数的值

别再被网站识别成机器人了!用Python的undetected_chromedriver+Selenium实现无痕自动化

本文详细介绍了如何利用Python的undetected_chromedriver和Selenium实现无痕自动化,突破现代网站的反爬系统。通过修正浏览器指纹、模拟人类操作行为,并结合实战案例,帮助开发者构建难以被识别的自动化脚本,适用于电商监控等场景。

weixin_30367169的博客 248

Visual C++MFC编程实例 学习笔记

最近在看这本书--《Visual C++MFC编程实例》,总体感觉是挺不错的,所以准备写一下笔记。

Jacky_Dai的专栏 445

知识图谱与人工智能本体论:构建机器认知的语义基石

本文探讨了知识图谱与人工智能本体论如何作为机器认知的语义基石,让AI从‘知道数据’迈向‘理解知识’。文章详细拆解了本体论的核心构件与构建方法,并阐述了从本体到知识图谱的实践路径,包括知识获取、融合、存储及推理应用,最终分析了其在智能搜索与专家系统等场景中带来的根本性重塑。

nginx7reverse的博客 909

Windows 编程学习笔记目录

MFC学习笔记

2401_82825368的博客 1703

dify工作流的原理

摘要: Dify 工作流是一个基于有向无环图(DAG)的智能任务编排系统,支持多节点(如LLM调用、API工具、条件分支等)的可视化拖拽与流程编排。其核心原理包括执行引擎(解析DAG并管理节点依赖)、上下文变量传递(类Jinja模板的变量引用机制)和状态持久化(存储执行日志与中间结果)。工作流通过事件驱动执行,支持异步任务调度,并与RAG知识库、LLM服务等模块深度集成,最终可发布为API或对话应用。技术栈基于Python(FastAPI+Celery)和PostgreSQL,实现低代码化的AI应用开发。

nbspzs的专栏 2184

Dell Precision 7920 Tower开机点不亮?别慌,看电源灯闪烁密码快速定位故障(附BIOS恢复指南)

本文详细解析了Dell Precision 7920 Tower工作站开机点不亮时的电源灯闪烁密码,帮助用户快速定位故障。从内存问题到BIOS恢复,再到CPU配置错误,提供了全面的诊断和修复指南,并附有实用的维护建议和工具推荐。

weixin_30892037的博客 482

深入浅出MFC学习笔记--转载从优快云,

侯捷《深入浅出MFC》 深入浅出MFC学习笔记:(第一章:win32基本概念,第二章:C++的重要性质) http://blog.youkuaiyun.com/ithzhang/article/details/7622830 深入浅出MFC学习笔记:(第三章MFC六大关键技术之仿真:类型识别,动态创建)  http://blog.youkuaiyun.com/ithzhang/arti

u010153219的专栏 735

MT6816磁编码器在无人机电调中的实战应用:从选型到调试全记录

本文详细介绍了MT6816磁编码器在无人机电调系统中的实战应用,涵盖选型、硬件集成、软件配置到飞行测试的全流程。通过对比霍尔传感器和光电编码器,突出MT6816在角度分辨率、安装公差和抗振动能力等方面的优势,为无人机动力系统提供高精度控制解决方案。

pandas7gardener的博客 232

《深入浅出MFC》学习笔记之一

-——《深入浅出MFC》学习笔记之一    http://www.gjwtech.com/vcandc/vc2shengruqianchumfc02.htm     龚建伟评:这篇学习笔记虽然不是系统的阐述某个问题,但读来让人感到收获不小,无论你是老鸟还是菜鸟,都会认同的。我希望XGM能够继续写下去,看了《深入浅出MFC》再来看这些笔记,也有温故知新之感 俟杰

HI的专栏 835

第三章:ESP32零基础教学 - 3.4 蓝牙通信

本文详细介绍了如何在ESP32上实现经典蓝牙和BLE通信,并提供了代码解释和示例。通过这些示例,你可以轻松地将蓝牙功能集成到你的物联网项目中。无论是经典蓝牙的简单串口通信,还是BLE的灵活服务架构,ESP32都能满足你的需求。

Hi__gril的博客 4017

Android功耗系列专题理论之二十一:Power Monitor测功耗详细说明和注意事项

本文详细介绍了PowerMonitor手机功耗测试仪的功能与使用方法。该设备通过硬件连接替代手机电池,实时监测电流、电压等参数,适用于研发测试、软件优化等场景。文章包含设备接线说明(电源、USB、手机供电等接口)、驱动安装步骤及常见问题排查,并详细讲解了功耗测量操作流程,包括电压设置、开机步骤、数据采集与导出方法。特别强调了测量注意事项,如固定屏幕亮度、关闭后台应用、确保稳定连接等,以确保测试数据准确性。最后提供了简易测量步骤和详细测量流程指导。

589
上一篇: RGB与HSB之间的转换公式
下一篇: nand flash_笔记
benjamin721
博客等级 码龄14年 18粉丝 63原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值