C语言创建windows窗口实例

下面是关于C语言创建Windows窗口实例的完整攻略,分为以下几个步骤:

1. 引入必要的头文件

首先我们需要在程序中引入必要的头文件,包括Windows.h和tchar.h。这些头文件在使用Windows API时必须被包含,以便于调用其中定义的函数和宏。

#include <windows.h>
#include <tchar.h>

2. 定义窗口过程函数

窗口过程函数是Windows程序中最重要的函数之一。它负责处理窗口的消息和事件,比如响应用户的鼠标和键盘操作,处理窗口的绘制,以及定时器等各种功能。

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
    }

    return 0;
}

3. 注册窗口类

在创建窗口实例之前,我们需要先注册一个窗口类。窗口类是Windows程序中用来描述窗口的一个数据结构,它包含了窗口的各种属性(如背景颜色、边框风格、菜单等)以及窗口过程函数的指针。

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(nullptr, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wcex.lpszMenuName = nullptr;
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_APPLICATION));

if (!RegisterClassEx(&wcex))
{
    MessageBox(nullptr,
           _T("Call to RegisterClassEx failed!"),
           _T("Win32 Desktop App"),
           MB_ICONERROR);

    return 1;
}

这里我们定义了一个WNDCLASSEX结构体,设置了窗口类的各种属性,然后通过RegisterClassEx函数将窗口类注册到Windows系统中。

4. 创建窗口实例

窗口类注册成功后,我们就可以开始创建窗口实例了。创建窗口实例需要使用CreateWindowEx函数。这个函数的参数包括窗口类名、窗口标题、窗口样式、窗口位置和大小等信息,其中窗口位置和大小是可选的。

HWND hWnd = CreateWindowEx(
    WS_EX_CLIENTEDGE,
    szWindowClass,
    _T("Hello, World!"),
    WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT, CW_USEDEFAULT,
    500, 500,
    nullptr,
    nullptr,
    hInstance,
    nullptr);

if (!hWnd)
{
    MessageBox(nullptr,
           _T("Call to CreateWindowEx failed!"),
           _T("Win32 Desktop App"),
           MB_ICONERROR);

    return 1;
}

这里我们通过CreateWindowEx函数创建了一个基本的窗口实例,并将其赋值给了hWnd变量,用于后续的操作。

5. 显示窗口实例和消息循环

窗口实例创建成功后,为了看到窗口,我们需要将其显示出来。这个可以通过ShowWindow函数实现。然后,我们需要进入消息循环,在程序窗口未关闭之前,程序都会不断地循环接收消息,处理消息,再接收消息,处理消息的过程。

ShowWindow(hWnd,
    nCmdShow);
UpdateWindow(hWnd);

// Main message loop:
MSG msg;
while (GetMessage(&msg, nullptr, 0, 0))
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}

return (int) msg.wParam;

这里我们首先通过ShowWindow函数将窗口实例显示出来,并使用UpdateWindow函数更新窗口。然后进入一个while循环,不断调用GetMessage函数等待消息,然后将消息转换并分发到对应的窗口过程函数进行处理。

示例1:一个简单的窗口程序

下面是一个简单的窗口程序示例,它创建了一个基本的窗口实例,并在窗口中显示“Hello, World!”这个字符串。

#include <windows.h>
#include <tchar.h>

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    const TCHAR szWindowClass[] = _T("DesktopApp");

    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(nullptr, IDC_ARROW);
    wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
    wcex.lpszMenuName = nullptr;
    wcex.lpszClassName = szWindowClass;
    wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_APPLICATION));

    if (!RegisterClassEx(&wcex))
    {
        MessageBox(nullptr,
               _T("Call to RegisterClassEx failed!"),
               _T("Win32 Desktop App"),
               MB_ICONERROR);

        return 1;
    }

    HWND hWnd = CreateWindowEx(
        WS_EX_CLIENTEDGE,
        szWindowClass,
        _T("Hello, World!"),
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT,
        500, 500,
        nullptr,
        nullptr,
        hInstance,
        nullptr);

    if (!hWnd)
    {
        MessageBox(nullptr,
               _T("Call to CreateWindowEx failed!"),
               _T("Win32 Desktop App"),
               MB_ICONERROR);

        return 1;
    }

    ShowWindow(hWnd,
        nCmdShow);
    UpdateWindow(hWnd);

    // Main message loop:
    MSG msg;
    while (GetMessage(&msg, nullptr, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return (int) msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
    }

    return 0;
}

示例2:带按钮的窗口程序

下面是一个稍微复杂一点的窗口程序示例,它创建了带有一个按钮的窗口实例,并使用对应的窗口过程函数处理按钮点击事件。

#include <windows.h>
#include <tchar.h>

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
void OnCommand(HWND hWnd, int id, HWND hwndCtl, UINT codeNotify);

const TCHAR szWindowClass[] = _T("DesktopApp");
const TCHAR szWindowTitle[] = _T("Hello, World!");

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    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(nullptr, IDC_ARROW);
    wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
    wcex.lpszMenuName = nullptr;
    wcex.lpszClassName = szWindowClass;
    wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_APPLICATION));

    if (!RegisterClassEx(&wcex))
    {
        MessageBox(nullptr,
            _T("Call to RegisterClassEx failed!"),
            _T("Win32 Desktop App"),
            MB_ICONERROR);

        return 1;
    }

    HWND hWnd = CreateWindowEx(
        WS_EX_CLIENTEDGE,
        szWindowClass,
        szWindowTitle,
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT,
        500, 500,
        nullptr,
        nullptr,
        hInstance,
        nullptr);

    if (!hWnd)
    {
        MessageBox(nullptr,
            _T("Call to CreateWindowEx failed!"),
            _T("Win32 Desktop App"),
            MB_ICONERROR);

        return 1;
    }

    // Create a button
    HWND hWndButton = CreateWindow(
        _T("BUTTON"),
        _T("Click me"),
        WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,
        10, 10,
        100, 30,
        hWnd,
        (HMENU) 1,
        (HINSTANCE) GetWindowLong(hWnd, GWL_HINSTANCE),
        nullptr);

    if (!hWndButton)
    {
        MessageBox(nullptr,
            _T("Call to CreateWindow failed!"),
            _T("Win32 Desktop App"),
            MB_ICONERROR);

        return 1;
    }

    ShowWindow(hWnd,
        nCmdShow);
    UpdateWindow(hWnd);

    // Main message loop:
    MSG msg;
    while (GetMessage(&msg, nullptr, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return (int) msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_COMMAND:
        OnCommand(hWnd, LOWORD(wParam), (HWND) lParam, HIWORD(wParam));
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }

    return 0;
}

void OnCommand(HWND hWnd, int id, HWND hwndCtl, UINT codeNotify)
{
    switch (id)
    {
    case 1:
        MessageBox(hWnd,
            _T("Hello, World!"),
            _T("Greetings"),
            MB_OK);
        break;
    default:
        break;
    }
}

在上面的例子中,我们首先创建了一个标题为“Hello, World!”的窗口实例,然后通过CreateWindow函数创建了一个按钮,并设置其位置和大小和按钮上的文本,接着我们注册了窗口过程函数,在过程函数中对按钮事件进行处理,最后在消息循环中调用GetMessage函数,等待用户输入和系统事件的触发。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言创建windows窗口实例 - Python技术站

(1)
上一篇 2023年5月24日
下一篇 2023年5月24日

相关文章

  • C++中四种对象生存期和作用域以及static的用法总结分析

    C++中四种对象生存期和作用域以及static的用法总结分析 在C++中,对象是程序中的基本组成单位之一。对象有不同的生存期和作用域,对于理解C++程序的运行过程至关重要。static是一个关键字,它有多种用途。本文将详细介绍C++中四种对象生存期和作用域以及static的用法。 对象的生存期和作用域 C++中的对象根据生存期和作用域的不同可以分为以下四类:…

    C 2023年5月22日
    00
  • win10系统左下角搜索栏点击Win+C无反应的解决方法

    当我们在Win10系统中使用搜索栏,偶尔会遇到点击Win+C无反应的问题。这可能是由于系统故障、Win10更新问题或安装软件不当等原因引起的。以下是解决这个问题的完整攻略,可以帮助您解决这个问题。 问题分析 当搜索栏出现在左下角时,在Windows 10操作系统上单击Win+C组合键时,应该会打开Cortana语音助手,但是有时候无论怎么按,都没有反应。这种…

    C 2023年5月23日
    00
  • 如何利用OpenGL画坐标轴指示图

    下面是详细的攻略,它包括了OpenGL画坐标轴指示图的完整过程: 准备工作 在开始之前,我们需要安装以下工具: OpenGL库(例如OpenGL ES或OpenGL) 开发环境,例如Visual Studio或Xcode 了解C++语言编程 步骤一:建立OpenGL的环境 我们需要建立OpenGL的环境来画图。在这个步骤中,你需要建立OpenGL窗口并初始化…

    C 2023年5月23日
    00
  • C++简明图解分析静态成员与单例设计模式

    C++语言中,可以通过类的静态成员实现单例设计模式,下面是详细的攻略: 一、静态成员介绍 1.1 定义静态成员 静态成员是类的一种特殊成员,它属于类的整体,而不是属于类的某个对象。在类定义中,通过关键字 static 能够定义静态成员,如下所示: class ClassName { public: static int staticVar; // 定义静态成…

    C 2023年5月22日
    00
  • C语言实现推箱子项目

    下面是“C语言实现推箱子项目”的完整攻略: 一、项目介绍 推箱子是一款经典的游戏,这里将通过C语言来实现这个项目。游戏的主要玩法是玩家控制一个人物推着多个箱子走到特定的位置。要求箱子能够被推到指定的位子,不能被推到障碍物上,也不能被推到死路上。本项目主要使用C语言中的字符数组和指针操作等相关知识。 二、实现过程 游戏地图设计 游戏地图是一个二维数组。玩家需要…

    C 2023年5月23日
    00
  • C语言 strstr()函数

    当你需要在一个字符串中查找另一个字符串的时候,strstr()函数是一个非常有用的工具。它可以帮助你查找一个字符串中是否包含另一个指定的字符串,并返回匹配的位置。 语法 strstr()函数的语法如下: char* strstr(const char* str1, const char* str2); 该函数接受两个参数:str1和str2。str1是主字符…

    C 2023年5月9日
    00
  • 一加8T怎么样?一加8T屏幕、拍照、性能等全面评测

    一加8T全面评测 一加8T基本信息 发布时间:2020年10月 屏幕尺寸:6.55英寸 像素密度:402ppi 分辨率:2400*1080 FHD+ AMOLED 处理器:高通骁龙865 一加8T屏幕评测 一加8T采用了6.55英寸FHD+ AMOLED屏幕,像素密度为402ppi,分辨率达到2400*1080。屏幕亮度高,色彩鲜艳饱满。HDR10+支持带来…

    C 2023年5月22日
    00
  • VC程序设计小技巧20例

    “VC程序设计小技巧20例”完整攻略 简介 VC程序设计小技巧20例是VC++程序设计中常用的技巧总结,适合于从事VC++开发者,主要包括优化技巧、调试技巧、安全技巧等。以下是详细的攻略总结。 1. 使用switch代替if语句 if语句在判断多个变量时效率低下,可以使用switch代替,代码如下: char c; cin >> c; switc…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部