查看: 739|回复: 0

[原创图文] Windows API学习 创建窗口

[复制链接]

35

主题

47

帖子

3

精华

解密专家

Rank: 16

学币
380
荣耀
0
rank
0
违规
0
发表于 2021-3-1 15:33:39 | 显示全部楼层 |阅读模式
本帖最后由 鸦领主 于 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学习 创建窗口

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学习 创建窗口

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窗口管理器执行默认对话框操作以响应消息。

温馨提示:
1.如果您喜欢这篇帖子,请给作者点赞评分,点赞会增加帖子的热度,评分会给作者加学币。(评分不会扣掉您的积分,系统每天都会重置您的评分额度)。
2.回复帖子不仅是对作者的最好奖励,还可以获得学币奖励,请尊重作者的劳动成果,拒绝做伸手党!
3.发广告、灌水回复等违规行为一经发现直接禁言,如果本帖内容涉嫌违规,请点击论坛底部的举报反馈按钮,也可以在【投诉建议】板块发帖举报。
学逆向论坛-免费的逆向学习论坛
关闭

论坛公告上一条 /1 下一条

快速回复 返回顶部 返回列表