jjzjj

c++ - Windows 函数 ChoosePixelFormat 在 Windows 7 上返回 ERR_OLD_WIN_VERSION

coder 2024-06-13 原文

我试图通过制作一个窗口并将 OpenGL 上下文附加到它来自学 win32 API。为了获取适当的像素格式,必须调用 ChoosePixelFormat,它应该返回系统支持并最能满足我的需要的像素格式。当我检查错误时,一切顺利,直到调用此函数停止执行并记录错误 1150-ERR_OLD_WIN_VERSION,这应该意味着我的 Windows 版本不支持此功能。显然不是这种情况,msdn 确认此功能可在自 windows 2000 以来的所有 windows 版本上运行。现在我在桌面上运行 windows 7 x64,并且我确保我的视频驱动程序和操作系统已完全更新。很多人似乎在像素格式功能方面遇到了麻烦,但我没有发现任何问题,所以我决定在这里发帖寻求帮助。这是我的完整代码;除了我自己的机器之外,我没有在任何机器上测试过它。

WinMain.cpp(与此链接的唯一非默认 msvc 库是 opengl32.lib)

#include"Display.h"
#include<iostream>
#include<fstream>

MSG message;
DWORD error;
int status;

LRESULT CALLBACK WndProc(HWND hWindow, UINT message, WPARAM wParam, LPARAM lParam)
{   switch(message)
    {case WM_CREATE:
        return 0;
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    case WM_KEYDOWN:
        switch(wParam)
        {case VK_ESCAPE:
            PostQuitMessage(0);
            return 0;}}
    return DefWindowProc(hWindow, message, wParam, lParam);}

int MainLoop(Display d)
{
    while((status = PeekMessage(&message, d.hWindow, 0, 0, PM_REMOVE)) != 0)
    {
        if (status == -1)
        {
            return -1;
        }
        DispatchMessage(&message);
    }
    return 0;
}

int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    std::ofstream file("log.txt", std::ios::trunc);


    Display window("TEST", hInstance, WndProc, 50, 50, 50, 50, NULL, NULL);
    if(window.status == -1)
    {   error = GetLastError();
        file << error;
        return 1;}

    ShowWindow(window.hWindow, SW_SHOWNORMAL);
    EnableWindow(window.hWindow, true);
    MainLoop(window);

    return 0;
}

Display.h(问题出现在类构造函数中)

#include <Windows.h>

class Display   
{public:
    Display(const char*, HINSTANCE, WNDPROC, int, int, int, int, DWORD, DWORD);
    ~Display();
    HWND hWindow;
    int status;
private:
    WNDCLASSEX data;
    HDC hDeviceContext;
    HGLRC hGLContext;
    PIXELFORMATDESCRIPTOR PFD;
    int x, y, width, height;};
Display::Display(const char* title, HINSTANCE InstanceHandle, WNDPROC WindowProcedure, int ScreenPositionX, int ScreenPositionY, int WindowWidth, int WindowHeight, DWORD StyleFlags, DWORD ExtendedStyleFlags)
{   data.cbSize = sizeof(WNDCLASSEX);
    data.style = CS_OWNDC;
    data.lpfnWndProc = WindowProcedure;
    data.cbClsExtra = 0;
    data.cbWndExtra = 0;
    data.hInstance = InstanceHandle;
    data.hIcon = NULL;
    data.hCursor = NULL;
    data.hbrBackground = NULL;
    data.lpszMenuName = NULL;
    data.lpszClassName = "WIN1"; 
    data.hIconSm = NULL;
    RegisterClassEx(&data);
    hWindow = CreateWindowEx(ExtendedStyleFlags, data.lpszClassName, title, StyleFlags | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, x = ScreenPositionX, y = ScreenPositionY, width = WindowWidth, height = WindowHeight, NULL, NULL, InstanceHandle, NULL);
    PFD.nSize = sizeof(PIXELFORMATDESCRIPTOR);
    PFD.nVersion = 1;
    PFD.iPixelType = PFD_TYPE_RGBA;
    PFD.iLayerType = PFD_MAIN_PLANE;
    PFD.dwVisibleMask = 0;
    PFD.dwLayerMask = 0;
    PFD.dwDamageMask = 0;
    PFD.dwFlags = PFD_DRAW_TO_WINDOW | PFD_DOUBLEBUFFER | PFD_SUPPORT_OPENGL;
    PFD.cAuxBuffers = 0;
    PFD.bReserved = 0;
    PFD.cColorBits = 24;
    PFD.cAccumBits = 0;
    PFD.cDepthBits = 32;
    PFD.cStencilBits = 0;
    PFD.cAlphaBits = 0;
    PFD.cAccumAlphaBits = 0;
    PFD.cAlphaShift = 0;
    PFD.cBlueBits = 0;
    PFD.cAccumBlueBits = 0;
    PFD.cBlueShift = 0;
    PFD.cGreenBits = 0;
    PFD.cAccumGreenBits = 0;
    PFD.cGreenShift = 0;
    PFD.cRedBits = 0;
    PFD.cAccumRedBits = 0;
    PFD.cRedShift = 0;
    hDeviceContext = GetDC(hWindow);
    int pf = ChoosePixelFormat(hDeviceContext, &PFD); //throws error 1150, next three throw error 2000 because of this failing
    SetPixelFormat(hDeviceContext, pf, &PFD);
    hGLContext = wglCreateContext(hDeviceContext);
    wglMakeCurrent(hDeviceContext, hGLContext);
    if(GetLastError() != ERROR_SUCCESS)
        {status = -1;}
    else
        {status = 0;}
    return;}
Display::~Display()
{   wglMakeCurrent(NULL, NULL);
    wglDeleteContext(hGLContext);
    DestroyWindow(hWindow);
    UnregisterClass(data.lpszClassName, data.hInstance);}

最佳答案

在我尝试了所有提到的解决方案之后,在 ChoosePixelFormat 之后我仍然遇到与 ERR_OLD_WIN_VERSION 相同的问题。就我而言,问题出在显卡驱动程序上:

我正在使用的系统使用带有 GTX 770 GPU 的 EVGA 卡,昨天我安装了 331.65 版驱动程序。之后我遇到了和提问者一样的问题。安装当前版本 337.88 解决了我的问题。然而,ERR_OLD_WIN_VERSION 似乎把我们引向了错误的方向。

关于c++ - Windows 函数 ChoosePixelFormat 在 Windows 7 上返回 ERR_OLD_WIN_VERSION,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18599826/

有关c++ - Windows 函数 ChoosePixelFormat 在 Windows 7 上返回 ERR_OLD_WIN_VERSION的更多相关文章

  1. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  2. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  3. ruby - 在没有 sass 引擎的情况下使用 sass 颜色函数 - 2

    我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re

  4. ruby-on-rails - 在 ruby​​ 中使用 gsub 函数替换单词 - 2

    我正在尝试用ruby​​中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了

  5. ruby - 在 Ruby 中有条件地定义函数 - 2

    我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin

  6. ruby - 在 Windows 机器上使用 Ruby 进行开发是否会适得其反? - 2

    这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby​​-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub

  7. ruby - 在 Ruby 中按名称传递函数 - 2

    如何在Ruby中按名称传递函数?(我使用Ruby才几个小时,所以我还在想办法。)nums=[1,2,3,4]#Thisworks,butismoreverbosethanI'dlikenums.eachdo|i|putsiend#InJS,Icouldjustdosomethinglike:#nums.forEach(console.log)#InF#,itwouldbesomethinglike:#List.iternums(printf"%A")#InRuby,IwishIcoulddosomethinglike:nums.eachputs在Ruby中能不能做到类似的简洁?我可以只

  8. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

  9. Vscode+Cmake配置并运行opencv环境(Windows和Ubuntu大同小异) - 2

    之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m

  10. C51单片机——实现用独立按键控制LED亮灭(调用函数篇) - 2

    说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时

随机推荐