消息映射机制
在类中申明消息映射
//申明消息映射
DECLARE_MESSAGE_MAP()
开始消息映射与结束消息映射
将MFC中的消息写入到开始消息映射和结束消息映射中,进行消息处理
//开始消息映射
BEGIN_MESSAGE_MAP(CMainDlg, CDialog)//(类名,基类)
//MFC的消息
END_MESSAGE_MAP()
综合代码
stdafx.h
#include <afxwin.h> //MFC 的核心头文件
#include "resource.h"
#define OM_TESTMSG WM_USER +1 //自定义消息
FirstMFC.h
class CFirstApp :public CWinApp
{
public:
BOOL InitInstance();
//退出:清理工作
int ExitInstacne();
};
FirstMFC.cpp
#include "stdafx.h"
#include "FirstMFC.h"
#include "CMainDlg.h"
//3.定义CWinApp派生类的全局变量
//MFC 应用程序的核心对象,有且只有一个
CFirstApp theApp;//这个名字叫什么随便都可以
//InitInstance当作我们的入口函数,MFC初始化函数
//启动管理,初始化,虚函数
BOOL CFirstApp::InitInstance()
{
//CDialog dlg;//专门操作对话框的类
CMainDlg dlg;
dlg.DoModal();//弹出对话框
return TRUE;//初始化
}
int CFirstApp::ExitInstacne()
{
return 0;//返回函数:返回到WinMain函数的返回值
}
CMainDlg.h
//对话框类
//一个窗口类,只处理一个窗口
class CMainDlg :public CDialog
{
public:
CMainDlg();
//初始化函数,虚函数,重写
BOOL OnInitDialog();
//申明消息映射
DECLARE_MESSAGE_MAP()
public:
int OnCreate(LPCREATESTRUCT lpCs);
void OnPaint();
void OnTimer(UINT_PTR nID);
void OnSize(UINT, int, int);
void OnLButtonDown(UINT nFlags, CPoint point);
void OnLButtonUp(UINT nFlags, CPoint point);
void OnMouseMove(UINT nFlags, CPoint point);
void OnDropFiles(HDROP hDropInfo);
void OnOK();
void OnCancel();
void OnTest();
LRESULT OnTestMsg(WPARAM wParam, LPARAM lParam);
void OnClose();
void OnDestroy();
private:
HICON m_hIcon;
HICON m_hIcon1;
};
CMainDlg.cpp
#include "stdafx.h"
#include "CMainDlg.h"
#define TIME_ID 1
#define ICON_ID 2
//开始消息映射
BEGIN_MESSAGE_MAP(CMainDlg, CDialog)//(类名,基类)
ON_WM_CREATE()//窗口创建消息
ON_WM_PAINT()//绘图消息
ON_WM_CLOSE()//窗口关闭消息
ON_WM_TIMER()//定时器消息
ON_WM_SIZE() //窗口拖动大小消息
ON_WM_LBUTTONDOWN()//鼠标左键按下
ON_WM_LBUTTONUP()//鼠标左边抬起
ON_WM_DROPFILES()//拖动文件消息
ON_WM_MOUSEMOVE()//鼠标移动
ON_BN_CLICKED(IDOK, &CMainDlg::OnOK)//点击相应按钮,(点击的id,成员函数)
ON_BN_CLICKED(IDCANCEL, &CMainDlg::OnCancel)//点击取消
ON_BN_CLICKED(IDC_BTN_TEST, &CMainDlg::OnTest)//点击自定义测试按钮
ON_MESSAGE(OM_TESTMSG, &CMainDlg::OnTestMsg)//自定义消息
ON_WM_DESTROY()//销毁消息
END_MESSAGE_MAP()
//默认构造函数
CMainDlg::CMainDlg() :CDialog(IDD_MAIN_DLG)
{
}
//OnCreate函数相应WM_CREATE 消息
int CMainDlg::OnCreate(LPCREATESTRUCT lpCs)
{
//设置窗口标题
SetWindowText("这是ON_WM_CREATE消息");
return 0;
}
void CMainDlg::OnPaint()
{
CPaintDC dc(this);
dc.Rectangle(0,0,200,100);
//CMainDlg::OnPaint();
}
//OnInitDialog初始化函数,虚函数,重写 ,响应WM_INITDIALOG消息
BOOL CMainDlg::OnInitDialog()
{
//设置窗口标题
//SetWindowText("我的第一个MFC");
//加载icon
//Win32 ,WM_SETICON
//凡是调用Windows API 前面加两个::
//方法一 AfxGetInstanceHandle获取全局句柄
//m_hIcon =::LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(ID_MAIN_ICO));
//方法二
m_hIcon = ::LoadIcon(AfxGetApp()->m_hInstance, MAKEINTRESOURCE(ID_MAIN_ICO));
//方法三
//m_hIcon = theApp.LoadIcon(ID_MAIN_ICO);
SetIcon(m_hIcon, TRUE);//设置大图标 按table 可以显示
SetIcon(m_hIcon, FALSE);//设置小图标
//MFC 字符串
//CString 类型
//构造一个字符串
CString str("Hello MFC");
//开启定时器(自动获取时间的定时器)
SetTimer(TIME_ID, 1000, NULL);//计时器标识符,毫秒,定时器处理函数
//修改图标定时器
SetTimer(ICON_ID, 200, NULL);
m_hIcon1 = ::LoadIcon(AfxGetApp()->m_hInstance, MAKEINTRESOURCE(IDI_ICON2));
return TRUE;
}
//OnTimer相应ON_WM_TIMER消息
void CMainDlg::OnTimer(UINT_PTR nID)
{
static int nIcon=0;
switch (nID)
{
case TIME_ID://时间
{
CTime time = CTime::GetCurrentTime();
CString str=time.Format("当前时间:%Y-%m-%d %H:%M:%S");
SetWindowText(str);
break;
}
case ICON_ID://设置图标
{
if (nIcon == 0)
{
SetIcon(m_hIcon, TRUE);//设置大图标 按table 可以显示
SetIcon(m_hIcon, FALSE);//设置小图标
nIcon = 1;
}
else
{
SetIcon(m_hIcon1, TRUE);//设置大图标 按table 可以显示
SetIcon(m_hIcon1, FALSE);//设置小图标
nIcon = 0;
}
break;
}
}
}
//OnSize响应ON_WM_SIZE消息,窗口改变大小消息,在资源里面要设置属性border:resizing
void CMainDlg::OnSize(UINT nType, int cx, int cy)
{
CString str;
str.Format("宽度:%d,高度:%d", cx, cy);
SetWindowText(str);
}
//OnLButtonDown响应ON_WM_LBUTTONDOWN消息
void CMainDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
CString str;
if (nFlags &MK_CONTROL)
{
str += "按了ctrl键";
}
if (nFlags &MK_LBUTTON)
{
str += "按了鼠标左键";
}
if (nFlags & MK_RBUTTON)
{
str += "Set if the right mouse button is down.";
}
if (nFlags& MK_SHIFT)
{
str += "Set if the SHIFT key is down";
}
//坐标
str.Format("%s,坐标(%d,%d)", str, point.x, point.y);
SetWindowText(str);
}
//OnLButtonUp响应ON_WM_LBUTTONUP消息
void CMainDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
}
//OnMouseMove响应ON_WM_MOUSEMOVE消息
void CMainDlg::OnMouseMove(UINT nFlags, CPoint point)
{
}
//OnDropFiles响应ON_WM_DROPFILES消息
void CMainDlg::OnDropFiles(HDROP hDropInfo)
{
}
//OnOK响应ON_BN_CLICKED消息
void CMainDlg::OnOK()
{
//CDialog::OnOK();//调用默认处理函数,关闭EndDialog(hWnd,IDOK)
AfxMessageBox("全局MessageBox");//MFC库中全局的MessageBox
//AfxGetApp() MFC中获取theAPP
//AfxGetInstanceHandle() MFC获取窗口实例句柄
}
void CMainDlg::OnCancel()
{
CDialog::OnCancel();//调用默认处理函数,关闭EndDialog
}
void CMainDlg::OnTest()
{
MessageBox("点击自定义按钮");
//发送自定义消息
SendMessage(OM_TESTMSG, 10, 20);
}
//自定义消息
LRESULT CMainDlg::OnTestMsg(WPARAM wParam, LPARAM lParam)
{
int result = wParam+lParam;
KillTimer(ICON_ID);
return result;
}
//OnClose响应WM_CLOSE消息
void CMainDlg::OnClose()
{
//关闭计时器
KillTimer(TIME_ID);
if (IDYES == MessageBox("你确定要关闭吗", "提示", MB_YESNO))
CDialog::OnClose();
else
return;
}
//OnDestroy响应ON_WM_DESTROY消息
void CMainDlg::OnDestroy()
{
//清理工作
CDialog::OnDestroy();
}
模态对话框与非模态对话框的创建
// HelloMFCDlg.cpp: 实现文件
//
#include "pch.h"
#include "framework.h"
#include "HelloMFC.h"
#include "HelloMFCDlg.h"
#include "afxdialogex.h"
#include "CAboutDlg.h"
#include "CCHAT_DLG.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CHelloMFCDlg 对话框
CHelloMFCDlg::CHelloMFCDlg(CWnd* pParent /*=nullptr*/)
: CDialogEx(IDD_HELLOMFC_DIALOG, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CHelloMFCDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CHelloMFCDlg, CDialogEx)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BTN_ABOUT, &CHelloMFCDlg::OnBnClickedBtnAbout)
ON_BN_CLICKED(IDC_BTN_CHAT, &CHelloMFCDlg::OnBnClickedBtnChat)
END_MESSAGE_MAP()
// CHelloMFCDlg 消息处理程序
BOOL CHelloMFCDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
// TODO: 在此添加额外的初始化代码
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
// 如果向对话框添加最小化按钮,则需要下面的代码
// 来绘制该图标。 对于使用文档/视图模型的 MFC 应用程序,
// 这将由框架自动完成。
void CHelloMFCDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 使图标在工作区矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialogEx::OnPaint();
}
}
//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CHelloMFCDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
//关于 模态对话框
void CHelloMFCDlg::OnBnClickedBtnAbout()
{
// TODO: 在此添加控件通知处理程序代码
//模态对话框
CAboutDlg aboutDlg;
aboutDlg.DoModal();
}
// 创建非模态对话框
void CHelloMFCDlg::OnBnClickedBtnChat()
{
// TODO: 在此添加控件通知处理程序代码
//第一种方式创建非模态对话框
CCHAT_DLG *pChatDlg= new CCHAT_DLG;//延长生命周期
pChatDlg->Create(IDD_CHAT_DLG, this);
pChatDlg->ShowWindow(SW_SHOW); // 注意内存释放函数PostNcDestroy
//第二种方式,成员变量
//if(m_ChatDlg.m_hWnd==NULL)
// m_ChatDlg.Create(IDD_CHAT_DLG, this);//第二次创建报错
//m_ChatDlg.ShowWindow(SW_SHOW);
}
// CCHAT_DLG.cpp: 实现文件
//
#include "pch.h"
#include "HelloMFC.h"
#include "CCHAT_DLG.h"
#include "afxdialogex.h"
// CCHAT_DLG 对话框
IMPLEMENT_DYNAMIC(CCHAT_DLG, CDialogEx)
CCHAT_DLG::CCHAT_DLG(CWnd* pParent /*=nullptr*/)
: CDialogEx(IDD_CHAT_DLG, pParent)
{
}
CCHAT_DLG::~CCHAT_DLG()
{
}
void CCHAT_DLG::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CCHAT_DLG, CDialogEx)
END_MESSAGE_MAP()
// CCHAT_DLG 消息处理程序
//非模态对话框专门内存清理
void CCHAT_DLG::PostNcDestroy()
{
// TODO: 在此添加专用代码和/或调用基类
delete this;//释放
CDialogEx::PostNcDestroy();
}