鸦领主 发表于 2021-3-1 15:33:39

Windows API学习 创建窗口

本帖最后由 鸦领主 于 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(HWNDhwnd, UINTuMsg, 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;
}


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,
    HWNDhWnd,
    UINTwMsgFilterMin,
    UINTwMsgFilterMax
);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.使用对话框资源创建窗口
这样一个窗口就创建成功了
#include<iostream>
#include<windows.h>
#include"resource.h"//包含资源文件的头文件
using namespace std;
INT_PTR CALLBACK MainWndProc(HWNDhwnd, UINTuMsg, 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(MAKEINTRESOURCE使用它将ID转换为兼容的资源类型)
hWndParent--指定拥有对话框的窗口(不指定就NULL)
lpDialogFunc--窗口过程函数(INT_PTR类型或BOOL类型)
通常,如果它处理了消息窗口过程应返回TRUE,如果窗口过程返回FALSE窗口管理器执行默认对话框操作以响应消息。

页: [1]
查看完整版本: Windows API学习 创建窗口