1

Im trying to create my own window drawn fully with openGL.

Everything is getting drawn so far.

The problem im having is, When im resizing the window everything disapears.

If i dont use DwmEnableBlurBehindWindow the window is drawn black, When resizing (i dont want this)

#include <windows.h> #include <windowsx.h> #include <GL/gl.h> #include <GL/glu.h> #include <dwmapi.h> #pragma comment (lib, "opengl32.lib") #pragma comment (lib, "glu32.lib") #pragma comment (lib, "dwmapi.lib") const TCHAR szAppName[] = L"TransparentGL"; const TCHAR wcWndName[] = L"TransparentGL"; HDC hDC; HGLRC m_hrc; int w = 240; int h = 240; BOOL initSC() { glEnable(GL_ALPHA_TEST); glEnable(GL_DEPTH_TEST); glEnable(GL_COLOR_MATERIAL); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glClearColor(0, 0, 0, 0); return 0; } void resizeSC(int width, int height) { glViewport(0, 0, width, height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } BOOL renderSC() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix(); POINT start = { 2,2 }; POINT finish = { w - 2, h - 2 }; glColor3ub(0, 255, 0); glBegin(GL_QUADS); glVertex3i(-1, -1, -1); glVertex3i(1, -1, -1); glVertex3i(1, 1, -1); glVertex3i(-1, 1, -1); glEnd(); gluOrtho2D(0, w, 0, h); glColor3ub(255, 255, 255); glBegin(GL_QUADS); glVertex2f(start.x, start.y); glVertex2f(finish.x, start.y); glVertex2f(finish.x, finish.y); glVertex2f(start.x, finish.y); glEnd(); glPopMatrix(); glFlush(); return 0; } BOOL CreateHGLRC(HWND hWnd) { PIXELFORMATDESCRIPTOR pfd = { sizeof(PIXELFORMATDESCRIPTOR), 1, // Version Number PFD_DRAW_TO_WINDOW | // Format Must Support Window PFD_SUPPORT_OPENGL | // Format Must Support OpenGL PFD_SUPPORT_COMPOSITION | // Format Must Support Composition PFD_DOUBLEBUFFER, // Must Support Double Buffering PFD_TYPE_RGBA, // Request An RGBA Format 32, // Select Our Color Depth 0, 0, 0, 0, 0, 0, // Color Bits Ignored 8, // An Alpha Buffer 0, // Shift Bit Ignored 0, // No Accumulation Buffer 0, 0, 0, 0, // Accumulation Bits Ignored 24, // 16Bit Z-Buffer (Depth Buffer) 8, // Some Stencil Buffer 0, // No Auxiliary Buffer PFD_MAIN_PLANE, // Main Drawing Layer 0, // Reserved 0, 0, 0 // Layer Masks Ignored }; HDC hdc = GetDC(hWnd); int PixelFormat = ChoosePixelFormat(hdc, &pfd); if (PixelFormat == 0) { return FALSE; } BOOL bResult = SetPixelFormat(hdc, PixelFormat, &pfd); if (bResult == FALSE) { return FALSE; } m_hrc = wglCreateContext(hdc); if (!m_hrc) { return FALSE; } ReleaseDC(hWnd, hdc); return TRUE; } LRESULT CALLBACK WindowFunc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_CREATE: { DWM_BLURBEHIND bb = { 0 }; HRGN hRgn = CreateRectRgn(0, 0, -1, -1); bb.dwFlags = DWM_BB_ENABLE | DWM_BB_BLURREGION; bb.hRgnBlur = hRgn; bb.fEnable = TRUE; DwmEnableBlurBehindWindow(hWnd, &bb); CreateHGLRC(hWnd); break; } case WM_DESTROY: if (m_hrc) { wglMakeCurrent(NULL, NULL); wglDeleteContext(m_hrc); } PostQuitMessage(0); break; case WM_SIZE: { w = LOWORD(lParam); h = HIWORD(lParam); HDC hdc = GetDC(hWnd); wglMakeCurrent(hdc, m_hrc); resizeSC(w, h); ReleaseDC(hWnd, hdc); break; } case WM_PAINT: { PAINTSTRUCT ps; HDC hdc = BeginPaint(hWnd, &ps); { wglMakeCurrent(hdc, m_hrc); renderSC(); SwapBuffers(hdc); } EndPaint(hWnd, &ps); break; } case WM_NCCALCSIZE: return 0; case WM_NCHITTEST: { LRESULT lResult = DefWindowProc(hWnd, msg, wParam, lParam); if (lResult == HTCLIENT) { POINT pt = { LOWORD(lParam), HIWORD(lParam) }; ScreenToClient(hWnd, &pt); if (GetActiveWindow() == hWnd) { if (pt.y < 31) return HTCAPTION; } if (pt.y > (h - 10)) { if (pt.x > (w - 10)) { return HTBOTTOMRIGHT; } } } return lResult; } } return DefWindowProc(hWnd, msg, wParam, lParam); } int WINAPI WinMain(HINSTANCE hThisInst, HINSTANCE hPrevInst, LPSTR str, int nWinMode) { WNDCLASSEX wc; memset(&wc, 0, sizeof(wc)); wc.cbSize = sizeof(WNDCLASSEX); wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION); wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = (WNDPROC)WindowFunc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hThisInst; wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)CreateSolidBrush(0x00000000); wc.lpszClassName = szAppName; if (!RegisterClassEx(&wc)) { MessageBox(NULL, L"RegisterClassEx - failed", L"Error", MB_OK | MB_ICONERROR); return FALSE; } HWND hWnd = CreateWindowEx(WS_EX_APPWINDOW, szAppName, wcWndName, WS_VISIBLE, 200, 150, w, h, NULL, NULL, hThisInst, NULL); if (!hWnd) { MessageBox(NULL, L"CreateWindowEx - failed", L"Error", MB_OK | MB_ICONERROR); return FALSE; } MSG msg; while (GetMessageW(&msg, NULL, 0, 0) > 0) { TranslateMessage(&msg); DispatchMessage(&msg); } return (FALSE); } 
4
  • If when you resize the window everything disappears than maybe you should have a function that runs the drawing again every time the windows is resized? Commented Apr 28, 2017 at 1:32
  • @FelipeLopez i added SwapBuffers(hdc); to WM_SIZE it is always drawn but now iy flickers like crazy Commented Apr 28, 2017 at 1:48
  • The flicker might be because it is trying to draw even tho the window has not been resized? it should only draw on resize Commented Apr 28, 2017 at 2:30
  • C++ and C are very different languages. Use a tag for one of them, but never for both. Commented Apr 30, 2017 at 14:25

3 Answers 3

1

add CS_OWNDC , hbrBackground to NULL and overwrite WM_ERASEBKGND.

Sign up to request clarification or add additional context in comments.

Comments

0

The problem im having is, When im resizing the window everything disapears.

Redraw on WM_SIZE and disable background clear (without disabling background clear things will flicker). You do this by setting a NULL background brush in the WNDCLASS and return nonzero in response to the WM_ERASEBKGD message.

1 Comment

He already has CS_HREDRAW | CS_WREDRAW in window class style which does full repaint on resize
0

Keep the window DC once and for all through all your application lifecycle. If you don't have CS_OWNDC or other DC preserving flag in class style every time you obtain DC using either GetDC or BeginPaint you'll get literally new DC which is no longer associated with the GL context.

So, this is what you should have:

// app init HWND mywnd = CreateMyWindow(); HDC mywnddc = GetDC(mywnd); // create context for mywnddc and make it current on mywnddc! // paint BeginPaint(wnd, &ps); EndPaint(&ps); SwapBuffers(mywnddc); // not the DC you get by BeginPaint! // app finish ReleaseDC(mywnd, mywnddc); 

If you don't use rendering on multiple windows there's no point of calling wglMakeCurrent every time you want to draw, call it only once.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.