MFC学习笔记1

本文介绍了MFC程序的入口点WinMain,详细讲解了窗口类的注册、消息循环和窗口函数。通过消息映射机制展示了如何处理不同消息。此外,还探讨了对话框的运行、模态与非模态对话框,以及MFC控制台程序设计。同时提到了进程和线程的概念,以及核心对象在MFC中的应用。
摘要由CSDN通过智能技术生成
【程序进入点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)















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值