У меня есть очень простая программа с 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);
}
}