Рамка всплывающего окна видна при восстановлении из свернутого - PullRequest
0 голосов
/ 07 апреля 2020

У меня есть очень простая программа с Win32 и OpenGL (вам не нужно ничего знать об OpenGL, чтобы понять мою проблему), которая выводит aws окно с непрямой angular формой, используя SetlayeredWindowAttributes () функция. Моя проблема в том, что, когда я восстанавливаю его из свернутого состояния, то, что выглядит как кадр перекрывающегося окна, отображается в течение одной десятой секунды, а затем исчезает.

Я попытался расширить клиентскую область с 0 для всех поля, но это не сработало (может быть, это решение, но я сделал это неправильно) (это не входит в следующий код).

Примечание: моя программа должна создать два windows, это реализовано в OpenGL и ARB, но я только отображаю окно с именем "FinalWindow".

#include <stdlib.h>
#include <stdio.h>
#define UNICODE
#include <windows.h>
#define GLEW_STATIC
#include <glew.h>
#include <GL\wglext.h>

LRESULT CALLBACK WindowsProcedure(HWND hWnd, UINT uMsg, WPARAM wp, LPARAM lp);
unsigned int CreateShaderProgram(char* VertexSource, char* FragmentSource);

int main(void){
    WNDCLASSEX WindowsClass = {};
    WindowsClass.cbSize = sizeof(WNDCLASSEX);
    WindowsClass.style = CS_OWNDC;
    WindowsClass.lpfnWndProc = WindowsProcedure;
    WindowsClass.lpszClassName = L"WindowsClass";
    RegisterClassEx(&WindowsClass);

    HWND TempWindow = CreateWindowEx(WS_EX_APPWINDOW, L"WindowsClass",
        L"TempWindow", WS_POPUP, 0, 0, 10, 10, NULL, NULL, NULL, NULL);
    HDC TempWindowDeviceContext = GetDC(TempWindow);

    PIXELFORMATDESCRIPTOR pfd = {};
    pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);
    pfd.nVersion = 1;
    pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
    pfd.iPixelType = PFD_TYPE_RGBA;
    pfd.cColorBits = 32;
    pfd.cDepthBits = 24;
    pfd.cStencilBits = 8;
    pfd.iLayerType = PFD_MAIN_PLANE;

    int TempWindowPixelFormat = ChoosePixelFormat(TempWindowDeviceContext,
        &pfd);
    SetPixelFormat(TempWindowDeviceContext, TempWindowPixelFormat, &pfd);
    HGLRC TempWindowRenderingContext =
        wglCreateContext(TempWindowDeviceContext);
    wglMakeCurrent(TempWindowDeviceContext, TempWindowRenderingContext);

    PFNWGLCREATECONTEXTATTRIBSARBPROC wglCreateContextAttribsARB =
        (PFNWGLCREATECONTEXTATTRIBSARBPROC) (void*)
        wglGetProcAddress("wglCreateContextAttribsARB");

    PFNWGLCHOOSEPIXELFORMATARBPROC wglChoosePixelFormatARB =
        (PFNWGLCHOOSEPIXELFORMATARBPROC) (void*)
        wglGetProcAddress("wglChoosePixelFormatARB");

    wglMakeCurrent(TempWindowDeviceContext, NULL);
    wglDeleteContext(TempWindowRenderingContext);

    HWND FinalWindow = CreateWindowEx(WS_EX_APPWINDOW | WS_EX_LAYERED,
        L"WindowsClass", L"FinalWindow", WS_POPUP | WS_MINIMIZEBOX, 100, 100,
        256, 256, NULL, NULL, NULL, NULL);
    HDC FinalWindowDeviceContext = GetDC(FinalWindow);

    int FinalWindowPixelFormatAttributes[] = {
        WGL_DRAW_TO_WINDOW_ARB, GL_TRUE,
        WGL_SUPPORT_OPENGL_ARB, GL_TRUE,
        WGL_DOUBLE_BUFFER_ARB, GL_TRUE,
        WGL_PIXEL_TYPE_ARB, WGL_TYPE_RGBA_ARB,
        WGL_COLOR_BITS_ARB, 32,
        WGL_DEPTH_BITS_ARB, 24,
        WGL_STENCIL_BITS_ARB, 8,
        0
    };

    int FinalWindowContextAttributes[] = {
        WGL_CONTEXT_MAJOR_VERSION_ARB, 4,
        WGL_CONTEXT_MINOR_VERSION_ARB, 4,
        WGL_CONTEXT_PROFILE_MASK_ARB, WGL_CONTEXT_CORE_PROFILE_BIT_ARB,
        0
    };

    int FinalWindowPixelFormat; unsigned int PixelFormatCount;
    wglChoosePixelFormatARB(FinalWindowDeviceContext,
        FinalWindowPixelFormatAttributes, NULL, 1, &FinalWindowPixelFormat,
        &PixelFormatCount);
    SetPixelFormat(FinalWindowDeviceContext, FinalWindowPixelFormat, NULL);
    HGLRC FinalWindowRenderingContext =
        wglCreateContextAttribsARB(FinalWindowDeviceContext, NULL,
        FinalWindowContextAttributes);;
    wglMakeCurrent(FinalWindowDeviceContext, FinalWindowRenderingContext);

    SetLayeredWindowAttributes(FinalWindow, RGB(200, 0, 200), 255, LWA_COLORKEY);

    glewInit();

    char VertexShaderSource[] =
    "#version 440 core\n"
    "\n"
    "layout(location = 0) in vec4 position;\n"
    "\n"
    "void main(){\n"
    "   gl_Position = position;\n"
    "}";

    char FragmentShaderSource[] =
    "#version 440 core\n"
    "\n"
    "layout(location = 0) out vec4 colour;\n"
    "\n"
    "void main(){\n"
    "   colour = vec4(0.5, 0.5, 0.5, 1.0);\n"
    "}";

    float Verticies[] = {
         0.0f,  1.f, // top    : 0
         1.0f,  0.0f, // right  : 1
         0.0f, -1.f, // bottom : 2
        -1.f,  0.0f  // left   : 3
    };

    unsigned int Indices[] = {
        3, 0, 1, // top
        3, 2, 1  // bottom
    };

    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    unsigned int VertexArray;
    glGenVertexArrays(1, &VertexArray);
    glBindVertexArray(VertexArray);

    unsigned int VertexBuffer;
    glGenBuffers(1, &VertexBuffer);
    glBindBuffer(GL_ARRAY_BUFFER, VertexBuffer);
    glBufferData(GL_ARRAY_BUFFER, 8 * sizeof(float), Verticies, GL_STATIC_DRAW);

    unsigned int IndexBuffer;
    glGenBuffers(1, &IndexBuffer);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IndexBuffer);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, 6 * sizeof(unsigned int), Indices,
        GL_STATIC_DRAW);

    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 2, 0);

    unsigned int ShaderProgram = CreateShaderProgram(VertexShaderSource,
        FragmentShaderSource);
    glUseProgram(ShaderProgram);

    glViewport(0, 0, 256, 256);

    glClearColor(200.0f / 255, 0.0f, 200.0f / 255, 1.0f);

    ShowWindow(FinalWindow, 1);

    MSG msg;
    while(GetMessage(&msg, NULL, 0, 0)){
        DispatchMessage(&msg);
        glClear(GL_COLOR_BUFFER_BIT);
        glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, NULL);
        wglSwapLayerBuffers(FinalWindowDeviceContext, WGL_SWAP_MAIN_PLANE);
    }
}

unsigned int CreateShader(char* Source, unsigned int Type);

unsigned int CreateShaderProgram(char* VertexSource,
char* FragmentSource){
    unsigned int ShaderProgram = glCreateProgram(),
        VertexShader = CreateShader(VertexSource, GL_VERTEX_SHADER),
        FragmentShader = CreateShader(FragmentSource, GL_FRAGMENT_SHADER);
    glAttachShader(ShaderProgram, VertexShader);
    glAttachShader(ShaderProgram, FragmentShader);
    glLinkProgram(ShaderProgram);
    glValidateProgram(ShaderProgram);
    return ShaderProgram;
}

unsigned int CreateShader(char* Source, unsigned int Type){
    unsigned int Shader = glCreateShader(Type);
    glShaderSource(Shader, 1, (const char* const*)&Source, NULL);
    glCompileShader(Shader);
    return Shader;
}

LRESULT CALLBACK WindowsProcedure(HWND hWnd, UINT uMsg, WPARAM wp, LPARAM lp){
    switch(uMsg){
        case WM_NCHITTEST: return HTCAPTION;
        default: return DefWindowProc(hWnd, uMsg, wp, lp);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...