Skip to content

Commit

Permalink
Merge pull request #1 from peeveen/layerOption
Browse files Browse the repository at this point in the history
Layer option
  • Loading branch information
peeveen authored May 17, 2023
2 parents 26a075a + dbb8803 commit 5fbb0d0
Show file tree
Hide file tree
Showing 13 changed files with 158 additions and 66 deletions.
8 changes: 6 additions & 2 deletions CDGBitmaps.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#include "stdafx.h"
#include "CDGWindows.h"
#include "CDGPrefs.h"
#include "CDGPalette.h"
#include <objidl.h>
#include <stdlib.h>
#include <gdiplus.h>
Expand Down Expand Up @@ -239,10 +240,13 @@ bool CreateBackgroundDC() {
/// </summary>
void ClearForegroundBuffer() {
RECT r = { 0,0,CDG_MAXIMUM_BITMAP_WIDTH, CDG_MAXIMUM_BITMAP_HEIGHT };
::FillRect(g_hMaskedForegroundDC, &r, g_hTransparentBrush);
HBRUSH hBrush = g_bUseLayeredWindows ? g_hTransparentBrush : CreateBackgroundBrush();
::FillRect(g_hMaskedForegroundDC, &r, hBrush);
::GetClientRect(g_hForegroundWindow, &r);
::WaitForSingleObject(g_hForegroundBackBufferDCAccessMutex, INFINITE);
::FillRect(g_hForegroundBackBufferDC, &r, g_hTransparentBrush);
::FillRect(g_hForegroundBackBufferDC, &r, hBrush);
if (!g_bUseLayeredWindows)
::DeleteObject(hBrush);
::ReleaseMutex(g_hForegroundBackBufferDCAccessMutex);
}

Expand Down
13 changes: 8 additions & 5 deletions CDGMenu.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#include "stdafx.h"
#include <windowsx.h>
#include "CDGGlobals.h"
#include "CDGPrefs.h"
#include "CDGInstructionHandlers.h"
#include "CDGWindows.h"
#include "resource.h"
Expand All @@ -26,10 +27,11 @@ void SetMenuItemCheckmark(UINT nMenuItemID, bool set) {
/// Set the window style at topmost or not.
/// </summary>
void ToggleTopmost() {
DWORD currentExStyle = ::GetWindowLong(g_hLogoWindow, GWL_EXSTYLE);
HWND hWnd = g_bUseLayeredWindows ? g_hLogoWindow : g_hForegroundWindow;
DWORD currentExStyle = ::GetWindowLong(hWnd, GWL_EXSTYLE);
bool currentlyTopmost = !!(currentExStyle & WS_EX_TOPMOST);
::SetWindowLong(g_hLogoWindow, GWL_EXSTYLE, currentExStyle ^ WS_EX_TOPMOST);
::SetWindowPos(g_hLogoWindow, currentlyTopmost ? HWND_NOTOPMOST : HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
::SetWindowLong(hWnd, GWL_EXSTYLE, currentExStyle ^ WS_EX_TOPMOST);
::SetWindowPos(hWnd, currentlyTopmost ? HWND_NOTOPMOST : HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
SetMenuItemCheckmark(MENUITEM_TOPMOST_ID, !currentlyTopmost);
}

Expand Down Expand Up @@ -76,9 +78,10 @@ INT_PTR AboutDialogProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
/// </summary>
void ShowAboutDialog() {
// Remove topmost attributes, otherwise the user will never see the about dialog.
DWORD currentExStyle = ::GetWindowLong(g_hLogoWindow, GWL_EXSTYLE);
HWND hWnd = g_bUseLayeredWindows ? g_hLogoWindow : g_hForegroundWindow;
DWORD currentExStyle = ::GetWindowLong(hWnd, GWL_EXSTYLE);
g_bDialogSetsTopmost = !!(currentExStyle & WS_EX_TOPMOST);
::DialogBox(g_hInstance, MAKEINTRESOURCE(IDD_ABOUTDIALOG), g_hLogoWindow, (DLGPROC)AboutDialogProc);
::DialogBox(g_hInstance, MAKEINTRESOURCE(IDD_ABOUTDIALOG), hWnd, (DLGPROC)AboutDialogProc);
}

/// <summary>
Expand Down
4 changes: 4 additions & 0 deletions CDGPalette.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -62,4 +62,8 @@ void ResetPalette() {
emptyPalette[0].rgbGreen = (g_nDefaultBackgroundColor >> 8) & 0x00ff;
emptyPalette[0].rgbRed = (g_nDefaultBackgroundColor >> 16) & 0x00ff;
SetPalette(emptyPalette, 0, 16);
}

HBRUSH CreateBackgroundBrush() {
return ::CreateSolidBrush(RGB(g_palette[0].rgbRed, g_palette[0].rgbGreen, g_palette[0].rgbBlue));
}
8 changes: 7 additions & 1 deletion CDGPalette.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,10 @@ void SetPalette(RGBQUAD* pRGBQuads, int nStartIndex, int nCount);
/// <summary>
/// The current CDG palette.
/// </summary>
extern RGBQUAD g_palette[16];
extern RGBQUAD g_palette[16];

/// <summary>
/// Creates a brush of the background colour.
/// </summary>
/// <returns>Brush</returns>
extern HBRUSH CreateBackgroundBrush();
7 changes: 7 additions & 0 deletions CDGPrefs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
WCHAR g_szINIPath[MAX_PATH + 1] = { '\0' };
// How opaque should the window be?
int g_nBackgroundOpacity = 192;
// False to use only standard GDI.
bool g_bUseLayeredWindows = true;
// Draw an outline around the foreground graphics for increased visibility?
bool g_bDrawOutline = true;
// We periodically ask WinAmp how many milliseconds it has played of a song. This works fine
Expand Down Expand Up @@ -108,6 +110,10 @@ void SetMargin(WCHAR* pszPrefLine) {
SetInt(pszPrefLine, L"margin", &g_nMargin, 0, 50);
}

void SetUseLayeredWindows(WCHAR* pszPrefLine) {
SetBool(pszPrefLine, L"uselayeredwindows", &g_bUseLayeredWindows);
}

void SetOutline(WCHAR* pszPrefLine) {
SetBool(pszPrefLine, L"outline", &g_bDrawOutline);
}
Expand Down Expand Up @@ -146,6 +152,7 @@ bool ReadPrefs() {
SetBackgroundColor(szBuffer);
SetBackgroundDetectionMode(szBuffer);
SetSmoothingPasses(szBuffer);
SetUseLayeredWindows(szBuffer);
SetMargin(szBuffer);
SetOutline(szBuffer);
SetLogoPath(szBuffer);
Expand Down
7 changes: 6 additions & 1 deletion CDGPrefs.h
Original file line number Diff line number Diff line change
Expand Up @@ -62,4 +62,9 @@ extern bool g_bDoubleBuffered;
/// <summary>
/// Path to logo file (if specified).
/// </summary>
extern WCHAR g_szLogoPath[];
extern WCHAR g_szLogoPath[];

/// <summary>
/// If true, we will use layered windows and alpha blending, etc.
/// </summary>
extern bool g_bUseLayeredWindows;
43 changes: 34 additions & 9 deletions CDGRender.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#include "stdafx.h"
#include "CDGGlobals.h"
#include "CDGPrefs.h"
#include "CDGPalette.h"
#include "CDGWindows.h"
#include "CDGBitmaps.h"
#include "CDGProcessor.h"
Expand All @@ -14,6 +15,18 @@ using namespace Gdiplus;
int g_nCanvasXOffset = 0;
int g_nCanvasYOffset = 0;

/// <summary>
/// We perform some post-processing on the karaoke graphics to apply a thick
/// outline around the text. If the text is at the extremities of the canvas,
/// our outline will go OUTSIDE the canvas. This is fine, but then we attempt
/// to copy the rendered gfx (including the outlines) to the screen, and this
/// can copy parts of the "unseen" canvas areas where scroll graphics reside.
/// This can cause little bits of garbage graphics to be drawn.
/// This controls whether we will render outlines that are outside the canvas
/// area.
/// </summary>
const bool g_bRenderExtremeOutlines = false;

/// <summary>
/// Scale2X smoothing algorithm. You can find details about this online.
/// </summary>
Expand Down Expand Up @@ -93,8 +106,10 @@ void Perform2xSmoothing(BYTE* pSourceBitmapBits, BYTE* pDestinationBitmapBits, R
/// </summary>
void DrawBackground() {
RECT r;
::GetClientRect(g_hBackgroundWindow, &r);
::StretchBlt(g_hBackgroundWindowDC, 0, 0, r.right - r.left, r.bottom - r.top, g_hBackgroundDC, 0, 0, 1, 1, SRCCOPY);
HWND hWnd = g_bUseLayeredWindows ? g_hBackgroundWindow : g_hForegroundWindow;
HDC hDC = g_bUseLayeredWindows ? g_hBackgroundWindowDC : g_hForegroundWindowDC;
::GetClientRect(hWnd, &r);
::StretchBlt(hDC, 0, 0, r.right - r.left, r.bottom - r.top, g_hBackgroundDC, 0, 0, 1, 1, SRCCOPY);
}

/// <summary>
Expand All @@ -106,8 +121,9 @@ void PaintForegroundBackBuffer() {
int nCanvasSourceY = (CDG_CANVAS_Y + g_nCanvasYOffset) * nScaling;
int nCanvasWidth = CDG_CANVAS_WIDTH * nScaling;
int nCanvasHeight = CDG_CANVAS_HEIGHT * nScaling;
// Blit area needs to be a little larger to accomodate the extremities of any outlines.
if (g_bDrawOutline) {
// If rendering extreme outlines, blit area needs to be a little larger
// to accomodate the extremities of any outlines.
if (g_bDrawOutline && g_bRenderExtremeOutlines) {
int nScalingOutlinePosDiff = nScaling << 1;
int nScalingOutlineSizeDiff = nScalingOutlinePosDiff << 1;
nCanvasSourceX -= nScalingOutlinePosDiff;
Expand All @@ -121,7 +137,10 @@ void PaintForegroundBackBuffer() {
double scaleYMultiplier = g_nForegroundBackBufferHeight / (double)CDG_CANVAS_HEIGHT;
int nScaledXMargin = (int)(g_nMargin * scaleXMultiplier);
int nScaledYMargin = (int)(g_nMargin * scaleYMultiplier);
::FillRect(g_hForegroundBackBufferDC, &backBufferRect, g_hTransparentBrush);
HBRUSH hBrush = g_bUseLayeredWindows ? g_hTransparentBrush : CreateBackgroundBrush();
::FillRect(g_hForegroundBackBufferDC, &backBufferRect, hBrush);
if (!g_bUseLayeredWindows)
::DeleteObject(hBrush);
::InflateRect(&backBufferRect, -nScaledXMargin, -nScaledYMargin);
::WaitForSingleObject(g_hMaskedForegroundDCAccessMutex, INFINITE);
::StretchBlt(g_hForegroundBackBufferDC, backBufferRect.left, backBufferRect.top, backBufferRect.right - backBufferRect.left, backBufferRect.bottom - backBufferRect.top, g_hMaskedForegroundDC, nCanvasSourceX, nCanvasSourceY, nCanvasWidth, nCanvasHeight, SRCCOPY);
Expand Down Expand Up @@ -154,11 +173,13 @@ void RenderForegroundBackBuffer(RECT* pInvalidCDGRect) {
// Inflate the canvas rect by 1 to cover any outline. We might not be drawing
// an outline, but in the grand scheme of things, the time taken to blit
// an area a tiny bit larger will be inconsequential.
static RECT cdgCanvasRect = { CDG_CANVAS_X - 1, CDG_CANVAS_Y - 1, CDG_CANVAS_X + CDG_CANVAS_WIDTH + 1, CDG_CANVAS_Y + CDG_CANVAS_HEIGHT + 1 };
int nOffset = g_bRenderExtremeOutlines ? 1 : 0;
static RECT cdgCanvasRect = { CDG_CANVAS_X - nOffset, CDG_CANVAS_Y - nOffset, CDG_CANVAS_X + CDG_CANVAS_WIDTH + nOffset, CDG_CANVAS_Y + CDG_CANVAS_HEIGHT + nOffset };
RECT cdgRect;
// If not performing a scrolling (offset) operation, we can limit the graphical operation to the canvas.
// Otherwise, need to take the normally-invisible border graphics into account.
memcpy(&cdgRect, (g_nCanvasXOffset == 0 && g_nCanvasYOffset == 0 ? &cdgCanvasRect : &cdgAllRect), sizeof(RECT));
bool bNotScrolling = g_nCanvasXOffset == 0 && g_nCanvasYOffset == 0;
memcpy(&cdgRect, (bNotScrolling ? &cdgCanvasRect : &cdgAllRect), sizeof(RECT));
if (pInvalidCDGRect)
memcpy(&invalidRect, pInvalidCDGRect, sizeof(RECT));
else
Expand Down Expand Up @@ -186,7 +207,8 @@ void RenderForegroundBackBuffer(RECT* pInvalidCDGRect) {
}
if (g_nSmoothingPasses) {
::InflateRect(&invalidRect, nScaling, nScaling);
::IntersectRect(&invalidRect, &invalidRect, &cdgRect);
if (g_bUseLayeredWindows)
::IntersectRect(&invalidRect, &invalidRect, &cdgRect);
}
invalidCDGRectWidth = invalidRect.right - invalidRect.left;
invalidCDGRectHeight = invalidRect.bottom - invalidRect.top;
Expand All @@ -201,7 +223,10 @@ void RenderForegroundBackBuffer(RECT* pInvalidCDGRect) {
// Now blit the foreground bitmap to the masked foreground bitmap, using the border mask bitmap as a mask.
// Only bits from the foreground bitmap that "get through" the mask will make it to the masked foreground bitmap,
// leaving transparency everywhere else.
::MaskBlt(g_hMaskedForegroundDC, invalidRect.left, invalidRect.top, invalidCDGRectWidth, invalidCDGRectHeight, hSourceDC, invalidRect.left, invalidRect.top, g_hBorderMaskBitmap, invalidRect.left, invalidRect.top, MAKEROP4(SRCCOPY, PATCOPY));
if (g_bUseLayeredWindows)
::MaskBlt(g_hMaskedForegroundDC, invalidRect.left, invalidRect.top, invalidCDGRectWidth, invalidCDGRectHeight, hSourceDC, invalidRect.left, invalidRect.top, g_hBorderMaskBitmap, invalidRect.left, invalidRect.top, MAKEROP4(SRCCOPY, PATCOPY));
else
::BitBlt(g_hMaskedForegroundDC, invalidRect.left, invalidRect.top, invalidCDGRectWidth, invalidCDGRectHeight, hSourceDC, invalidRect.left, invalidRect.top, SRCCOPY);
::ReleaseMutex(g_hMaskedForegroundDCAccessMutex);
PaintForegroundBackBuffer();
}
Expand Down
83 changes: 52 additions & 31 deletions CDGWindows.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ void CDGRectToClientRect(RECT* pRect) {
/// The logo position changes when the window resizes.
/// </summary>
void UpdateLogoPosition() {
::SetWindowPos(g_hForegroundWindow, g_hLogoWindow, 0, 0,0,0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
::SetWindowPos(g_hForegroundWindow, g_hLogoWindow, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
static RECT foregroundClientRect,foregroundWindowRect;
::GetClientRect(g_hForegroundWindow, &foregroundClientRect);
::GetWindowRect(g_hForegroundWindow, &foregroundWindowRect);
Expand Down Expand Up @@ -99,7 +99,7 @@ void UpdateLogoPosition() {
::UpdateLayeredWindow(g_hLogoWindow, g_hScreenDC, &topLeft, &logoSize, g_hLogoDC, &logoSourcePoint, 0, &g_blendFn, ULW_ALPHA);
}

void ShowWindows(bool bSongPlaying) {
void ShowWindows(bool bSongPlaying, bool updateLogo = false) {
// If a song is playing, then show all windows EXCEPT the logo window.
// If a song is NOT playing, then:
// If there is a logo, show all windows.
Expand All @@ -113,8 +113,10 @@ void ShowWindows(bool bSongPlaying) {
exStyle &= ~WS_EX_NOACTIVATE;
::SetWindowLong(g_hForegroundWindow, GWL_EXSTYLE, exStyle);
// Now show the windows we want.
::ShowWindow(g_hLogoWindow, SW_HIDE);
::ShowWindow(g_hBackgroundWindow, SW_SHOW);
if (g_bUseLayeredWindows) {
::ShowWindow(g_hLogoWindow, SW_HIDE);
::ShowWindow(g_hBackgroundWindow, SW_SHOW);
}
::ShowWindow(g_hForegroundWindow, SW_SHOW);
}
else {
Expand All @@ -126,16 +128,22 @@ void ShowWindows(bool bSongPlaying) {
exStyle &= ~WS_EX_APPWINDOW;
exStyle |= WS_EX_NOACTIVATE;
::SetWindowLong(g_hForegroundWindow, GWL_EXSTYLE, exStyle);
::ShowWindow(g_hBackgroundWindow, SW_SHOW);
if (g_bUseLayeredWindows)
::ShowWindow(g_hBackgroundWindow, SW_SHOW);
::ShowWindow(g_hForegroundWindow, SW_SHOW);
::ShowWindow(g_hLogoWindow, SW_SHOW);
if (g_bUseLayeredWindows)
::ShowWindow(g_hLogoWindow, SW_SHOW);
}
else {
::ShowWindow(g_hLogoWindow, SW_HIDE);
if (g_bUseLayeredWindows)
::ShowWindow(g_hLogoWindow, SW_HIDE);
::ShowWindow(g_hForegroundWindow, SW_HIDE);
::ShowWindow(g_hBackgroundWindow, SW_HIDE);
if (g_bUseLayeredWindows)
::ShowWindow(g_hBackgroundWindow, SW_HIDE);
}
}
if(updateLogo && g_bUseLayeredWindows)
::UpdateLogoPosition();
}

bool IsFullScreen() {
Expand Down Expand Up @@ -195,10 +203,12 @@ LRESULT CALLBACK ForegroundWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARA
break;
// If a window changes moves, activates, deactivates, or changes z-order, the others have to follow suit!
case WM_WINDOWPOSCHANGED:
::SetWindowPos(g_hBackgroundWindow, hwnd, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
::SetWindowPos(g_hLogoWindow,NULL, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE|SWP_NOACTIVATE);
::SetWindowPos(hwnd, g_hLogoWindow, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
UpdateLogoPosition();
if (g_bUseLayeredWindows) {
::SetWindowPos(g_hBackgroundWindow, hwnd, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
::SetWindowPos(g_hLogoWindow, NULL, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
::SetWindowPos(hwnd, g_hLogoWindow, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
UpdateLogoPosition();
}
break;
// Right-mouse button click ... show the menu!
case WM_NCRBUTTONUP: {
Expand All @@ -209,22 +219,27 @@ LRESULT CALLBACK ForegroundWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARA
}
// If a window moves, the others have to move too!
case WM_MOVE: {
int x = (int)(short)LOWORD(lParam);
int y = (int)(short)HIWORD(lParam);
::SetWindowPos(g_hBackgroundWindow, hwnd, x, y, 0, 0, SWP_NOSIZE | SWP_NOACTIVATE);
UpdateLogoPosition();
if (g_bUseLayeredWindows) {
int x = (int)(short)LOWORD(lParam);
int y = (int)(short)HIWORD(lParam);
::SetWindowPos(g_hBackgroundWindow, hwnd, x, y, 0, 0, SWP_NOSIZE | SWP_NOACTIVATE);
UpdateLogoPosition();
}
break;
}
// If a window changes size, the others have to change too!
case WM_SIZE: {
int w = (int)(short)LOWORD(lParam);
int h = (int)(short)HIWORD(lParam);
::SetWindowPos(g_hBackgroundWindow, hwnd, 0, 0, w, h, SWP_NOMOVE | SWP_NOACTIVATE);
if (g_bUseLayeredWindows) {
int w = (int)(short)LOWORD(lParam);
int h = (int)(short)HIWORD(lParam);
::SetWindowPos(g_hBackgroundWindow, hwnd, 0, 0, w, h, SWP_NOMOVE | SWP_NOACTIVATE);
}
if (g_hForegroundBackBufferDC) {
ResizeForegroundBackBufferBitmap();
PaintForegroundBackBuffer();
}
UpdateLogoPosition();
if (g_bUseLayeredWindows)
UpdateLogoPosition();
break;
}
// Do not allow the user to manually close this window. It will close when Winamp closes,
Expand Down Expand Up @@ -334,7 +349,7 @@ bool CreateCDGWindow(HWND* phWnd, HDC* phDC, const WCHAR* pszClassName, DWORD st
int width = CDG_CANVAS_WIDTH + (g_nMargin << 1);
int height = CDG_CANVAS_HEIGHT + (g_nMargin << 1);
*phWnd = CreateWindowEx(
WS_EX_LAYERED | additionalExStyles,
(g_bUseLayeredWindows ? WS_EX_LAYERED : 0 ) | additionalExStyles,
pszClassName,
g_pszWindowCaption,
styles,
Expand Down Expand Up @@ -379,22 +394,26 @@ bool CreateLogoWindow() {

void UnregisterWindowClasses() {
::UnregisterClass(g_foregroundWindowClassName, g_hInstance);
::UnregisterClass(g_backgroundWindowClassName, g_hInstance);
::UnregisterClass(g_logoWindowClassName, g_hInstance);
if (g_bUseLayeredWindows) {
::UnregisterClass(g_backgroundWindowClassName, g_hInstance);
::UnregisterClass(g_logoWindowClassName, g_hInstance);
}
if (g_hIcon)
::DeleteObject(g_hIcon);
}

bool CreateWindows() {
if (RegisterBackgroundWindowClass() &&
if ((!g_bUseLayeredWindows || RegisterBackgroundWindowClass()) &&
RegisterForegroundWindowClass() &&
RegisterLogoWindowClass() &&
CreateLogoWindow() &&
CreateBackgroundWindow() &&
(!g_bUseLayeredWindows || RegisterLogoWindowClass()) &&
(!g_bUseLayeredWindows || CreateLogoWindow()) &&
(!g_bUseLayeredWindows || CreateBackgroundWindow()) &&
CreateForegroundWindow()) {
::SetStretchBltMode(g_hForegroundWindowDC, COLORONCOLOR);
::SetLayeredWindowAttributes(g_hForegroundWindow, DEFAULT_TRANSPARENT_COLORREF, 255, LWA_COLORKEY);
::SetLayeredWindowAttributes(g_hBackgroundWindow, 0, g_nBackgroundOpacity, LWA_ALPHA);
if (g_bUseLayeredWindows) {
::SetLayeredWindowAttributes(g_hForegroundWindow, DEFAULT_TRANSPARENT_COLORREF, 255, LWA_COLORKEY);
::SetLayeredWindowAttributes(g_hBackgroundWindow, 0, g_nBackgroundOpacity, LWA_ALPHA);
}
return true;
}
return false;
Expand All @@ -411,7 +430,9 @@ void CloseWindow(HWND hWnd, HDC hDC) {

void DestroyWindows() {
CloseWindow(g_hForegroundWindow, g_hForegroundWindowDC);
CloseWindow(g_hBackgroundWindow, g_hBackgroundWindowDC);
CloseWindow(g_hLogoWindow, g_hLogoWindowDC);
if (g_bUseLayeredWindows) {
CloseWindow(g_hBackgroundWindow, g_hBackgroundWindowDC);
CloseWindow(g_hLogoWindow, g_hLogoWindowDC);
}
UnregisterWindowClasses();
}
Loading

0 comments on commit 5fbb0d0

Please sign in to comment.