MFC学习笔记1

本文介绍了MFC程序的入口点WinMain,详细讲解了窗口类的注册、消息循环和窗口函数。通过消息映射机制展示了如何处理不同消息。此外,还探讨了对话框的运行、模态与非模态对话框,以及MFC控制台程序设计。同时提到了进程和线程的概念,以及核心对象在MFC中的应用。
【程序进入点WinMain】
main是一般C语言的进入点:
int main(int argc, char *argv[ ], char *envp[ ]);
{
...
}
WinMain是Windows程序的进入点:
int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
...
}
【窗口类之注册与窗口之诞生】
function InitApplication: 注册窗口类
function InitInstance: 产生窗口
【消息循环】
初始化工作完成后,WinMain进入所谓的消息循环:
while(GetMessage(&msg,...)) {
TranslateMessage(&msg); //转换键盘消息
DispatchMessage(&msg); //分派消息
}
【窗口的生命中枢:窗口函数】
消息循环中的DispatchMessage函数将消息分派至——>窗口函数。
窗口函数的结构形式为:
LRESULT CALLBACK WndProc(HWND hWnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
【消息映射(Message Map)的雏形】
//定义一个结构体和一个宏
struct MSGMAP_ENTRY {
UINT nMessage;
LONG (*pfn)(HWND, UINT, WPARAM, LPARAM);
};


#define dim(x) (sizeof(x) / sizeof(x[0]))
//消息与处理例程的对照表格(数组_messageEntries[])
struct MSGMAP_ENTRY _messageEntries[] = {
//消息 //消息处理程序
WM_CREATE, OnCreate,
WM_PAINT, OnPaint,
WM_SIZE, OnSize,
WM_COMMAND, OnCommand,
WM_SETFOCUS, OnSetFocus,
WM_CLOSE, OnClose,
WM_DESTROY, OnDestroy,
};
//Command-ID与处理例程的对照表格(数组_commandEntries[])
struct MSGMAP_ENTRY _commandEntries[] = {
//WM_COMMAND命令项 //命令处理程序
IDM_ABOUT, OnAbout,
IDM_FILEOPEN, OnFileOpen,
IDM_SAVEAS, OnSaveAs,
};
于是窗口函数可以这样设计:
//窗口函数
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int i;
for(i=0;i<dim(_messageEntries);i++) {
if(message == _messageEntries[i].nMessage)
return ((*_messageEntries[i].pnf)(hWnd, message, wParam, lParam));
}
return (DefWindowProc(hWnd, message, wParam, lParam));
}
//OnCommand--专门处理WM_COMMAND
LONG OnCommand(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int i;
for(i=0;i<dim(_commandEntries);i++) {
if(LOWORD(wParam) == _commandEntries[i].nMessage)
return ((*_commandEntries[i].pnf)(hWnd, message, wParam, lParam));
}
return (DefWindowProc(hWnd, message, wParam, lParam));
}
//--------------------------------------------
LONG OnCreate(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
...
}
//--------------------------------------------
LONG OnAbout(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
...
}
这样,WndProc和OnCommand永远不必改变,每当有新的要处理的消息时,只要在_messagaEntries[]和_commandEntries[]中加入新元素,并针对新消息写新的处理例程即可。
【对话框的运行】
对话框分为两类:
1.modal对话框:令其父窗口无效,直到对话框结束;
2.modaless对话框:父窗口与对话框共同运行。
为了做出一个对话框,程序员必须准备两个东西:
1.对话框模板(dialog template):在RC文件中定义的一个对话框外貌;
2.对话框函数(dialog procedure):形态类似于窗口函数,但通常只处理WM_INITDIALOG和WM_COMMAND。
对话框的激活与结束,依靠两个函数:DialogBox和EndDialog。
对话框处理过消息,return TRUE;为处理过消息,return FALSE.
【模块定义函数(.DEF)】
【资源描述文件(.RC)】
【空闲时间的处理:OnIdle】
空闲时间(idle time):“系统中没有任何消息等待处理”的时间。
厚爱工作最适宜在空闲时间完成。传统的SDK程序如果要处理空闲时间,可以以下列循环取代WinMain中传统的消息循环:
while(TRUE) {
if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
if(msg.message == WM_QUIT)
break;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else {
OnIdle();
}
}
【Console程序】
main+printf
【JBACKUP:Win32 Console程序设计】
JBACK检查SrcDir中的所有的文件和DstDir中所有文件,最后效果是是DstDir中的文件和SrcDir中的保持一致。
【MFCCON:MFC Console程序设计】
//file: MFCCON.CPP
#include <afx.h>
#include <stdio.h>


int main() 
{
int lo , hi;
CString str;
CStdioFile fFibo;

fFibo.Open("FIBO.DAT", CFile::modeWrite | CFile::modeCreate | CFile::typeText);
str.Format("%s\n", "Fibonacci sequence, less than 100 :");
printf("%s", (LPCTSTR) str);
fFibo.WriteString(str);

lo = hi = 1;

str.Format("%d\n", lo);
printf("%s", (LPCTSTR) str);
fFibo.WriteString(str);

while(hi < 100) {
str.Format("%d\n", hi);
printf("%s", (LPCTSTR) str);
fFibo.WriteString(str);
hi = lo + hi;
lo = hi - lo;
}

fFibo.Close();
return 0;
}
【进程和线程(Process and Thread)】
一个进程包含多个线程
关于进程和线程这里有一个很好的解释:http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html
【核心对象】
核心对象就是“全民对象”,系统给予核心对象一个计数值(usage count)
event -- CreateEvent
mutex -- CreateMutex
semaphore
file
file-mapping
processes
thread


以_beginthreadex取代CreateThread
编程优先级(Priority)















代码下载地址: https://pan.quark.cn/s/bc087ffa872a "测控电路课后习题详解"文件.pdf是一份极具价值的学术资料,其中系统地阐述了测控电路的基础理论、系统构造、核心特性及其实际应用领域。 以下是对该文献的深入解读和系统梳理:1.1测控电路在测控系统中的核心功能测控电路在测控系统的整体架构中扮演着不可或缺的角色。 它承担着对传感器输出信号进行放大、滤除杂音、提取有效信息等关键任务,并且依据测量与控制的需求,执行必要的计算、处理与变换操作,最终输出能够驱动执行机构运作的指令信号。 测控电路作为测控系统中最具可塑性的部分,具备易于放大信号、转换模式、传输数据以及适应多样化应用场景的优势。 1.2决定测控电路精确度的关键要素影响测控电路精确度的核心要素包括:(1)噪声与干扰的存在;(2)失调现象与漂移效应,尤其是温度引起的漂移;(3)线性表现与保真度水平;(4)输入输出阻抗的特性影响。 在这些要素中,噪声干扰与失调漂移(含温度效应)是最为关键的因素,需要给予高度关注。 1.3测控电路的适应性表现测控电路在测控系统中展现出高度的适应性,具体表现在:* 具备选择特定信号、灵活实施各类转换以及进行信号处理与运算的能力* 实现模数转换与数模转换功能* 在直流与交流、电压与电流信号之间进行灵活转换* 在幅值、相位、频率与脉宽信号等不同参数间进行转换* 实现量程调整功能* 对信号实施多样化的处理与运算,如计算平均值、差值、峰值、绝对值,进行求导数、积分运算等,以及实现非线性环节的线性化处理、逻辑判断等操作1.4测量电路输入信号类型对电路结构设计的影响测量电路的输入信号类型对其电路结构设计产生显著影响。 依据传感器的类型差异,输入信号的形态也呈现多样性。 主要可分为...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值