api

MessageBox

MessageBox 函数用于显示一个模态对话框,其中包含一个系统图标、 一组按钮和一个简短的特定于应用程序消息,如状态或错误的信息
消息框中返回一个整数值,该值指示用户单击了哪个按钮

API 函数原型:注释:_In_ 说明该参数是输入的,opt 说明该参数是可选参数

1
2
3
4
5
6
7
int WINAPI MessageBox
(
_In_opt_ HWND hWnd,
_In_opt_ LPCTSTR lpText,
_In_opt_ LPCTSTR lpCaption,
_In_ UINT uType
);

参数解析

参数 含义
hWnd 1.该消息框的父窗口句柄
2.如果此参数为NULL,则该消息框没有拥有父窗口
lpText 1.消息框的内容
lpCaption 1.消息框的标题
uType 1.指定一个决定对话框的内容和行为的位标志集,此参数可以通过指定下列标志或标志的组合,来显示消息框中的按钮以及图标

uType参数定义解析

按钮 含义
MB_OK 默认值,有一个“确认”按钮在里面
MB_YESNO 有“是”和“否”两个按钮在里面
MB_ABORTRETRYIGNORE 有“中止”,“重试”和“跳过”三个按钮在里面
MB_YESNOCANCEL 有“是”,“否”和“取消”三个按钮在里面
MB_RETRYCANCEL 有“重试”和“取消”两个按钮在里面
MB_OKCANCEL 有“确定”和“取消”两个按钮在里面
图标 含义
MB_ICONEXCLAMATION 一个惊叹号出现在消息框
MB_ICONWARNING 一个惊叹号出现在消息框
MB_ICONINFORMATION 一个圆圈中小写字母i组成的图标出现在消息框
MB_ICONASTERISK 一个圆圈中小写字母i组成的图标出现在消息框
MB_ICONSTOP 一个停止消息图标出现在消息框
MB_ICONERROR 一个停止消息图标出现在消息框
MB_ICONHAND 一个停止消息图标出现在消息框
默认按钮 含义
MB_DEFBUTTON1 指定第一个按钮为默认按钮
MB_DEFBUTTON2 指定第二个按钮为默认按钮
MB_DEFBUTTON3 指定第三个按钮为默认按钮
MB_DEFBUTTON4 指定第四个按钮为默认按钮
消息框形态 含义
MB_APPLMODAL 1.在 hWnd 参数标识的窗口中继续工作以前,用户一定响应消息框
2.但是,用户可以移动到其他线程的窗口且在这些窗口中工作
3.根据应用程序中窗口的层次机构,用户则以移动到线程内的其他窗口
4.所有母消息框的子窗口自动地失效,但是弹出窗口不是这样
5.如果既没有指定 MB_SYSTEMMODAL 也没有指定 MB_TASKMODAL,则 MB_APPLMODAL 为默认的
MB_SYSTEMMODAL 1.除了消息框有 WB_EX_TOPMOST 类型,否则 MB_APPLMODAL 和 MB_SYSTEMMODAL 一样
2.用系统模态消息框来改变各种各样的用户,主要的损坏错误需要立即注意(例如,内存溢出
3.如果不是那些与 hWnd 联系的窗口,此标志对用户对窗口的相互联系没有影响
MB_TASKMODAL 1.如果参数 hWnd 为 NULL 的话,那么除了所有属于当前线程高层次的窗口失效外,MB_TASKMODAL 和 MB_APPLMODAL 一样
2.当调用应用程序或库没有一个可以得到的窗口句柄时,可以使用此标志,但仍需要阻止输入到调用线程的其他窗口,而不是搁置其他线程
其他标志 含义
MB_DEFAULT_DESKTOP_ONLY 1.接收输入的当前桌面一定是一个默认桌面,否则函数调用失败
2.默认桌面是一个在用户已经记录且以后应用程序在此上面运行的桌面
MB_HELP 1.把一个Help按钮增加到消息框
2.选择Help按钮或按F1产生一个Help事件
MB_RIGHT 1.文本为右对齐
MB_RTLREADING 1.用在Hebrew和Arabic系统中从右到左的顺序显示消息和大写文本
MB_SETFOREGROUND 1.消息框变为前景窗口
2.在内部系统为消息个调用SetForegroundWindow函数
MB_TOPMOST 1.消息框用WS_EX_TOPMOST窗口类型来创建MB_SERVICE_NOTIFICATION

返回值:

返回值 含义
IDOK 用户按下了“确认”按钮
IDCANCEL 用户按下了“取消”按钮
IDABORT 用户按下了“中止”按钮
IDRETRY 用户按下了“重试”按钮
IDIGNORE 用户按下了“忽略”按钮
IDYES 用户按下了“是”按钮
IDNO 用户按下了“否”按钮
1
2
3
4
5
6

int WINAPI (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
MessageBox(NULL, TEXT("这是我在鱼C学的第一个程序!"), TEXT("打招呼"), MB_OKCANCEL MB_ICONQUESTION MB_DEFBUTTON2);
return 0;
}

CreateWindow

CreateWindow 函数创建一个重叠式窗口、弹出式窗口或子窗口。它指定窗口类,窗口标题,窗口风格,以及窗口的初始位置及大小(可选的)。
函数也指该窗口的父窗口或所属窗口(如果存在的话),及窗口的菜单。
若要使用除 CreateWindow 函数支持的风格外的扩展风格,则使用 CreateWindowEx 函数代替 CreateWindow 函数

API 函数原型:注释:_In_ 说明该参数是输入的,opt 说明该参数是可选参数

1
2
3
4
5
6
7
8
9
10
11
12
13
HWND WINAPI CreateWindow(
_In_opt_ LPCTSTR lpClassName,
_In_opt_ LPCTSTR lpWindowName, // 窗口标题
_In_ DWORD dwStyle, // 窗口风格,或称窗口格式
_In_ int x, // 初始 x 坐标
_In_ int y, // 初始 y 坐标
_In_ int nWidth, // 初始 x 方向尺寸
_In_ int nHeight, // 初始 y 方向尺寸
_In_opt_ HWND hWndParent, // 父窗口句柄
_In_opt_ HMENU hMenu, // 窗口菜单句柄
_In_opt_ HINSTANCE hInstance, // 程序实例句柄
_In_opt_ LPVOID lpParam // 创建参数
);
参数 含义
lpClassName 1.窗口类名称,可以是一个指向 NULL 结束的字符串或一个整型数值
2.如果是字符串,它指定了窗口的类名。这个类名可以是任何用函数RegisterClass注册的类名,或是任何预定义的控制类名
3.如是一个整型量,它是由此前调用theGlobalAddAtom函数产生的全局量。这个小于0xC000的16位数必须是lpClassName参数字的低16位,该参数的高位必须是0
lpWindowName 1.窗口标题,一个指向NULL结束的字符串指针
2.如果窗口风格指定了标题条,由lpWindowName指向的窗口标题将显示在标题条上
3.当使用Createwindow函数来创建控制例如按钮,选择框和静态控制时,可使用lpWindowName来指定控制文本
dwStyle 指定创建窗口的风格(详见下方↓)
x 1.指定窗口的初始水平位置(x坐标)
2.对一个层叠或弹出式窗口,x参数是屏幕坐标系的窗口的左上角的初始x坐标
3.对于子窗口,x是子窗口左上角相对父窗口客户区左上角的初始x坐标
4.如果该参数被设为CW_USEDEFAULT则系统为窗口选择缺省的左上角坐标并忽略y参数,CW_USEDEFAULT只对层叠窗口有效,如果为弹出式窗口或子窗口设定,则x和y参数被设为零。
y 1.指定窗口的初始垂直位置(y坐标)
2.对一个层叠或弹出式窗口,y参数是屏幕坐标系的窗口的左上角的初始y坐标
3.对于子窗口,y是子窗口左上角相对父窗口客户区左上角的初始y坐标
4.对于列表框,y是列表框客户区左上角相对父窗口客户区左上角的初始y坐标
5.如果层叠窗口是使用WS_VISIBLE风格位创建的并且x参数被设为CW_USEDEFAULT,则系统将忽略y参数
nWidth 1.以设备单元指明窗口的宽度
2.对于层叠窗口,nWidth的值或是屏幕坐标的窗口宽度或是CW_USEDEFAULT
3.若nWidth是CW_USEDEFAULT,则系统为窗口选择一个默认的高度和宽度(默认宽度为从初始x坐标开始到屏幕的右边界,缺省高度为从初始y坐标开始到目标区域的顶部。),CW_USEDEFAULT只对层叠窗口有效,如果为弹出式窗口和子窗口设定CW_USEDEFAULT标志则nWidth和nHeight被设为零
nHeight 1.以设备单元指明窗口的高度
2.对于层叠窗口,nHeight是屏幕坐标的窗口宽度
3.若nWidth被设为CW_USEDEFAULT,则系统忽略nHeight参数,自动为nWidth和nHeight设置默认参数
hWndParent 1.指向被创建窗口的父窗口或所有者窗口的句柄
2.若要创建一个子窗口或一个从属窗口,需提供一个有效的窗口句柄
3.创建一个单纯的消息窗口,可以提供HWND_MESSAGE或提供一个己存在的消息窗口的句柄
hMenu 1.指向窗口菜单句柄,或依据窗口风格指明一个子窗口标识
2.对于层叠或弹出式窗口,hMenu指定窗口使用的菜单:如果使用了菜单类,则hMenu可以为NULL
3.对于子窗口,hMenu指定了该子窗口标识(一个整型量),一个对话框使用这个整型值将事件通知父类。应用程序确定子窗口标识,这个值对于相同父窗口的所有子窗口必须是唯一的
hInstance 与窗口相关联的模块实例的句柄
lpParam 1.指向一个值的指针,该值传递给窗口WM_CREATE消息。该值通过在IParam参数中的CREATESTRUCT结构传递
2.如果应用程序调用CreateWindow创建一个MDI客户窗口,则lpParam必须指向一个CLIENTCREATESTRUCT结构

DwStyle窗口风格解析

窗口风格 含义
WS_BORDER 创建一个带边框的窗口
WS_CAPTION 创建一个有标题框的窗口(包含了 WS_BODER 风格)
WS_CHILD 创建一个子窗口,这个风格的窗口不能拥有菜单也不能与 WS_POPUP 风格合用
WS_CHILDWINDOW 与 WS_CHILD 相同
WS_CLIPCHILDREN 当在父窗口内绘图时,排除子窗口区域,在创建父窗口时使用这个风格
WS_CLIPSIBLINGS 1.排除子窗口之间的相对区域,也就是,当一个特定的窗口接收到 WM_PAINT 消息时,WS_CLIPSIBLINGS 风格将所有层叠窗口排除在绘图之外,只重绘指定的子窗口
2.如果未指定该风格,并且子窗口是层叠的,则在重绘子窗口的客户区时,就会重绘邻近的子窗口
WS_DISABLED 1.创建一个初始状态为禁止的子窗口,一个禁止状态的窗口不能接受来自用户的输入信息
2.在窗口创建之后,可以调用 EnableWindow 函数来启用该窗口
WS_DLGFRAME 创建一个带对话框边框风格的窗口,这种风格的窗口不能带标题条
WS_GROUP 1.指定一组“控制窗口”的第一个“控制窗口”
2.这个“控制窗口”组由第一个“控制窗口”和随后定义的“控制窗口”组成,自第二个“控制窗口”开始每个“控制窗口”具有 WS_GROUP 风格
3.每个组的第一个“控制窗口”带有 WS_TABSTOP 风格,从而使用户可以在组间移动
4.用户随后可以使用光标在组内的控制间改变键盘焦点
WS_HSCROLL 创建一个有水平滚动条的窗口
WS_ICONIC 创建一个初始状态为最小化状态的窗口,与 WS_MINIMIZE 风格相同
WS_MAXIMIZE 创建一个初始状态为最大化状态的窗口
WS_MAXIMIZEBOX 创建一个具有最大化按钮的窗口,该风格不能与 WS_EX_CONTEXTHELP 风格同时出现,同时必须指定 WS_SYSMENU 风格
WS_MINIMIZE 创建一个初始状态为最小化状态的窗口,与 WS_ICONIC 风格相同
WS_MINIMIZEBOX 创建一个具有最小化按钮的窗口,该风格不能与 WS_EX_CONTEXTHELP 风格同时出现,同时必须指定 WS_SYSMENU 风格
WS_OVERLAPPED 产生一个层叠的窗口,一个层叠的窗口有一个标题条和一个边框,与 WS_TILED 风格相同
WS_OVERLAPPEDWINDOW 相当于(WS_OVERLAPPED、WS_CAPTION、WS_SYSMENU、WS_THICKFRAME、WS_MINIMIZEBOX、WS_MAXIMIZEBOX),与WS_TILEDWINDOW风格相同
WS_POPUP 创建一个弹出式窗口,该风格不能与WS_CHILD风格同时使用。
WS_POPUPWINDOW 相当于(WS_POPUP、WS_BORDER、WS_SYSMENU),但WS_CAPTION和WS_POPUPWINDOW必须同时设定才能使窗口某单可见
WS_SIZEBOX 创建一个可调边框的窗口,与WS_THICKFRAME风格相同
WS_SYSMENU 创建一个在标题条上带有窗口菜单的窗口,必须同时设定WS_CAPTION风格
WS_TABSTOP 1.创建一个“控制窗口”,在用户按下Tab键时可以获得键盘焦点。
2.按下Tab键后使键盘焦点转移到下一具有WS_TABSTOP风格的“控制窗口”
WS_THICKFRAME 创建一个具有可调边框的窗口,与WS_SIZEBOX风格相同
WS_TILED 产生一个层叠的窗口,一个层叠的窗口有一个标题和一个边框,与WS_OVERLAPPED风格相同
WS_TILEDWINDOW 相当于(WS_OVERLAPPED、WS_CAPTION、WS_SYSMENU、WS_THICKFRAME、WS_MINIMIZEBOX、WS_MAXIMIZEBOX),与WS_OVERLAPPEDWINDOW风格相同
WS_VISIBLE 创建一个初始状态为可见的窗口
WS_VSCROLL 创建一个有垂直滚动条的窗口

返回值:
1.如果函数成功,返回值为新窗口的句柄;
2.如果函数失败,返回值为 NULL。

ShowWindow

ShowWindow 函数用于设置窗口的显示状态
应用程序第一次调用 ShowWindow 时,应该使用 WinMain 函数的 nCmdshow 参数作为它的 nCmdShow 参数。
在随后调用 ShowWindow 函数时,必须使用下列显示方式中的一个给定值,而不是由 WinMain 函数的 nCmdSHow 参数指定的值。

1
2
3
4
BOOL WINAPI ShowWindow(
_In_ HWND hWnd,
_In_ int nCmdShow
);
参数 含义
hWnd 窗口句柄
nCmdShow 控制窗口如何显示,如果发送应用程序的程序提供了 STARTUPINFO 结构,则应用程序第一次调用 ShowWindow 时该参数被忽略。否则,在第一次调用 ShowWindow 函数时,该值应为在函数 WinMain 中 nCmdShow 参数

在随后的调用中,nCmdShow 参数可以为下列值之一

显示方式 含义
SW_FORCEMINIMIZE 1. 最小化窗口,即使拥有窗口的线程被挂起也会最小化
2.在从其他线程最小化窗口时才使用这个参数
SW_HIDE 隐藏窗口并激活其他窗口
SW_MAXIMIZE 最大化指定的窗口
SW_MINIMIZE 最小化指定的窗口并且激活在 Z 序中的下一个顶层窗口
SW_RESTORE 1.激活并显示窗口
2.如果窗口最小化或最大化,则系统将窗口恢复到原来的尺寸和位置
3.在恢复最小化窗口时,应用程序应该指定这个标志。
SW_SHOW 在窗口原来的位置以原来的尺寸激活并显示窗口
SW_SHOWDEFAULT 依据在 STARTUPINFO 结构中指定的 SW_FLAG 标志设定显示状态,STARTUPINFO 结构是由启动应用程序的程序传递给 CreateProcess 函数的。
SW_SHOWMAXIMIZED 激活窗口并将其最大化
SW_SHOWMINIMIZED 激活窗口并将其最小化
SW_SHOWMINNOACTIVE 1.窗口最小化
2.在窗口激活的情况下,这个值跟 SW_SHOWMINIMIZED 很相似
SW_SHOWNA 1.以窗口原来的位置以原来的尺寸显示窗口
2.在窗口激活的情况下,这个值跟 SW_SHOW 很相似
SW_SHOWNOACTIVATE 1.以窗口最近一次的位置和尺寸显示窗口
2.在窗口激活的情况下,这个值跟 SW_SHOWNORMAL 很相似
SW_SHOWNORMAL 1.激活并显示一个窗口
2.如果窗口被最小化或最大化,系统将其恢复到原来的尺寸和大小
3.应用程序在第一次显示窗口的时候应该指定此标志

返回值:
1.如果窗口之前可见,则返回值为非 0
2.如果窗口之前被隐藏,则返回值为 0

UpdateWindow

UpdateWindow 函数绕过应用程序的消息队列,直接发送 WM_PAINT 消息给指定窗口的窗口过程。
如果窗口更新的区域不为空,UpdateWindow 函数通过发送一个 WM_PAINT 消息来更新指定窗口的客户区。如果更新区域为空,则不发送消息。

1
2
3
BOOL UpdateWindow(
_In_ HWND hWnd
);
参数 含义
hWnd 指定要更新的窗口的句柄

返回值:
1.如果函数调用成功,返回值为非 0
2.如果函数调用不成功,返回值为 0

MSG 结构

在 Windows 程序中,消息是由 MSG 结构体来表示的

1
2
3
4
5
6
7
8
typedef struct tagMSG {
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
} MSG, *PMSG, *LPMSG;
成员 含义
hwnd 指定接收消息的窗口句柄,如果是线程消息,该值是 NULL
message 1.消息的标识符,由于数值不便于记忆,所以 Windows 将消息对应的数值定义为 WM_XXX 宏的形式
2.应用程序消息只能使用低 16 位,高 16 位被系统保留
3.传送门:Windows 常用消息及含义
wParam 指定消息的附加消息,确切的含义取决于消息成员的值
lParam 指定消息的附加消息,确切的含义取决于消息成员的值
time 该消息被投放到消息队列的时间
pt 当消息被投放到消息队列的时,鼠标位于屏幕中的位置