OpenGL(Windows)没有绘制到屏幕

时间:2015-04-26 21:44:16

标签: windows winapi opengl

我正在尝试开始尝试OpenGL和Windows GUI的东西。我在我的开发箱上运行Windows 7并运行Visual Studio 2013.当我运行下面的代码时,我没有收到任何错误,所有的窗口信息似乎都是正确的,但是从OpenGL中没有任何内容被绘制到屏幕上。

对于第一个程序,我想在记事本上放置一个叠加层,然后在屏幕的某处画一条线/加号。

首先我创建一个窗口:

myWindow = CreateWindowEx(
    WS_EX_TRANSPARENT | WS_EX_TOPMOST | WS_EX_LAYERED,
    WINDOW_NAME,
    WINDOW_NAME,
    WS_POPUP | WS_VISIBLE | WS_MAXIMIZE,
    g_NotepadCoords.left,
    g_NotepadCoords.top,
    g_width,
    g_height,
    NULL, NULL, g_me, NULL);

使用FindWindowA和GetClientRect计算窗口的全局和坐标。这两个函数调用都成功并返回合理的值。在CreateWindowEx之后,我使用以下函数调用来设置属性并检查支持等:

SetLayeredWindowAttributes(myWindow, RGB(0, 0, 0), 255, LWA_ALPHA | LWA_COLORKEY);
if (S_OK != DwmIsCompositionEnabled(&bIsEnabled)){...}

现在HandleWindowMessage启用了WM_CREATE,WM_CLOSE,WM_DESTROY和WM_PAINT。在WM_CREATE中调用SetupOpenGL,并在WM_PAINT中进行绘图。

WM_CREATE和WM_PAINT:

case WM_CREATE:
{
    printf("WM_CREATE\n");
    g_Hdc = GetDC(hWnd);
    SetupGL();
    return 0;
}
break;
case WM_PAINT:
{
    GLenum err;
    const GLubyte *errString;
    RGB colorToDraw = { 0 };
    drawPlus(g_.middleX, g_.middleY, 12, 12, 4, &colorToDraw);
    err = glGetError();
    errString = gluErrorString(err);
    printf("ERROR DRAWING? %s\n", errString);
}
break;

据我所知,我正确设置了OpenGL;没有打印错误:

void SetupOpenGL()
{
   __try{
    PIXELFORMATDESCRIPTOR pfd = {
        sizeof(PIXELFORMATDESCRIPTOR),
        1,                               
        PFD_DRAW_TO_WINDOW |              // Format Must Support Window, OPENGL, Composition
        PFD_SUPPORT_OPENGL |             
        PFD_SUPPORT_COMPOSITION |         
        PFD_DOUBLEBUFFER,                 
        PFD_TYPE_RGBA,                    // RGBA
        32,                               
        0, 0, 0, 0, 0, 0,                 
        8,                               // alpha                
        0, 0, 0, 0, 0, 0, 0,                               
        8,                                // stencil Buffer
        0,                                
        PFD_MAIN_PLANE,                   // Main Drawing Layer
        0, 0, 0, 0                          
    };

    PixelFormat = ChoosePixelFormat(g_Hdc, &pfd);
    if (0 == PixelFormat)
    {
        printf("ChoosePixelFormat failed %d\n", GetLastError());
        __leave;
    }
    if (!SetPixelFormat(g_Hdc, PixelFormat, &pfd))
    {
        printf("SetPixelFormat failed %d\n", GetLastError());
        __leave;
    }
    if (!DescribePixelFormat(g_Hdc, PixelFormat, sizeof(PIXELFORMATDESCRIPTOR), &pfd))
    {
        printf("DescribePixelFormat failed %d\n", GetLastError());
        __leave;
    }
    g_MainHGLRC = wglCreateContext(g_Hdc);
    if (!g_MainHGLRC)
    {
        printf("wglCreateContext failed %d\n", GetLastError());
        __leave;
    }
    if (!wglMakeCurrent(g_Hdc, g_MainHGLRC))
    {
        printf("wglMakeCurrent failed %d\n", GetLastError());
        __leave;
    }
    glMatrixMode(GL_PROJECTION);
    glClearColor(0.f, 0.f, 0.f, 0.f);   
    }
   __finally{}
}

然后drawPlus非常简单:

void drawPlus(float x, float y, float width, float height, float lineWidth, RGB* RGB)
{
    printf("drawPlus(%f,%f,%f,%f,%f,[%d,%d,%d])", x, y, width, height, lineWidth, RGB->red, RGB->green, RGB->blue);

    glLineWidth(lineWidth);
    glBegin(GL_LINES);
    glColor4f(RGB->red, RGB->green, RGB->blue, 1);
    glVertex2f(x, y + height/2);
    glVertex2f(x, y - height/2);
    glVertex2f(x + width/2, y);
    glVertex2f(x - width/2, y);
    glEnd();
}

当我运行它时,我没有收到任何错误,我可以看到可执行文件创建另一个窗口,我已经确认drawPlus被正确调用并具有良好的参数。然而,实际上屏幕上没有任何东西,所以我不确定我错过了什么。我只是快速检查坐标和我得到的记事本窗口元素:

顶部:86 底部:916 左:170 右:609

然后在哪里画出加号

x = 219 y = 412

这两者看起来都合理,所以不是我的窗户不匹配等等。

0 个答案:

没有答案