文章目录
- 相关概念陈述
- 一、初始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:可选参数,指向对话框处理函数的指针,当用户操作对话框时,会调用该函数来完成相应的操作。
该函数的返回值是一个整型指针,表示对话框结束时的退出代码。如果函数失败,则返回值为0。
typedef 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<windows.h>
#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计算器的开发
对应的图形界面如下:
#include<windows.h>
#include"resource.h"
#include<stdio.h>
//消息回调函数 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;
}
三、常见的消息解析与处理
如何计算使图片居中的算法
#include<windows.h>
#include"resource.h"
#include<stdio.h>
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))