MFC架构
MFC的六大关键技术:
1)MFC程序的初始化过程
2)消息映射
3)运行时类型识别(RTTI)
4)动态创建
5)永久保存
6)消息传递
一、MFC的初始化过程:
MFC的架构组成:
1.要有CWinApp的派生类
2.必须在全局区定义一个派生类的对象
3.在CWinApp派生类中必须对InitInstance()函数进行重写
【在MFC软件工程中,以APP类中的InitInstance()函数作为主函数,连接MFC的平台使用static Library静态链接库】
#include "stdafx.h" class CMyApp:public CWinApp
{
virtual BOOL InitInstance()
{
AfxMessageBox("xx");
return TRUE;
}
};
CMyApp theApp;
/*
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
MessageBox(NULL,"Win32测试MFC程序","测试",0);
return 0;
}
*/
消息映射机制:
1.必须使用类向导建立一个窗口类(CWin)的派生类
2.必须建立派生类的对象,来接受客户界面返回的消息
//在窗口派生类中,每个消息都与一个成员函数相对应
3.消息映射函数,必须通过类向导(ClassWizard)建立
Win32的消息处理机制:
#include "stdafx.h"
BOOL CALLBACK DialogProc(
HWND hwndDlg, // handle to dialog box
UINT uMsg, // message
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
)
{
if(uMsg==WM_COMMAND)
{
if(LOWORD(wParam)==IDCANCEL)
{
EndDialog(hwndDlg,IDCANCEL);
return TRUE;
}
}
if(uMsg==WM_LBUTTONDOWN)
{
int x=LOWORD(lParam);
int y=HIWORD(lParam);
char ch[];
sprintf(ch,"(%3d,%3d)",x,y);
//MessageBox(NULL,ch,"",MB_OK);
SetWindowText(hwndDlg,ch);
}
if(uMsg==WM_MOUSEMOVE)
{
int x=LOWORD(lParam);
int y=HIWORD(lParam);
char ch[];
sprintf(ch,"(%3d,%3d)",x,y);
//MessageBox(NULL,ch,"",MB_OK);
SetWindowText(hwndDlg,ch);
}
return FALSE; } int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
//MessageBox(NULL,"Win32测试MFC程序","测试",0);
DialogBox(hInstance,(LPCSTR)IDD_DIALOG1,NULL,DialogProc);
return ; }
MFC的消息处理机制
//theApp: #include "stdafx.h"
#include"MainDlg.h"
class MyApp:public CWinApp
{
virtual BOOL InitInstance( )
{
//AfxMessageBox("cc",NULL,MB_OK);
//CDialog *dlg=new CDialog(IDD_DIALOG1);
//dlg->DoModal();
MainDlg *dlg=new MainDlg();
dlg->DoModal();
return TRUE;
}
};
MyApp theApp;
//MainDlg派生类
#include "stdafx.h"
#include "MainDlg.h" #ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif /////////////////////////////////////////////////////////////////////////////
// MainDlg dialog
MainDlg::MainDlg(CWnd* pParent /*=NULL*/)
: CDialog(MainDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(MainDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
} void MainDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(MainDlg)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
} BEGIN_MESSAGE_MAP(MainDlg, CDialog)
//{{AFX_MSG_MAP(MainDlg)
ON_WM_LBUTTONDOWN()
ON_WM_MOUSEMOVE()
ON_WM_RBUTTONDOWN()
//}}AFX_MSG_MAP
END_MESSAGE_MAP() /////////////////////////////////////////////////////////////////////////////
// MainDlg message handlers
BOOL MainDlg::OnInitDialog()
{
CDialog::OnInitDialog();
//Title
CDialog::SetWindowText("测试");
//Icon
HICON hicon=LoadIcon(AfxGetInstanceHandle(),(LPCSTR)IDI_ICON1);
CDialog::SetIcon(hicon,TRUE);
return TRUE;
}
void MainDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default CDialog::OnLButtonDown(nFlags, point);
CString str;
str.Format("(%d,%d)",point.x,point.y);
if(MK_SHIFT&nFlags)
str+="按下了Shift键";
if(MK_CONTROL&nFlags)
str+="按下了Ctrl键";
if(MK_LBUTTON&nFlags)
str+="按下了鼠标左键";
if(MK_MBUTTON&nFlags)
str+="按下了鼠标中键";
if(MK_RBUTTON&nFlags)
str+="按下了鼠标右键";
AfxMessageBox(str);
//CDialog::GetDlgItemText(IDC_TEXT_COORD,str);
}
void MainDlg::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default CDialog::OnRButtonDown(nFlags, point);
CDialog::OnLButtonDown(nFlags, point);
CString str;
str.Format("(%d,%d)",point.x,point.y);
if(MK_SHIFT&nFlags)
str+="按下了Shift键";
if(MK_CONTROL&nFlags)
str+="按下了Ctrl键";
if(MK_LBUTTON&nFlags)
str+="按下了鼠标左键";
if(MK_MBUTTON&nFlags)
str+="按下了鼠标中键";
if(MK_RBUTTON&nFlags)
str+="按下了鼠标右键";
AfxMessageBox(str);
}
void MainDlg::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default CDialog::OnMouseMove(nFlags, point);
CString str;
str.Format("(%d,%d)",point.x,point.y);
GetDlgItemText(IDC_TEXT_COORD,str);
}
MFC架构的更多相关文章
- 1.MFC架构分析
1.架构代码文件的结构 主要由四个部分组成 1.资源文件Resource.h:主要定义资源的ID 2.预编译文件:stdafx.h 可以用来解决头文件包含冲突的问题,定义一些需要全局性包含的文件. 3 ...
- 流程图浅析MFC架构
http://blog.csdn.net/qq2399431200/article/details/9035315
- 进入MFC讲坛的前言(五)
框窗.视图和文档及其关系 MFC架构的另外一个特色是它的框窗.视图和文档这个三位一体的结构,它是一个典型的MVC(Model.View and Controler)结构.严格的讲,框窗不属于MVC中的 ...
- vs2015c++/MFC入门知识全集/实例规范书籍视频下载孙鑫c++对话框计算器基础控件使用教程系列
VIP教程可免费看.可免费下载前部分试看教程地址:http://dwz.cn/4PcfPk免费下载地址:http://dwz.cn/mfc888 本课程目录 67章 [MFC项目开发第01天]Wind ...
- vc++MFC开发上位机程序
用vc++MFC开发过不少跟单片机通讯的上位机程序了.搞懂了MFC架构,开发还是很快的,与底层单片机程序通讯,可以用串口.usb.网络.短信形式.串口现在用的越来越少了,一般电脑跟单片机在一块,使用串 ...
- BCGcontrolBar(一) MFC界面库简介
原帖地址:http://blog.csdn.net/zw514159799/article/details/9148385 英文原文:http://www.bcgsoft.com/bcgcontrol ...
- MFC 学习笔记
MFC 学习笔记 一.MFC编程基础: 概述: 常用头文件: MFC控制台程序: MFC库程序: 规则库可以被各种程序所调用,扩展库只能被MFC程序调用. MFC窗口程序: 示例: MFC库中类的简介 ...
- 在VC6中基于dll开发插件用于各种图片显示(BMP/TGA/JPG/GIF/PNG/TIF/ICO/WMF/EMF/...)
一.图片显示 图片显示的方法: 1. 直接写程序 2. 第3方库 3. 调用COM组件的IPicture接口 4. 使用MFC的CPictureHolder类 5. 使用GDI+的CImag ...
- windows程序设计(二)
MFC架构组成 1.CWinApp的派生类 2.必须在全局区定义一个派生类的对象 3.在CWinApp派生类内必须要有InitInstance虚函数的重写函数 在MFC软件工程以App类中的InitI ...
随机推荐
- 8添加一些样式:开始学习CSS
CSS中简单的表达式,成为规则.一个典型的规则包括一个选择符.若干属性和属性值. 1.在XHTML中直接添加CSS样式,必须在<head>元素里添加样式开始和结束标记.(但这未必是最好的方 ...
- kafka监控系统
Metrics-Java版的指标度量工具之一 Metrics-Java版的指标度量工具之二 JAVA Metrics 度量工具使用介绍1 JAVA Metrics度量工具 - Metrics Core ...
- 如何获取DIV的id
$(obj).attr("id");参数可以是id也可以是其他例如name等属性
- 【转】NGUI创建UIRoot后报NullReferenceException的解决办法
本文参考自 http://forum.china.unity3d.com/thread-1099-1-1.html 使用NGUI版本3.7.5. 在创建了一个UIRoot后,有时会报NullRefer ...
- mysql源码重启
1.通过rpm包安装的MySQL service mysqld restart /etc/inint.d/mysqld start 2.从源码包安装的MySQL // linux关闭MySQL的命令 ...
- JVM 常用配置
JVM的配置,最常用的两个配置就是:-Xms512m –Xmx1024m -Xms设置JVM的初始化内存大小,-Xmx为最大内存大小,当突破这个值,将会报内存溢出,导致的原因有很多,主要是虚拟机的回收 ...
- Qt 2D绘图 渐变填充(三种渐变方式)
在qt中提供了三种渐变方式,分别是线性渐变,圆形渐变和圆锥渐变.如果能熟练应用它们,就能设计出炫目的填充效果. 线性渐变: 1.更改函数如下: void Dialog::paintEvent(QPai ...
- VS2015 多项目源码共享链接
Eclipse有这个功能,在一个项目中加入另一个项目文件夹的引用,源码包含过来,这样不必copy一份代码,只需要维护一份源代码.一直想在VS中找到这个功能,目前项目需要,终于google到了. htt ...
- KVO机制浅析和实例演示
什么是KVO? KVO是Key-Value-Observing的缩写,通过KVO这种机制对象可以通过它得到其他对象的某个属性的变更通知.这种机制在MVC模式下显得更为重要,KVO可以让视图对象经过控制 ...
- FragmentActivity和Activity的区别
[转载] 直说总结了: 1.fragmentactivity 继承自activity,用来解决android3.0 之前没有fragment的api,所以在使用的时候需要导入support包,同时继承 ...