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.解决问题

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

报错信息

解决办法

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
MFC (Microsoft Foundation Class) 是 Microsoft Windows 操作系统的一个应用程序框架,它提供了一组类库和函数,使得开发者可以快速开发 Windows 应用程序。而 OpenGL 是一个图形库,可以用于创建精美的二维和三维图形。 要利用 MFC 实现一个画板,可以借助 OpenGL 来绘制图形和处理用户的交互。首先,在 MFC 应用程序创建一个窗口,可以通过继承 CWnd 类来实现。然后,需要在窗口中集成 OpenGL,可以使用OpenGL的扩展库 (GLEW 或者 GLEW32) 来方便地加载 OpenGL 的函数。 接下来,需要处理用户的鼠标和键盘交互。通过重写窗口类中的 OnLButtonDown、OnMouseMove、OnLButtonUp、OnKeyDown、OnKeyUp 等消息处理函数,可以实现画画板上的交互操作。比如,当用户按下鼠标左键并拖动时,可以利用 OpenGL 的绘制函数来绘制相应的图形。 为了实现绘制功能,可以利用 OpenGL 的基本绘制函数,例如 glPointSize、glLineWidth、glBegin、glVertex 等。可以根据用户的输入,计算出相应的坐标,并调用这些 OpenGL 函数来绘制图形。当用户拖动鼠标或按下键盘时,可以更新坐标,并调用 Invalidate 函数来触发窗口重绘。 当然,还可以添加更多的功能,比如绘制不同类型的图形、填充颜色、撤销操作、保存和加载绘图等。通过在 MFC 应用程序中使用OpenGL,可以实现一个功能强大且具有良好交互性的画板。 总之,利用 MFC 结合 OpenGL 可以实现一个高效、灵活且具有交互性的画板应用程序,开发者可以根据需求进一步扩展和完善这个应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烫青菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值