本篇作为Windows API 系列文章的第一篇,将简要的讲解一下什么是Windows API,Windows API能做些什么,并且尽可能讲解一些新出现的专有名词;本系列博文几乎没有难啃的“专业术语”,尽量让读者能够看明白文章所述内容,是本系列博文的核心宗旨之一。(由于本人也是由于项目需要,所以才来查阅相关资料,文中出现的错误欢迎指出,共同进步!谢谢!) 读本系列博文的读者必须具备以下的知识储备: 窗口在 Windows 中指一个矩形区域,一般情况下这个区域是用户与应用程序交互的枢纽;上一小节使用 MessageBox 创建的简单窗口也是与用户交互的一个窗口,该窗口的功能有限,只能够简单的展示一些想要表达的信息,想创建一个能表达更多信息的窗口,可以使用 CreateWindow 函数创建。 创建 Windows 桌面应用程序需要 windows.h,在头部引入 windows.h 头文件。 在C语言中,每个C语言程序都有一个入口函数,在Windows桌面程序中,这个入口函数是 WinMain ,具体声明如下: 在程序中,紧接着在头部文件后,我们使用 WinMain作为程序的入口函数: 写好入口函数后,必须要使用 RegisterClassEx 注册一个新的窗口类型,再使用 CreateWindow 进行创建。 在注册新窗口前,我们可以使用一个 WNDCLASSEX 结构用来描述创建的Windows,这是窗口类;微软开发中心对WNDCLASSEXA的描述:“Contains window class information. It is used with the RegisterClassEx and GetClassInfoEx functions.”;WNDCLASSEXA 是包含窗口信息的结构。语法如下: 结构成员: 代码实现如下: —————————————————————————————————— 值参考: LoadCursor 返回类型为 HCURSOR:的语法如下: 参数说明: 在微软的参考文档中说明,lpCursorName 的可设置为以下值: lpfnWndProc 为接收窗口处理的指针,使用 WndProc 处理应用程序在发生事件时从 Windows 接收的消息。在微软的文档中写道:“WndProc 是每个 Windows 桌面应用程序必须的窗口过程功能。 此函数通常命名为WndProc,但您可以随心所欲地命名它。 例如,如果用户在应用程序中选择”确定”按钮,Windows 会向您发送消息,您可以在WndProc函数内编写代码,执行任何适当的操作。 这称为处理事件。 您只处理与应用程序相关的事件。WndProc 具有以下语法”;如下:。 那我们在程序中声明也如此声明,那么定义如下(使用微软文档示例): 在以上 WndProc 的实现中,使用了 switch 语句,在 switch 中判断了 WM_PAINT 消息;WM_PAINT 消息为绘制主窗体,在文档中写到: 要处理的一条重要信息是WM_PAINT消息。 当必须更新其显示WM_PAINT窗口的一部分时,应用程序将接收消息。 —————————————————————————————————— BeginPaint 的语法为: 参数说明: —————————————————————————————————— 该调用EndPaint函数标记指定窗口画的结束。每次调用BeginPaint函数都需要此函数,但是仅在绘制完成之后。 语法: 参数说明: —————————————————————————————————— 向系统指示线程已请求终止(退出)。通常用于响应WM_DESTROY消息。 语法: 参数说明: —————————————————————————————————— 调用默认窗口过程以为应用程序未处理的任何窗口消息提供默认处理。此功能确保处理所有消息。DefWindowProc用窗口过程接收到的相同参数调用。 语法: 参数说明: —————————————————————————————————— 所述的TextOut函数在指定位置写入的字符串,利用当前选择的字体,背景颜色和文本颜色。 语法: 参数说明: —————————————————————————————————— 引用文档解释: HDC代码中是设备上下文的句柄,这是 Windows 用于使应用程序与图形子系统通信的数据结构。 销毁窗口时发送。从窗口中删除窗口后,它将被发送到销毁窗口的窗口过程。 WM_DESTROY 在 WndProc 函数中使用 —————————————————————————————————— 当应用程序通过调用CreateWindowEx或CreateWindow函数请求创建窗口时发送。(在函数返回之前发送消息。)在创建窗口之后,但在该窗口变为可见之前,新窗口的窗口过程会收到此消息。 —————————————————————————————————— 之后注册该窗口,使用 RegisterClassEx: 注册后使用 CreateWindow 进行注册的窗口创建语法如下: 参数说明: 创建窗体: 应用窗体名为 szWindowClass: 应用窗体名为 szTitle: 窗体风格类型为:WS_OVERLAPPEDWINDOW 代码如下: —————————————————————————————————— 完成以上代码后,还需使用 ShowWindow 让Windows窗体指定如何显示,代码如下: 语法: 参数说明: nCmdShow 参考: 使用 UpdateWindow 发送 WM_PAINT 消息,更新指定窗口。 参数: 整体代码如下: 运行程序,发现出现了一闪而过的窗口,这个很像刚学习C语言的时候,没有加上停止;那我们就循环侦听 Windows 发送的消息即可: —————————————————————————————————— GetMessage 从调用线程的消息队列中检索消息。该函数分派传入的已发送消息,直到已发布的消息可供检索为止。 语法: 参数说明: —————————————————————————————————— 运行结果如下:
开始创建
#include <windows.h>
WinMain
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow);
#include <windows.h> int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {}
WNDCLASSEX
typedef struct tagWNDCLASSEXA { UINT cbSize; UINT style; WNDPROC lpfnWndProc; int cbClsExtra; int cbWndExtra; HINSTANCE hInstance; HICON hIcon; HCURSOR hCursor; HBRUSH hbrBackground; LPCSTR lpszMenuName; LPCSTR lpszClassName; HICON hIconSm; } WNDCLASSEXA, *PWNDCLASSEXA, *NPWNDCLASSEXA, *LPWNDCLASSEXA;
sizeof(WNDCLASSEX)
CS_HREDRAW | CS_VREDRAW
static TCHAR szWindowClass[] = _T("ImapBox @1_bit");
WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION)); wcex.hCursor = LoadCursor(NULL, IDC_CROSS); wcex.hbrBackground = (HBRUSH)(COLOR_ACTIVECAPTION); wcex.lpszMenuName = NULL; wcex.lpszClassName = szWindowClass; wcex.hIconSm = LoadIcon(NULL, MAKEINTRESOURCE(IDI_INFORMATION));
WNDCLASSEX hbrBackground
——————————————————————————————————LoadCursor
HCURSOR LoadCursorW( HINSTANCE hInstance, LPCWSTR lpCursorName );
——————————————————————————————————lpfnWndProc
LRESULT CALLBACK WndProc( _In_ HWND hWnd, _In_ UINT message, _In_ WPARAM wParam, _In_ LPARAM lParam );
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { PAINTSTRUCT ps; HDC hdc; TCHAR greeting[] = _T("Hello, 我是ImapBox 1_bit 博客主页:https://me.csdn.net/A757291228 "); switch (message) { case WM_PAINT: hdc = BeginPaint(hWnd, &ps); TextOut(hdc, 5, 5, greeting, _tcslen(greeting)); EndPaint(hWnd, &ps); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); break; } return 0; }
当用户在窗口前面移动窗口,然后再次将其移开时,可能会发生此事件。 您的应用程序不知道这些事件何时发生。 只有 Windows
知道,因此它会通过消息WM_PAINT通知你的应用。 首次显示窗口时,必须更新所有窗口。 要处理 WM_PAINT 消息,首先应调用
BeginPaint,然后处理所有的逻辑以在窗口中布局文本、按钮和其他控件,然后调用 EndPaint。BeginPaint
HDC BeginPaint( HWND hWnd, LPPAINTSTRUCT lpPaint );
EndPaint
BOOL EndPaint( HWND hWnd, const PAINTSTRUCT *lpPaint );
PostQuitMessage
void PostQuitMessage( int nExitCode );
DefWindowProc
LRESULT LRESULT DefWindowProcA( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam );
TextOut
BOOL TextOutW( HDC hdc, int x, int y, LPCWSTR lpString, int c );
HDC
WM_DESTROY
此消息首先发送到被销毁的窗口,然后发送到被销毁的子窗口(如果有)。在处理消息期间,可以假定所有子窗口仍然存在。补充
WM_CREATE
RegisterClassEx
RegisterClassEx(&wcex);
HWND CreateWindow( LPCTSTR lpClassName, LPCTSTR lpWindowName, DWORD dwStyle, int x, int y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HANDLE hInstance, PVOID lpParam );
HWND hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 1000, 1000, NULL, NULL, hInstance, NULL);
static TCHAR szWindowClass[] = _T("win32 Demo");
static TCHAR szTitle[] = _T("This Win32");
初始位置为:CW_USEDEFAULT,默认左上角出现
尺寸为:1000, 1000
父级及菜单栏都为:NULL
hInstance为:当前实例 hInstance
lpParam应用程序使用为:NULL#include <windows.h> #include <tchar.h> static TCHAR szWindowClass[] = _T("ImapBox @1_bit"); static TCHAR szTitle[] = _T("Win32 桌面应用程序"); HINSTANCE hInst; LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION)); wcex.hCursor = LoadCursor(NULL, IDC_CROSS); wcex.hbrBackground = (HBRUSH)(COLOR_ACTIVECAPTION); wcex.lpszMenuName = NULL; wcex.lpszClassName = szWindowClass; wcex.hIconSm = LoadIcon(NULL, MAKEINTRESOURCE(IDI_INFORMATION)); RegisterClassEx(&wcex); hInst = hInstance; HWND hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 500, 100, NULL, NULL, hInstance, NULL); } LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { PAINTSTRUCT ps; HDC hdc; TCHAR greeting[] = _T("Hello, 我是ImapBox 1_bit 博客主页:https://me.csdn.net/A757291228 "); switch (message) { case WM_PAINT: hdc = BeginPaint(hWnd, &ps); TextOut(hdc, 5, 5, greeting, _tcslen(greeting)); EndPaint(hWnd, &ps); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); break; } return 0; }
ShowWindow
ShowWindow(hWnd, nCmdShow);
BOOL ShowWindow( HWND hWnd, int nCmdShow );
——————————————————————————————————UpdateWindow
语法:BOOL UpdateWindow( HWND hWnd );
#include <windows.h> #include <tchar.h> static TCHAR szWindowClass[] = _T("ImapBox @1_bit"); static TCHAR szTitle[] = _T("Win32 桌面应用程序"); HINSTANCE hInst; LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION)); wcex.hCursor = LoadCursor(NULL, IDC_CROSS); wcex.hbrBackground = (HBRUSH)(COLOR_ACTIVECAPTION); wcex.lpszMenuName = NULL; wcex.lpszClassName = szWindowClass; wcex.hIconSm = LoadIcon(NULL, MAKEINTRESOURCE(IDI_INFORMATION)); RegisterClassEx(&wcex); hInst = hInstance; HWND hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 500, 100, NULL, NULL, hInstance, NULL); ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return 0; } LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { PAINTSTRUCT ps; HDC hdc; TCHAR greeting[] = _T("Hello, 我是ImapBox 1_bit 博客主页:https://me.csdn.net/A757291228 "); switch (message) { case WM_PAINT: hdc = BeginPaint(hWnd, &ps); TextOut(hdc, 5, 5, greeting, _tcslen(greeting)); EndPaint(hWnd, &ps); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); break; } return 0; }
MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return (int) msg.wParam;
GetMessage
BOOL GetMessage( LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax );
MSG
结构的指针,该结构从线程的消息队列接收消息信息。完整代码
#include <windows.h> #include <tchar.h> static TCHAR szWindowClass[] = _T("ImapBox @1_bit"); static TCHAR szTitle[] = _T("Win32 桌面应用程序"); HINSTANCE hInst; LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION)); wcex.hCursor = LoadCursor(NULL, IDC_CROSS); wcex.hbrBackground = (HBRUSH)(COLOR_ACTIVECAPTION); wcex.lpszMenuName = NULL; wcex.lpszClassName = szWindowClass; wcex.hIconSm = LoadIcon(NULL, MAKEINTRESOURCE(IDI_INFORMATION)); RegisterClassEx(&wcex); hInst = hInstance; HWND hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 500, 100, NULL, NULL, hInstance, NULL); ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return (int)msg.wParam; } LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { PAINTSTRUCT ps; HDC hdc; TCHAR greeting[] = _T("Hello, 我是ImapBox 1_bit 博客主页:https://me.csdn.net/A757291228 "); switch (message) { case WM_PAINT: hdc = BeginPaint(hWnd, &ps); TextOut(hdc, 5, 5, greeting, _tcslen(greeting)); EndPaint(hWnd, &ps); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); break; } return 0; }
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算