SetWindowRgn меняет тему окна на классическую

#c #c #windows #user-interface #winapi

Вопрос:

Когда я использую функцию SetWindowRgn в своем коде API Windows, созданный стиль Windows меняется с современного на классический.

Минимальный код для воспроизведения проблемы здесь:

 LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {  switch(msg)  {  case WM_CLOSE:  DestroyWindow(hwnd);  break;  case WM_DESTROY:  PostQuitMessage(0);  break;  default:  return DefWindowProc(hwnd, msg, wParam, lParam);  }  return 0; }  int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,  LPSTR lpCmdLine, int nCmdShow) {    WNDCLASSEX wc;  HWND hwnd;   wc.cbSize = sizeof(WNDCLASSEX);  wc.style = 0;  wc.lpfnWndProc = WndProc;  wc.cbClsExtra = 0;  wc.cbWndExtra = 0;  wc.hInstance = hInstance;  wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);  wc.hCursor = LoadCursor(NULL, IDC_ARROW);  wc.hbrBackground = (HBRUSH)(COLOR_WINDOW 1);  wc.lpszMenuName = NULL;  wc.lpszClassName = g_szClassName;  wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);   if(!RegisterClassEx(amp;wc))  {  MessageBox(NULL, "Window Registration Failed!", "Error!",  MB_ICONEXCLAMATION | MB_OK);  return 0;  }   hwnd = CreateWindowEx(  WS_EX_TOPMOST | WS_EX_CLIENTEDGE,  g_szClassName,  "Capture Screen",  WS_OVERLAPPEDWINDOW,   10, 100, 800, 600,  NULL, NULL, hInstance, NULL);   if(hwnd == NULL)  {  MessageBox(NULL, "Window Creation Failed!", "Error!",  MB_ICONEXCLAMATION | MB_OK);  return 0;  }    ShowWindow(hwnd, SW_NORMAL);  UpdateWindow(hwnd);   HRGN WindowRgn = CreateRectRgn(0,0,800,600);   SetWindowRgn(hwnd,WindowRgn,TRUE); // lt;===== comment, uncomment this line to observe difference    MSG Msg;  while(GetMessage(amp;Msg, NULL, 0, 0) gt; 0)  {  TranslateMessage(amp;Msg);  DispatchMessage(amp;Msg);  }  return Msg.wParam; }   

Комментируя и раскомментируя строку ниже, вы продемонстрируете проблему

 SetWindowRgn(hwnd,WindowRgn,TRUE); // lt;===== comment, uncomment this line to observe difference  

Современный (комментируя строку) :

введите описание изображения здесь

Классический (раскомментирующий строку) :

введите описание изображения здесь

Есть идеи, что именно в функции вызывает здесь проблему? И какие-нибудь исправления для этого?