首页 > 其他分享 >无涯教程-MFC - 消息和事件

无涯教程-MFC - 消息和事件

时间:2023-12-10 21:32:07浏览次数:27  
标签:MAP 教程 MFC CFrameWnd CMainFrame WM 无涯 MESSAGE public

应用程序由各种对象组成,大多数情况下,计算机上运行着多个应用程序,并且不断要求操作系统执行一些任务。

Map消息

由于Windows是面向消息的操作系统,因此Windows环境的大部分编程都涉及消息处理,每一个事件,例如一个键盘或鼠标点击发生时,一个消息被发送到该应用程序,然后必须处理该事件。

  • 要让编译器管理消息,应将它们包含在类定义中。

  • 应该在类定义的末尾提供 DECLARE_MESSAGE_MAP 宏,如以下代码所示。

class CMainFrame : public CFrameWnd {
   public:
      CMainFrame();
   protected:
      DECLARE_MESSAGE_MAP()
};
  • 实际消息应该在DECLARE_MESSAGE_MAP行的上方列出。

  • 要实现这些消息,您需要创建一个程序正在使用的消息表。

  • 此表使用两个定界宏;

  • 它以 BEGIN_MESSAGE_MAP 开头,以 END_MESSAGE_MAP 宏结尾。

  • BEGIN_MESSAGE_MAP宏带有两个参数,即类名和从其派生类的MFC类,如以下代码所示。

#include <afxwin.h>
class CMainFrame : public CFrameWnd {
   public:
      CMainFrame();
   protected:
      DECLARE_MESSAGE_MAP()
};
CMainFrame::CMainFrame() {

   //Create the window's frame
   Create(NULL, L"MFC Messages Demo", WS_OVERLAPPEDWINDOW,
                                      CRect(120, 100, 700, 480), NULL);
}
class CMessagesApp : public CWinApp {
   public:
      BOOL InitInstance();
};
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
END_MESSAGE_MAP()
BOOL CMessagesApp::InitInstance(){
   m_pMainWnd = new CMainFrame;
   m_pMainWnd->ShowWindow(SW_SHOW);
   m_pMainWnd->UpdateWindow();
   return TRUE;
}
CMessagesApp theApp;

让无涯教程通过创建一个新的Win32项目来研究一个简单的示例。

Win32 Project

步骤1 - 要创建MFC项目,请右键单击该项目,然后选择"Properties"。

步骤2 - 在左侧部分,单击 配置Properties→General。

步骤3 - 在"Project Defaults Section"部分中选择"Use MFC in Shared DLL"选项,然后单击"OK"。

步骤4 - 需要添加一个新的源文件(new source file)。

步骤5 - 右键单击您的项目,然后选择Add→New Item。

步骤6  - 在"Templates"部分中,单击C ++文件(.cpp)。

Win Project

步骤7 - 单击添加以继续。

步骤8 - 现在,将以下代码添加到* .cpp文件中。

#include <afxwin.h>
class CMainFrame : public CFrameWnd {
   public:
      CMainFrame();
   protected:
      DECLARE_MESSAGE_MAP()
};

CMainFrame::CMainFrame() {
   //创建窗口的框架
   Create(NULL, L"MFC Messages Demo", WS_OVERLAPPEDWINDOW,
      CRect(120, 100, 700, 480), NULL);
}

class CMessagesApp : public CWinApp {
   public:
      BOOL InitInstance();
};

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
END_MESSAGE_MAP()
BOOL CMessagesApp::InitInstance() {
   m_pMainWnd = new CMainFrame;
   m_pMainWnd->ShowWindow(SW_SHOW);
   m_pMainWnd->UpdateWindow();
   return TRUE;
}
CMessagesApp theApp;

Windows 消息

Windows消息有不同类型,例如创建窗口,显示窗口等,这是一些常用的Windows消息。

让无涯教程看一个简单的窗口创建示例。

WM_CREATE   -  创建称为窗口的对象时,创建对象的框架会发送一条标识为 ON_WM_CREATE 的消息。

步骤1 - 要创建ON_WM_CREATE,请添加afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);在DECLARE_MESSAGE_MAP()之前,如下所示。

class CMainFrame : public CFrameWnd {
   public:
      CMainFrame();
   protected:
      afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
      DECLARE_MESSAGE_MAP()
};

步骤2 - 在BEGIN_MESSAGE_MAP(CMainFrame,CFrameWnd)之后和END_MESSAGE_MAP()之前添加ON_WM_CREATE()

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
   ON_WM_CREATE()
END_MESSAGE_MAP()

步骤3 - 这是OnCreate()的实现

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) {
   //调用基类创建窗口
   if (CFrameWnd::OnCreate(lpCreateStruct) == 0) {

      //如果窗口创建成功,让用户知道
      MessageBox(L"The window has been created!!!");
      //由于窗口创建成功,返回0
      return 0;
   }
   //Otherwise, return -1
   return -1;
}

步骤1 - 现在,您的* .cpp文件将类似于以下代码所示。

#include <afxwin.h>
class CMainFrame : public CFrameWnd {
   public:
      CMainFrame();
   protected:
      afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
      DECLARE_MESSAGE_MAP()
};
CMainFrame::CMainFrame() {

   //Create the window's frame
   Create(NULL, L"MFC Messages Demo", WS_OVERLAPPEDWINDOW,
      CRect(120, 100, 700, 480), NULL);
}
class CMessagesApp : public CWinApp {
   public:
      BOOL InitInstance();
};
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
   ON_WM_CREATE()
END_MESSAGE_MAP()
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) {
   //调用基类创建窗口
   if (CFrameWnd::OnCreate(lpCreateStruct) == 0) {
      //如果窗口创建成功,让用户知道
      MessageBox(L"The window has been created!!!");
      //由于窗口创建成功,返回0
      return 0;
   }
   //Otherwise, return -1
   return -1;
}
BOOL CMessagesApp::InitInstance() { 
   m_pMainWnd = new CMainFrame;
   m_pMainWnd -> ShowWindow(SW_SHOW);
   m_pMainWnd -> UpdateWindow();
   return TRUE;
}
CMessagesApp theApp;

步骤5 - 编译并执行上述代码后,您将看到以下输出。

Message

步骤6 - 单击"OK"时,它将显示主窗口。

Message

Command 消息

图形应用程序的主要功能之一是呈现允许用户与计算机进行交互的Windows控件和资源,将学习的控件示例包括按钮,列表框,组合框等。

在上一课中介绍的一种资源是菜单,这些控件和资源可以在用户单击它们时启动它们自己的消息,从Windows控件或资源发出的消息称为命令消息。

让无涯教程看一个简单的Command消息示例。

为了使您的应用程序能够创建新文档,CWinApp类提供了OnFileNew()方法。

afx_msg void OnFileNew();

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
   ON_COMMAND(ID_FILE_NEW, CMainFrame::OnFileNew)
END_MESSAGE_MAP()

这是方法定义-

void CMainFrame::OnFileNew() {
   //Create New file
}

Keyboard 消息

键盘是连接到计算机的硬件对象。默认情况下,它用于在控件上输入可识别的符号,字母和其他字符,键盘上的每个键都显示一个符号,字母或这些符号的组合,以指示该键的用途,用户通常按下一个键,该键将信号发送到程序。

按下键会导致WM_KEYDOWN或WM_SYSKEYDOWN消息放置在线程消息中。这可以定义如下-

afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);

看一个简单的例子。

步骤1 - 这是消息。

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
   ON_WM_CREATE()
   ON_WM_KEYDOWN()
END_MESSAGE_MAP()

- 这是OnKeyDown()的实现。

void CMainFrame::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) {
   switch (nChar) {

      case VK_RETURN:
         MessageBox(L"You pressed Enter");
         break;
      case VK_F1:
         MessageBox(L"Help is not available at the moment");
         break;
      case VK_DELETE:
         MessageBox(L"Can't Delete This");
         break;
      default:
         MessageBox(L"Whatever");
   }
}

步骤3 - 编译并执行上述代码后,您将看到以下输出。

Message Window

步骤4 - 按下回车键时,它将显示以下消息。

Message Output

Mouse 消息

鼠标是连接到计算机的另一个对象,允许用户与计算机进行交互。

  • 如果按下鼠标左键,则会发送ON_WM_LBUTTONDOWN消息

  • 如果按下鼠标右键,则发送ON_WM_RBUTTONDOWN消息。

  • 类似地,如果释放鼠标左键,则发送ON_WM_LBUTTONUP消息。

  • 如果释放鼠标右键,则发送ON_WM_TBUTTONUP消息。

看一个简单的例子。

步骤1 - 在CMainFrame类定义中添加以下两个函数,如以下代码所示。

class CMainFrame : public CFrameWnd {
   public:
      CMainFrame();
   protected:
      afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
      afx_msg void OnLButtonDown(UINT nFlags,CPoint point);
      afx_msg void OnRButtonUp(UINT nFlags,CPoint point);
      DECLARE_MESSAGE_MAP()
};

步骤2 - 添加以下两个消息映射。

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
   ON_WM_KEYDOWN()
   ON_WM_LBUTTONDOWN()
   ON_WM_RBUTTONUP()
END_MESSAGE_MAP()

步骤3 

void CMainFrame::OnLButtonDown(UINT nFlags, CPoint point) { 
   CString MsgCoord;
   MsgCoord.Format(L"Left Button at P(%d, %d)", point.x, point.y);
   MessageBox(MsgCoord);
}
void CMainFrame::OnRButtonUp(UINT nFlags, CPoint point) { 
   MessageBox(L"Right Mouse Button Up");
}

步骤4  - 运行此应用程序时,将看到以下输出。

鼠标讯息

步骤5 - 单击"OK"时,将看到以下消息。

鼠标讯息

步骤6 - 右键单击此窗口。现在,当您释放鼠标右键时,它将显示以下消息。

鼠标讯息

参考链接

https://www.learnfk.com/mfc/mfc-messages-events.html

标签:MAP,教程,MFC,CFrameWnd,CMainFrame,WM,无涯,MESSAGE,public
From: https://blog.51cto.com/u_14033984/8762711

相关文章

  • Qt6 c++教程9测试&调试
    9测试&调试调试和测试是软件开发的重要组成部分。在本章中,你将学习如何调试Qt项目、不同的调试技术以及Qt支持的调试器。调试是发现错误或不希望出现的行为的根本原因并加以解决的过程。我们还将讨论使用QtTest框架进行单元测试。QtTest是基于Qt的应用程序和库的单元测试......
  • 无涯教程-MFC - 窗口控件
    Windows控件是用户可以与之交互以输入或操作数据的对象,它们通常出现在对话框或工具栏上。Sr.No.Controls&描述1StaticControl静态Static控件向用户显示信息,它可以用于显示颜色,几何形状或图片,如图标,位图或动画。2AnimationControl动画控件是一个以AVI格式显示音频剪......
  • MFC对话框显示时背景闪烁
    在显示一个对话框时,可以在WM_PAINT消息处理函数中绘制窗口的背景色。但会出现一种情况,在还未执行完OnPaint函数,对话框已经先显示出白色窗体,如下:还未绘制窗体,背景色先被显示。解决办法:1、添加WM_CTLCOLOR消息。2、在消息响应函数中添加如下代码:1HBRUSHCZGDlg::OnCtlColor......
  • 无涯教程-MFC - 控件管理
    在MFC应用程序中,以可视方式将控件添加到应用程序后,如果要在代码中引用它,则可以基于该控件或与该控件关联来声明变量。MFC库允许您为应用程序中使用的某些控件声明值或控件变量的两种类型的变量。一个变量用于存储在控件中的信息,也称为ControlVariable/Instance.另一个变量称......
  • MFC窗口闪烁问题
    本文引自:《VC窗口闪烁问题的解决》概述一般的windows复杂的界面需要使用多层窗口而且要用贴图来美化,所以不可避免在窗口移动或者改变大小时候出现闪烁。闪烁产生的原因原因一:如果熟悉显卡原理的话,调用GDI函数向屏幕输出的时候并不是立刻就显示在屏幕上,而是写到了显存里,显卡......
  • 无涯教程-MFC - 对话框
    在本章中,无涯教程将介绍对话框(Dialog),Windows应用程序经常通过对话框与用户通信,CDialog类提供了用于管理对话框的界面,VisualC++对话框编辑器使设计对话框和创建其对话框模板资源变得容易。创建对话3对象是两阶段操作-构造对话框对象。创建对话框窗口。通过创建一个新的W......
  • 蛋白质组搜库软件MaxQuant使用教程
    目录MaxQuant基本原理MaxQuant使用MaxQuant实操MaxQuant基本原理MaxQuant使用MaxQuant实操更多信息请关注:......
  • Adobe Photoshop 2023最新激活(附图文教程)
    以前PS喜欢用这个,不过现在简单搞搞在手机上也能搞定。好久不用了,但偶尔需要用的时候还挺麻烦。有专业需求的小伙伴拿走不谢。介绍Photoshop软件是一个非常强大的数字图像处理和编辑软件,具有直观易用的用户界面,各种图像编辑和处理工具,各种图层和蒙版功能,各种滤镜和插件。无论是初学......
  • 无涯教程-MFC - 环境设置
    MicrosoftVisualC++是用于为MicrosoftWindows操作系统创建应用程序的编程环境。要在C++应用程序中使用MFC框架,必须已安装MicrosoftVisualC++或MicrosoftVisualStudio,MicrosoftVisualStudio还包含MicrosoftVisualC++环境。Microsoft提供了VisualStudio的免费版......
  • 无涯教程-MFC - VC++项目
    VisualStudio包括几种VisualC++项目模板,这些模板有助于创建基本程序结构,菜单,工具栏,图标,并包含适合您要创建的项目类型的语句。在MFC中,您可以使用以下项目模板。Sr.No.Remark1MFCApplicationMFC应用程序是基于Microsoft基础类(MFC)库的Windows可执行应用程序,创建MF......