2012-05-06 18 views
2

我在学习如何使顶层的Win32窗口成为另一个窗口的子窗口。为什么在更改Win32窗口的父项时为圆角?

当我改变窗口的父母,我仍然得到丑陋的圆角,好像它是一个圆形的标题栏的顶层窗口。为什么?我该如何解决这个问题? (我不能让WM_UPDATEUISTATE帮忙,但我不知道如何正确使用任何它。)

Screenshot

#include <tchar.h> 
#include <windows.h> 
#include <commctrl.h> 
int _tmain() 
{ 
    WNDCLASS wndClass = { 
     0, &DefWindowProc, 0, 0, NULL, NULL, LoadCursor(NULL, IDC_ARROW), 
     GetSysColorBrush(COLOR_3DFACE), NULL, TEXT("MyWindowClass") 
    }; 
    ATOM atom = RegisterClass(&wndClass); 
    HWND hWnd = CreateWindow(MAKEINTATOM(atom), TEXT("Win"), 
     WS_OVERLAPPEDWINDOW | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, 
     CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, NULL, NULL); 
    HWND hWndChild = CreateWindowEx(WS_EX_CLIENTEDGE, 
     WC_EDIT, TEXT("Control"), WS_OVERLAPPEDWINDOW | WS_VISIBLE, 
     10, 10, 86, 24, NULL, NULL, NULL, NULL); 
    SetParent(hWndChild, hWnd);      // Change the parent 
    SetWindowLong(hWndChild, GWL_STYLE,    // Set child styles 
     GetWindowLong(hWndChild, GWL_STYLE) 
      & ~(WS_OVERLAPPED | WS_POPUP | WS_CAPTION | WS_SYSMENU | 
       WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX) 
      | WS_CHILDWINDOW); 
    SetWindowPos(hWndChild, NULL, 0, 0, 0, 0,  // Refresh 
     SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE 
      | SWP_NOOWNERZORDER | SWP_NOSIZE | SWP_FRAMECHANGED); 
    BOOL bRet; 
    MSG msg; 
    while ((bRet = GetMessage(&msg, hWnd, 0, 0)) != 0 && bRet != -1) 
    { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
    } 
} 
+0

子窗口应该是WS_CHILD而不是WS_POP。 –

+0

@HansPassant:对,这就是为什么我使用'SetWindowLong'在创建后更改样式。或者我错过了什么? – Mehrdad

+0

这是非常不规则的。更好的做法是从头开始创建窗口 - 最初将窗口放在顶层窗口父窗口中。然后,您可以将它移动到新的父级,而无需摆弄所有样式。 –

回答

0

看起来这是可能的原则,但难以得到的权利'实际上(根据雷蒙德的评论)。

我发现SetWindowRgn(hWnd, NULL, TRUE);做的伎俩,但我不认为这是正确的 - 可能还有其他的事情,我已经错过了。所以正确的解决方案可能只是在开始时正确构建对象。

相关问题