OpenGL | 利用VS创建Windows窗口

一、OpenCV与OpenGL

OpenCV是 Open Source Computer Vision Library,是从图像到数据。OpenCV主要是提供图像处理和视频处理的基础算法库,还涉及一些机器学习的算法。比如你想实现视频的降噪、运动物体的跟踪、目标(比如人脸)的识别这些都是CV的领域。

OpenGL是 Open Graphics Library,是从数据到图像。OpenGL专注在Graphics,3D绘图。

其实两者的区别就是Computer Vision和Computer Graphics这两个学科之间的区别,前者专注于从采集到的视觉图像中获取信息,是用机器来理解图像;后者是用机器绘制合适的视觉图像给人看。

二、教程笔记

1.创建Windows窗口的过程

创建一个窗口程序主要包含以下四个过程:

(1)注册窗口

(2)监听用户操作,窗口消息处理

(3)创建窗口并展示窗口

(4)通过循环确保窗口打开的时长

2. 代码展示

#include <windows.h>
//窗口消息处理函数
LRESULT CALLBACK GLWindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch (msg)
    {
    case WM_CLOSE:
        PostQuitMessage(0);
        return 0;
    }
    return DefWindowProc(hwnd, msg, wParam, lParam);  //系统默认消息处理函数
}

INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
    //注册窗口
    WNDCLASSEX wndclass;                  //WNDCLASSEX结构用于注册窗口类
    wndclass.cbClsExtra = 0;              //指定紧跟在窗口类结构后的附加字节数。
    wndclass.cbSize = sizeof(WNDCLASSEX); //WNDCLASSEX 的大小。我们可以用sizeof(WNDCLASSEX)来获得准确的值。
    wndclass.cbWndExtra = 0;              //指定紧跟在窗口实例的附加字节数
    wndclass.hbrBackground = NULL;        //背景画刷的句柄
    wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); //光标的句柄
    wndclass.hIcon = NULL;                //图标的句柄
    wndclass.hIconSm = NULL;              //和窗口类关联的小图标。如果该值为NULL。则把hIcon中的图标转换成大小合适的小图标。
    wndclass.hInstance = hInstance;       //本模块的实例句柄
    wndclass.lpfnWndProc = GLWindowProc;  //窗口处理函数的指针
    wndclass.lpszClassName = "GLWindow";  //指向类名称的指针
    wndclass.lpszMenuName = NULL;         //菜单名称
    wndclass.style = CS_VREDRAW|CS_HREDRAW;//窗口重绘方式

    ATOM atom = RegisterClassEx(&wndclass);  
    if (!atom)
    {
        MessageBox(NULL, "Register Fail", "Error", MB_OK);
        return 0;
    }

    //窗口大小设置,使窗口实际大小为800*600
    RECT rect;
    rect.left = 0;
    rect.right = 800;
    rect.top = 0;
    rect.bottom = 600;
    AdjustWindowRect(&rect, WS_OVERLAPPEDWINDOW, NULL);
    int windowWidth = rect.right - rect.left;
    int windowHeight = rect.bottom - rect.top;

    //创建窗口
    HWND hwnd = CreateWindowEx(NULL, "GLWindow", "OpenGL Window", WS_OVERLAPPEDWINDOW,
        100, 100, 800, 600, 
        NULL, NULL, hInstance, NULL);
    //显示窗口
    ShowWindow(hwnd, SW_SHOW);
    UpdateWindow(hwnd);

    //防止窗口一闪而过
    MSG msg;
    while (true)
    {
        if (PeekMessage(&msg, NULL, NULL, NULL, PM_REMOVE))
        {
            if (msg.message == WM_QUIT)
            {
                break;
            }
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }

    return 0;

}

3.解决问题

项目运行时报如下错,是因为我们新建工程时项目是控制台应用程序,而不是窗口应用程序。

报错信息

解决办法

猜你喜欢

转载自blog.csdn.net/weixin_39766005/article/details/128794361