本帖最后由 鸦领主 于 2021-3-1 18:25 编辑
1.空项目创建窗口
因为要创建windows窗口
mian函数必须要写成
WINAPI WinMain(HINSTANCE hinstance HINSTANCE hPrevInstance LPSTR lpCmdLine int nCmdShow)
#include<iostream>
#include<windows.h>
using namespace std;
//窗口过程函数:用于处理消息
LRESULT CALLBACK MainWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lPara)
{
switch (uMsg)
{
case WM_DESTROY://点击右上角的x就
PostQuitMessage(0);//销毁窗口
default:
return DefWindowProc(hwnd, uMsg, wParam, lPara);//有很多不想处理的消息就转给系统去处理
}
}
int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
HWND hwnd;//句柄
WNDCLASSEX wnd; //窗口类,设置窗口的样式
wnd.cbSize = sizeof(WNDCLASSEX);//结构体大小赋值
wnd.style = CS_VREDRAW | CS_HREDRAW;//样式设置
wnd.lpfnWndProc = MainWndProc;//窗口过程赋值
wnd.cbClsExtra = 0;//类内存使用设置
wnd.cbWndExtra = 0;//窗口内存使用设置
wnd.hInstance = hinstance;//实例句柄设置
wnd.hIcon = NULL;//图标设置
wnd.hCursor = NULL;//鼠标箭头设置
wnd.hIconSm = NULL;//任务栏图标设置
wnd.hbrBackground = (HBRUSH)COLOR_INACTIVECAPTION;//背景设置
wnd.lpszMenuName = NULL;//设置菜单
wnd.lpszClassName = "MainWnd";//设置窗口类名称
RegisterClassEx(&wnd);//将窗口类注册
hwnd=CreateWindow("MainWnd", "Hello", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hinstance, NULL);//创建窗口
ShowWindow(hwnd, nShowCmd);//显示窗口
UpdateWindow(hwnd);//ShowWindow并不会立即显示,需要调用UpdateWindow让窗口立即显示
MSG msg;//将取到的消息放在这里
BOOL fGetMessage;//判断有没有取到
while ((fGetMessage = GetMessage(&msg, NULL, 0, 0)) != 0)
{
TranslateMessage(&msg);//将取到的消息翻译
DispatchMessage(&msg);//将翻译后的消息发送到窗口过程
}
return msg.wParam;
}
Windows API学习 创建窗口
WNDCLASSEX结构体详细了解:typedef struct tagWNDCLASSEXA {
UINT cbSize;
//此结构的大小(以字节为单位)。将此成员设置为sizeof(WNDCLASSEX)。在调用GetClassInfoEx函数之前,请确保设置此成员。
UINT style;
//类样式。此成员可以是类样式的任意组合。
WNDPROC lpfnWndProc;
//指向窗口过程的指针。必须使用自己定义的窗口过程函数(或CallWindowProc函数调用窗口过程)
int cbClsExtra;
//表示窗口类结构之后分配的额外的字节数。系统将该值初始化为0(不使用类内存)
int cbWndExtra;
//表示窗口实例之后分配的额外的字节数。系统将该值初始化为0(不使用窗口内存).如果使用资源文件里的CLASS指令创建对话框,
//并用WNDCLASS注册该对话框时,cbWndExtra必须设置成DLGWNDOWEXTRA
HINSTANCE hInstance;
//包含类的窗口过程的实例的句柄(WinMain第一个参数就是实列句柄)
HICON hIcon;
//设置图标类型。此成员必须是图标资源的句柄。如果此成员为NULL,系统将提供默认图标(也可以使用LoadIcon或LoadImage自定义设置)
HCURSOR hCursor;
// 设置鼠标箭头类型,如果设置为NULL,系统提供一个默认的鼠标样式,也可以自定设置
//LoadCursor(NULL,IDC_ARROW )第一个为NULL,IDC_ARROW为标准的箭头
HBRUSH hbrBackground;
//背景颜色设置,可以使用系统给出的,也可以GetStockObject使用这个函数给出的,需要用HBRUSH强制转换一下
LPCSTR lpszMenuName;
//设置窗口菜单,如果为NULL,则没有菜单
LPCSTR lpszClassName;
//设置窗口类的名称
HICON hIconSm;
//设置小图标,在任务栏显示的图标,可以和上面的那个一样
} WNDCLASSEXA, * PWNDCLASSEXA, * NPWNDCLASSEXA, * LPWNDCLASSEXA;
style:
CS_VREDRAW 一旦移动或尺寸调整使窗口的高度发生变化,就重新绘制窗口
CS_HREDRAW 一旦移动或尺寸调整使窗口的宽度发生变化,就重新绘制窗口
CS_OWNDC 独占设备描述表
CS_SAVEBITS 保存窗口覆盖区
CS_DBCLKS 允许两次连续按动
CS_BYTEALLGNCLIENT 鼠标用户区域按字节对齐显示
CS_BYTEALLGNWINDOW 鼠标用户窗口按字节对齐显示
CS_NOCLOSE 系统菜单中没有CLOSE菜单项
hbrBackground:
COLOR_ACTIVEBORDER
COLOR_ACTIVECAPTION
COLOR_APPWORKSPACE
COLOR_BACKGROUND
COLOR_BTNFACE
COLOR_BTNSHADOW
COLOR_BTNTEXT
COLOR_CAPTIONTEXT
COLOR_GRAYTEXT
COLOR_HIGHLIGHT
COLOR_HIGHLIGHTTEXT
COLOR_INACTIVEBORDER
COLOR_INACTIVECAPTION
COLOR_MENU
COLOR_MENUTEXT
COLOR_SCROLLBAR
COLOR_WINDOW
COLOR_WINDOWFRAME
COLOR_WINDOWTEXT
CreateWindow:创建窗口void CreateWindowA(
lpClassName,
lpWindowName,
dwStyle,
x,
y,
nWidth,
nHeight,
hWndParent,
hMenu,
hInstance,
lpParam
);
lpClassName--窗口类名称
lpWindowName--标题名称
dwStyle--窗口的样式(默认样式WS_OVERLAPPEDWINDOW)
x--x坐标(一般使用默认CW_USEDEFAULT)
y--y坐标(一般使用默认CW_USEDEFAULT)
nWidth--(一般使用默认CW_USEDEFAULT)
nHeight--(一般使用默认CW_USEDEFAULT)
hWndParent--设置子窗口或父窗口(没有填NULL)
hMenu--菜单的句柄(没有NULL)
hInstance--实例的句柄(WinMain第一个参数)
lpParam--创建时的数据(不需要填NULL)
如果函数成功,则返回值是新窗口的句柄。
如果函数失败,返回值为无效的
ShowWindow:显示窗口
hwnd--创建窗口返回的句柄
nCmdShow--WinMain最后一个参数
UpdateWindow:立即显示
hwnd--创建窗口返回的句柄
GetMessage:
BOOL GetMessage(
LPMSG lpMsg,
HWND hWnd,
UINT wMsgFilterMin,
UINT wMsgFilterMax
);
lpMsg--指向MSG结构的指针,将接收到的消息送入到该结构
hWnd--指定接收属于哪一个窗口的消息。通常我们将其设置为NULL,用于接收属于调用线程的所有窗口的窗口消息
wMsgFilterMin--指定要获取的消息的最小值,通常设置为0
wMsgFilterMax--指定要获取的消息的最大值。如果wMsgFilterMin和wMsgFilter Max都设置为0,则接收所有消息
返回值:BOOL,返回非零或者零
TranslateMessage:将虚拟密钥消息转换为字符消息
LRESULT DispatchMessage(
const MSG* lpMsg
);
lpMsg--指向消息结构
DispatchMessage:向窗口过程发送消息
LRESULT DispatchMessage(
const MSG* lpMsg
);
lpMsg--指向包含消息的结构的指针
2.使用对话框资源创建窗口
Windows API学习 创建窗口
Windows API学习 创建窗口
Windows API学习 创建窗口
这样一个窗口就创建成功了
#include<iostream>
#include<windows.h>
#include"resource.h"//包含资源文件的头文件
using namespace std;
INT_PTR CALLBACK MainWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lPara)
{
int n = 0;
switch (uMsg)
{
case WM_CLOSE:
EndDialog(hwnd, 0);
break;
case WM_COMMAND:
switch (wParam)
{
case IDC_BUTTON1:
MessageBox(hwnd, "你好!!!", "Hello", MB_OK);
break;
case IDC_BUTTON2:
MessageBox(hwnd, "是否要关闭!", "选择", MB_OKCANCEL);
break;
}
default:
return FALSE;
}
return TRUE;
}
int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
DialogBox(hinstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, MainWndProc);//
}
DialogBox:一个对话框资源中创建一个模态对话框
void DialogBoxA(
hInstance,
lpTemplate,
hWndParent,
lpDialogFunc
);
hInstance--实列句柄(WinMain第一个参数)
lpTemplate--资源文件中创建的窗口的ID([color=var(--theme-visited)]MAKEINTRESOURCE使用它将ID转换为兼容的资源类型)
hWndParent--指定拥有对话框的窗口(不指定就NULL)
lpDialogFunc--窗口过程函数(INT_PTR类型或BOOL类型)
通常,如果它处理了消息窗口过程应返回TRUE,如果窗口过程返回FALSE窗口管理器执行默认对话框操作以响应消息。
|