6 MFC消息映射机制

消息映射机制

在类中申明消息映射

   //申明消息映射
	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();
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值