À©µµ¿ì ºñ½ºÅ¸ ÀÌÀü¿¡´Â WM_NCPAINT ¸Þ½ÃÁö¿¡¼ ºñÀÛ¾÷ ¿µ¿ªÀ» ¸¶À½´ë·Î ±×¸± ¼ö ÀÖ¾ú´Ù. ±×·¯³ª ºñ½ºÅ¸ ÀÌÈÄ¿¡´Â DWM(Desktop Window Manager)À» µµÀÔÇÏ¿© ȸ鿡 ±×¸®´Â ¹æ¹ýÀÌ ¹Ù²î¾ú´Ù. DC¿¡ Á÷Á¢ ±×¸®´Â °ÍÀº Çã¶ôµÇÁö ¾ÊÀ¸¸ç ¸Þ¸ð¸® ³»ºÎ¿¡¼ À̹ÌÁö¸¦ ±×¸° ÈÄ È¸éÀ» Á¶ÇÕ(Composition)ÇÏ¿© ȸéÀ¸·Î ³ª°£´Ù. ÀÌ·± Á¶ÇÕ¿¡ ÀÇÇØ °æ°è¼± ¾Æ·¡¿¡ ÀÔüÀûÀÎ ±×¸²ÀÚ°¡ ±ò¸®´Â È¿°ú¸¦ ³»¸ç 3Â÷¿ø â Àüȯ ¾Ö´Ï¸ÞÀÌ¼Ç µîµµ °¡´ÉÇØÁ³´Ù.
À©µµ¿ìÀÇ ¸ð¾çÀ» º¯°æÇÏ·Á¸é ´ÙÀ½ ÇÔ¼ö·Î ·»´õ¸µ ¼Ó¼ºÀ» Á¶Á¤ÇÑ´Ù. ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÏ·Á¸é dwmapi.h¸¦ Æ÷ÇÔÇϰí Dwmapi.lib¸¦ ¿¬°áÇØ¾ß ÇÑ´Ù.
HRESULT DwmSetWindowAttribute(
HWND hwnd,
DWORD dwAttribute,
[in] LPCVOID pvAttribute,
DWORD cbAttribute
);
´ë»ó À©µµ¿ì, º¯°æÇÒ ¼Ó¼º, ¼Ó¼ºÀÇ °ª, ¼Ó¼º°ªÀÇ Å©±â¸¦ Àμö·Î Àü´ÞÇÑ´Ù. ¼Ó¼ºÀ» ¼³Á¤¸¸ ÇÏ´Â °ÍÀÌ ¾Æ´Ï°í Á¶»çµµ Çϱ⠶§¹®¿¡ Æ÷ÀÎÅÍ·Î °ªÀ» Àü´ÞÇÏ¸ç ¾ÈÀü»óÀÇ ÀÌÀ¯·Î Å©±âµµ ¹àÇô¾ß ÇÑ´Ù. ¸®ÅϰªÀº HRESULT ŸÀÔÀ̸ç À©µµ¿ì ¹öÀüÀÌ ³·°Å³ª Á¶ÇÕ ±â´ÉÀ» ²¨ ³õ¾ÒÀ¸¸ç ½ÇÆÐ¸¦ ¸®ÅÏÇÏ¸ç ±×·¸Áö ¾ÊÀ¸¸é S_OK¸¦ ¸®ÅÏÇÑ´Ù.
¼Ó¼º°ªÀÇ Á¾·ù´Â ·¹ÆÛ·±½º¸¦ Âü°íÇÑ´Ù. DWMWA_USE_IMMERSIVE_DARK_MODE ¸ðµå´Â ¾îµÎ¿î Å׸¶¸¦ »ç¿ëÇϸç ÇÁ·¹ÀÓÀ» £°Ô ±×¸°´Ù. º¸ÅëÀº °ËÁ¤ÀÌÁö¸¸ ¿î¿µÃ¼Á¦ ¹öÀü¿¡ µû¶ó ´Þ¶óÁú ¼ö ÀÖ´Ù. ´ÙÀ½ ¿¹Á¦´Â À©µµ¿ìÀÇ ³», ¿ÜºÎ »ö»óÀ» °ËÁ¤À¸·Î º¯°æÇÑ´Ù.
#include <windows.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
HINSTANCE g_hInst;
HWND hWndMain;
LPCTSTR lpszClass = TEXT("DarkMode");
int APIENTRY WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance
, _In_ LPSTR lpszCmdParam, _In_ int nCmdShow)
{
HWND hWnd;
MSG Message;
WNDCLASS WndClass;
g_hInst = hInstance;
HBRUSH hBack = CreateSolidBrush(RGB(0, 0, 0));
WndClass.cbClsExtra = 0;
WndClass.cbWndExtra = 0;
WndClass.hbrBackground = hBack;
WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
WndClass.hInstance = hInstance;
WndClass.lpfnWndProc = WndProc;
WndClass.lpszClassName = lpszClass;
WndClass.lpszMenuName = NULL;
WndClass.style = CS_HREDRAW | CS_VREDRAW;
RegisterClass(&WndClass);
hWnd = CreateWindow(lpszClass, lpszClass, WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX ,
CW_USEDEFAULT, CW_USEDEFAULT, 450, 600,
NULL, (HMENU)NULL, hInstance, NULL);
ShowWindow(hWnd, nCmdShow);
while (GetMessage(&Message, NULL, 0, 0)) {
TranslateMessage(&Message);
DispatchMessage(&Message);
}
DeleteObject(hBack);
return (int)Message.wParam;
}
#include <dwmapi.h>
#pragma comment(lib, "Dwmapi.lib")
BOOL USE_DARK_MODE = true;
HRESULT ret;
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
UINT nHit;
switch (iMessage) {
case WM_CREATE:
hWndMain = hWnd;
ret = DwmSetWindowAttribute(
hWndMain, DWMWINDOWATTRIBUTE::DWMWA_USE_IMMERSIVE_DARK_MODE,
&USE_DARK_MODE, sizeof(USE_DARK_MODE));
return 0;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
EndPaint(hWnd, &ps);
return 0;
case WM_NCHITTEST:
nHit = DefWindowProc(hWnd, iMessage, wParam, lParam);
if (nHit == HTCLIENT)
nHit = HTCAPTION;
return nHit;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return(DefWindowProc(hWnd, iMessage, wParam, lParam));
}
DWMWA_USE_IMMERSIVE_DARK_MODE ¼Ó¼ºÀº À©µµ¿ì11ºÎÅÍ Áö¿øÇÏ´Â °ÍÀ¸·Î µÇ¾î ÀÖÁö¸¸ À©µµ¿ì10¿¡¼µµ ¹®¼È¸¸ µÇ¾î ÀÖÁö ¾ÊÀ» »Ó Áö¿øÀº Çß¾ú´Ù°í ÇÑ´Ù. ¸¸¾à SDK¿¡ ÀÌ ¿°ÅÇüÀÌ Á¤ÀǵǾî ÀÖÁö ¾Ê´Ù¸é »ó¼ö°ª 20À» ¹Ù·Î »ç¿ëÇÏ¸é µÈ´Ù. ½ÇÇà °á°úÀÌ´Ù.

ÀÌ ¿Ü¿¡ À©µµ¿ì11¿¡¼´Â °æ°è¼±ÀÇ »ö»ó, ĸ¼ÇÀÇ »ö»ó µîÀ» ¹ø°æÇÒ ¼ö ÀÖ´Ù. Win32 API´Â °ÅÀÇ ¹Ù²îÁö ¾ÊÁö¸¸ ¿î¿µÃ¼Á¦ ¹öÀüÀÌ ¹Ù²ð ¶§ ¼ÒÆø Ãß°¡µÇ°Å³ª ¹Ù²î´Â °æ¿ì°¡ °¡²û ÀÖ´Ù. º¯°æµÈ API¸¦ ±×¶§ ±×¶§ ã¾Æ Àû¿ëÇÏ¸é µÈ´Ù. 403 Forbidden403 Forbidden |
|