MFC开发第二天 Windows计算器的开发,常用消息解析与处理


文章目录

  • 相关概念陈述
  • 一、初始API汇总
    • 消息汇总
  • 二、Windows计算器的开发
  • 三、常见的消息解析与处理
  • 附录


相关概念陈述

INT PTR是一个指向整数类型数据的指针。PTR是指针的缩写,INT是表示整数类型。因此,INT PTR表示指向整数类型的指针。

1、对话框弹出的函数:
INT_PTR WINAPI DialogBox(
  _In_opt_  HINSTANCE hInstance,//必须从WinMain的第一个参数获取
  _In_      LPCTSTR lpTemplate,
  _In_opt_  HWND hWndParent,
  _In_opt_  DLGPROC lpDialogFunc
);

这个函数是Windows API中用于创建模态对话框的函数。它有四个参数:

hInstance:可选参数,指定包含对话框模板资源的模块实例句柄;一般可以传入NULL。
lpTemplate:必需参数,指定对话框模板的名称或标识符。
hWndParent:可选参数,指定父窗口的句柄,也就是将要显示在哪个窗口上面,如果没有指定,则对话框将居中显示在屏幕上。
lpDialogFunc:可选参数,指向对话框处理函数的指针,当用户操作对话框时,会调用该函数来完成相应的操作。
该函数的返回值是一个整型指针,表示对话框结束时的退出代码。如果函数失败,则返回值为0typedef INT_PTR (CALLBACK* DLGPROC)(HWND, UINT, WPARAM, LPARAM); 加上typedef这个就是个类型
INT_PTR (CALLBACK* DLGPROC)(HWND, UINT, WPARAM, LPARAM); 不加的话就是一个函数指针  指针变量

2、Windows 消息处理的回调函数
INT_PTR CALLBACK theProc(HWND, UINT, WPARAM, LPARAM) 
是一个 ,通常用于在 Windows 程序中处理特定的消息。

该函数的参数如下:windows消息类似于网络通讯:消息类型+附带数据

HWND: 表示与消息相关联的窗口的句柄。
UINT: 表示收到的消息的 ID。消息类型
WPARAM: 表示消息所传递的第一个参数。编号
LPARAM: 表示消息所传递的第二个参数。 控件
程序员可以根据不同的消息 ID 来编写不同的响应代码。这个函数的返回值为整型指针(INT_PTR),表示处理结果,一般是 0 或者 1。

在 Windows GUI 应用程序中,通常会在 WinMain 函数中创建并显示主窗口,并在消息循环中调用该函数来处理窗口消息,例如用户点击按钮、鼠标移动等。

一、初始API汇总

代码如下(示例):

1、弹出消息:图标和文字
int WINAPI MessageBox(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT uType);
2、查找主窗口:根据标题或者窗口类型
HWND WINAPI FindWindow(LPCTSTR lpClassName,LPCTSTR lpWindowName);

3、设置标题文字:
BOOL WINAPI SetWindowText(HWND hWnd,LPCTSTR lpString);

4、获取窗口标题文字:
int WINAPI GetWindowText(HWND hWnd,LPTSTR lpString, int nMaxCount);

5、改变窗口位置和大小:
BOOL WINAPI MoveWindow(
 HWND hWnd,
 int X,
  int Y,
  int nWidth,
 int nHeight,
 BOOL bRepaint
);

6、关闭对话框
BOOL WINAPI EndDialog(HWND hDlg,INT_PTR nResult);

7、获取控件句柄:
HWND WINAPI GetDlgItem(HWND hDlg,  int nIDDlgItem);

8、获取控件文字:
UINT WINAPI GetDlgItemText(HWND hDlg,int nIDDlgItem,LPTSTR lpString,int nMaxCount);

9、设置控件文字:
BOOL WINAPI SetDlgItemText(HWND hDlg,int nIDDlgItem,LPCTSTR lpString);

10、获取窗口位置:
BOOL WINAPI GetWindowRect(HWND hWnd,LPRECT lpRect);
11、禁用和激活窗口:
BOOL WINAPI EnableWindow(HWND hWnd,BOOL bEnable);

12、显示窗口:不止用于隐藏和显示,还有最大化,最小化和恢复等功能。
BOOL WINAPI ShowWindow(HWND hWnd,int nCmdShow);

13、判断窗口是否存在或者已摧毁:
BOOL WINAPI IsWindow(HWND hWnd);

14、判断窗口是否激活或者禁用:
BOOL IsWindowEnabled(HWND hWnd );

15、判断窗口是否显示或隐藏:
BOOL WINAPI IsWindowVisible( HWND hWnd);

对11-15API示例如下:

#include
#include"resource.h"
INT_PTR CALLBACK theProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	switch (uMsg)
	{
	case WM_COMMAND:
	{
		switch (LOWORD(wParam))
		{
		case IDC_TEST_ENABLE:
		{
			HWND h = GetDlgItem(hwndDlg, IDC_TEST_OK);
			if (h)
			{
				EnableWindow(h, !IsWindowEnabled(h));
				/*if (IsWindowEnabled(h))
					EnableWindow(h, FALSE);
				else
					EnableWindow(h, TRUE);*/
			}
		}
		break;
		case IDC_TEST_SHOW:
		{
			HWND h = GetDlgItem(hwndDlg, IDC_TEST_OK);
			if (h)
			{
				if (IsWindowVisible(h))
					ShowWindow(h, SW_HIDE);
				else
					ShowWindow(h, SW_SHOW);
			}
		}
		break;
		case IDC_TEST_SHOW2:
		{
			HWND h = FindWindow("Notepad", NULL);
			if (h)
			{
				ShowWindow(h, SW_MAXIMIZE);
			}
		}
		break;
		}
	}
	default:
		break;
	}
    return 0;
}
int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
    DialogBox(hInstance, (LPCSTR)IDD_TEST_DLG, NULL, theProc);
    return 0;
}

消息汇总

代码如下(示例):

Win32是Windows操作系统的一种API,其中包含了许多不同类型的消息,以下是其中一些常见的消息:

WM_INITDIALOG : 对话框初始化消息,只会发送一次(在对话框显示出来之前)
WM_CREATE:在一个窗口被创建时发送。
WM_DESTROY:在一个窗口被销毁前发送。
WM_PAINT:当一个窗口需要重绘时发送。通常在窗口第一次出现、被移动或重绘时发送。
WM_COMMAND:当用户选择菜单项、按钮、工具栏按钮等发送此消息。
WM_KEYDOWN和WM_KEYUP:发送给窗口以指示按下和释放一个键。
WM_LBUTTONDOWN、WM_MBUTTONDOWN和WM_RBUTTONDOWN:分别表示鼠标左键、中键和右键按下的消息。
WM_MOUSEMOVE:当鼠标移动时发送,可以用于捕获鼠标坐标并实现拖拽等功能。
WM_SIZE:当一个窗口改变大小后发送。
WM_SETTEXT:设置窗口标题文本。

二、Windows计算器的开发

对应的图形界面如下:
MFC开发第二天 Windows计算器的开发,常用消息解析与处理_第1张图片

#include
#include"resource.h"
#include
//消息回调函数 typedef INT_PTR (CALLBACK* DLGPROC)(HWND, UINT, WPARAM, LPARAM);
double GetDlgItemDouble(HWND hwndDlg, int nID)
{
	char s[32];
	GetDlgItemText(hwndDlg, nID, s, sizeof(s));
	return atof(s);
}
BOOL SetDlgItemDouble(HWND hwndDlg, int nID, double fValue)
{
	char str[32];
	snprintf(str, sizeof(str), "%g",fValue);
	return SetDlgItemText(hwndDlg, nID, str);
}
INT_PTR CALLBACK theProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) 
//wParam是编号lParam是控件的句柄  可以通过编号来获取句柄也可以通过句柄来获取编号
{
	switch (uMsg)
	{
	case WM_COMMAND:
		switch (LOWORD(wParam))
		{
		case IDC_ADD:
		{
			double fLeft = GetDlgItemDouble(hwndDlg, IDC_LEFT1);
			double fRight = GetDlgItemDouble(hwndDlg, IDC_RIGHT1);
			SetDlgItemDouble(hwndDlg, IDC_RES1,fLeft + fRight);
		}
			break;
		case IDC_SUB:
		{
			double fLeft = GetDlgItemDouble(hwndDlg, IDC_LEFT2);
			double fRight = GetDlgItemDouble(hwndDlg, IDC_RIGHT2);
			SetDlgItemDouble(hwndDlg, IDC_RES2, fLeft - fRight);
			
			HWND h = GetDlgItem(hwndDlg, IDC_SUB);
			//wParam是编号lParam是控件的句柄  可以通过编号来获取句柄也可以通过句柄来获取编号
			SetWindowText(HWND(lParam), "哈哈哈");
			if (h==(HWND)lParam)
			{
				MessageBox(hwndDlg, "相同", "结果", 0);
			}
		}
			break;
		case IDC_MULT:
		{
			double fLeft = GetDlgItemDouble(hwndDlg, IDC_LEFT3);
			double fRight = GetDlgItemDouble(hwndDlg, IDC_RIGHT3);
			SetDlgItemDouble(hwndDlg, 1013, fLeft * fRight);
		}
			break;
		case IDC_DIV:
		{
			double fLeft = GetDlgItemDouble(hwndDlg, IDC_LEFT4);
			double fRight = GetDlgItemDouble(hwndDlg, IDC_RIGHT4);
			SetDlgItemDouble(hwndDlg, IDC_RES4, fLeft / fRight);
		}
			break;
		case IDOK:
			MessageBox(NULL, "你点击了ok", "提示", 0);
			break;
		case IDCANCEL:
			if (IDYES == MessageBox(hwndDlg, "你确定要退出吗?", "提示", MB_YESNO | MB_ICONQUESTION))
			{
				EndDialog(hwndDlg, 88);
			}
			break;
		}	
	}
    return 0;
}


int WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd) 
{
    UINT_PTR n = DialogBox(hInstance, (LPCSTR)IDD_CALC_DLG, NULL, theProc);

	//位运算
	DWORD dw = MAKELONG(0x5678, 0x1234); //合并成8个字节
	WORD w = MAKEWORD(0x56, 0x34);	//合并成4个字节
	WORD x = LOWORD(dw);	//拆分成低4位
	WORD y = HIWORD(dw);	//拆分成高4位
	BYTE a = LOBYTE(w);
	BYTE b = HIBYTE(w);

    return 0;
}

三、常见的消息解析与处理

如何计算使图片居中的算法
MFC开发第二天 Windows计算器的开发,常用消息解析与处理_第2张图片

#include
#include"resource.h"
#include
INT_PTR onInitDialog(HWND hwndDlg) //初始化屏幕让其居中
{
    RECT rect;
    GetWindowRect(hwndDlg, &rect);
    int nwidth = rect.right - rect.left;
    int nheight = rect.bottom - rect.top; 
    int cx = GetSystemMetrics(SM_CXSCREEN);
    int cy = GetSystemMetrics(SM_CYSCREEN);
    int x = (cx - nwidth) / 2;
    int y = (cy - nheight) / 2;
    MoveWindow(hwndDlg, x, y, nwidth, nheight, false);
    return 0;
}
INT_PTR CALLBACK theProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
   /* char s[32];
    snprintf(s, sizeof(s), "uMsg = 0x%x\n", uMsg);
    OutputDebugString(s); //当函数被调用了就会进行打印输出*/

    switch (uMsg)
    {
    case WM_INITDIALOG:
    {
        //MessageBox(hwndDlg, "初始化对话框", "提示", 0);
        return onInitDialog(hwndDlg);
    }
    break;
    case WM_COMMAND:
    {
        if (LOWORD(wParam) == IDCANCEL) //编号对编号
        {
            EndDialog(hwndDlg, 88);
        }
    }
    break;
    case WM_MOUSEMOVE:
    {
        char s[32];
        snprintf(s, sizeof(s), "x=%d,y=%d", LOWORD(lParam), HIWORD(lParam));
        if (MK_CONTROL&wParam)
        {
            strcat_s(s, sizeof(s), "按下了ctrl键");
        }
        if (MK_SHIFT& wParam)
        {
            strcat_s(s, sizeof(s), "按下了shift键");
        }
        SetWindowText(hwndDlg, s);
    }
    break;
    }
    return 0;
}
int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
    DialogBox(hInstance, (LPCSTR)IDD_MAIN_DLG, NULL, theProc);
    return 0;
}

附录

Windows位运算
#define MAKEWORD(a, b)      ((WORD)(((BYTE)(((DWORD_PTR)(a)) & 0xff)) | ((WORD)((BYTE)(((DWORD_PTR)(b)) & 0xff))) << 8))
#define MAKELONG(a, b)      ((LONG)(((WORD)(((DWORD_PTR)(a)) & 0xffff)) | ((DWORD)((WORD)(((DWORD_PTR)(b)) & 0xffff))) << 16))
#define LOWORD(l)           ((WORD)(((DWORD_PTR)(l)) & 0xffff))
#define HIWORD(l)           ((WORD)((((DWORD_PTR)(l)) >> 16) & 0xffff))
#define LOBYTE(w)           ((BYTE)(((DWORD_PTR)(w)) & 0xff))
#define HIBYTE(w)           ((BYTE)((((DWORD_PTR)(w)) >> 8) & 0xff))

你可能感兴趣的:(MFC开发,windows,mfc,microsoft)