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 ...
随机推荐
- Apache Kafka源码分析 - kafka controller
前面已经分析过kafka server的启动过程,以及server所能处理的所有的request,即KafkaApis 剩下的,其实关键就是controller,以及partition和replica ...
- [troubleshoot][archlinux][X] plasma(KDE) 窗口滚动刷新冻结(约延迟10s)(已解决,root cause不明,无法再次复现)
现象: konsole,setting等plasma的系统应用反应缓慢,在滚动条滚动时,尤为明显. 触发条件: 并不是十分明确的系统滚动升级(Syu)后,产生. 现象收集: 可疑的dmesg [ :: ...
- PDO知识
PDO: 一.含义: 数据访问抽象层 二.作用 :通过PDO能够访问其它的数据库 三. 用法: 1.造对象 ①$dsn="mysql:dbname=zz;host=localhost&quo ...
- Python的深拷贝与浅拷贝
一.前奏:熟悉Python内存管理 在Python中,变量在第一次赋值时自动声明,在创建—也就是赋值的时候,解释器会根据语法和右侧的操作数来决定新对象的类型. 引用计数器:一个内部跟踪变量 引用计数: ...
- Ajax返回中文乱码问题(未解决)
(未解决) 暂时使用办法:改用返回Map<String,String>形式的返回值,在ajax中获取json形式的数据.
- 一切从IL开始
IL是什么? IL是Intermediate Language的缩写,是.Net代码转化成机器语言的一个中间语言,因此又把IL语言称之为反汇编语言. IL工具有哪些? 俗话说,工欲善其事必先利其器.了 ...
- 设计模式:策略模式(Strategy)
定 义:它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化, 不会影响到使用算法的客户. 示例:商场收银系统,实现正常收费.满300返100.打8折.......等不同收费 ...
- Intent Flag(转)
转载自 http://blog.csdn.net/berber78/article/details/7278408 一. intent.setFlags()方法中的参数值含义: 1.FLAG_ACTI ...
- Popwindow自定义动画(nexus5不支持暂未解决)
遇到一个问题,先记录一下 PopWindow自定义动画 import android.app.Activity; import android.graphics.drawable.BitmapDraw ...
- android 直接启动其他应用的Service
最近在做一个小插件,没有图标没有activity,利用其他APK启动它的service. 直奔主题,插件A,安装插件的应用B. B安装A后,由于A刚被安装,没有注册广播接收器,这里不考虑AIDL.需求 ...