C 为什么在更改Win32窗口时使用圆角';谁的父母?

C 为什么在更改Win32窗口时使用圆角';谁的父母?,c,windows,winapi,visual-c++,parent,C,Windows,Winapi,Visual C++,Parent,我正在尝试学习如何使顶级Win32窗口成为另一个窗口的子窗口 当我更改窗口的父窗口时,仍然会得到丑陋的圆角,就好像它是一个带有圆角标题栏的顶级窗口一样。为什么?我该如何解决这个问题?(我无法获得WM_UPDATEUISTATE的帮助,但我也不知道如何正确使用它。) #包括 #包括 #包括 int_tmain() { WNDCLASS WNDCLASS={ 0,&DefWindowProc,0,0,NULL,NULL,LoadCursor(NULL,IDC_箭头), GetSysColorBru

我正在尝试学习如何使顶级Win32窗口成为另一个窗口的子窗口

当我更改窗口的父窗口时,仍然会得到丑陋的圆角,就好像它是一个带有圆角标题栏的顶级窗口一样。为什么?我该如何解决这个问题?(我无法获得
WM_UPDATEUISTATE
的帮助,但我也不知道如何正确使用它。)

#包括
#包括
#包括
int_tmain()
{
WNDCLASS WNDCLASS={
0,&DefWindowProc,0,0,NULL,NULL,LoadCursor(NULL,IDC_箭头),
GetSysColorBrush(COLOR_3DFACE),NULL,文本(“MyWindowClass”)
};
ATOM=注册类(&wndClass);
HWND HWND=CreateWindow(MakeinTom(atom),文本(“Win”),
WS_重叠窗口| WS_可见,CW_使用默认值,CW_使用默认值,
CW_usefault,CW_usefault,NULL,NULL,NULL);
HWND hWndChild=CreateWindowEx(WS_EX_CLIENTEDGE,
WC|U编辑,文本(“控制”),WS|U重叠窗口| WS|U可见,
10,10,86,24,零,零,零,零);
SetParent(hWndChild,hWnd);//更改父项
SetWindowLong(hWndChild,GWL_样式,//设置子样式
GetWindowLong(hWndChild,GWL_样式)
&~(WS_重叠| WS_弹出| WS_标题| WS_系统菜单|
WS|U THICKFRAME | WS|U MINIMIZEBOX | WS|U MAXIMIZEBOX)
|WS_CHILDWINDOW);
SetWindowPos(hWndChild,NULL,0,0,0,//刷新
SWP|u NOMOVE | SWP|u NOZORDER | SWP|u NOACTIVATE
|SWP|u NOOWNERZORDER | SWP|u NOSIZE | SWP|u FRAMECHANGED);
布尔布雷特;
味精;
while((bRet=GetMessage(&msg,hWnd,0,0))!=0&&bRet!=-1)
{
翻译信息(&msg);
发送消息(&msg);
}
}

这在原则上似乎是可能的,但实际上很难做到“正确”(根据雷蒙德的评论)


我发现
SetWindowRgn(hWnd,NULL,TRUE)
可以做到这一点,但我不认为这是正确的——我可能还错过了其他一些东西。因此,正确的解决方案可能是在一开始就正确地构造对象。

这似乎在原则上是可能的,但实际上很难做到“正确”(根据雷蒙德的评论)


我发现
SetWindowRgn(hWnd,NULL,TRUE)
可以做到这一点,但我不认为这是正确的——我可能还错过了其他一些东西。因此正确的解决方案可能是在一开始就正确地构造对象。

子窗口应该是WS\u child而不是WS\u POP。@HansPassant:对,这就是为什么我在创建后使用
SetWindowLong
来更改样式。还是我错过了什么?这是非常不规则的。最好从一开始就将窗口作为子窗口创建——首先将其放在顶级窗口父窗口中。然后你可以把它移到一个新的父窗口,而不必摆弄所有的样式。@RaymondChen:是的,但问题是,当窗口一开始不是子窗口时,你怎么做?我真的不介意代码是否复杂,只要它有效。(甚至有可能吗?我认为
SetParent
的存在意味着它是…@RaymondChen:或者,让我提出一个不同的问题,如果你愿意的话:在创建窗口后不应该修改窗口的哪些属性?(换句话说,
CreateWindowEx
的哪些参数可以推迟到以后,哪些参数必须在那里提供才能正确操作?)根据您的回答,我假设
hwndpresent
是其中之一,并且(显然)类名是其中之一,但还有其他的吗?子窗口应该是WS_child而不是WS_POP。@HansPassant:对,这就是为什么我在创建后使用
SetWindowLong
来更改样式。还是我错过了什么?这是非常不规则的。最好从一开始就将窗口作为子窗口创建——首先将其放在顶级窗口父窗口中。然后你可以把它移到一个新的父窗口,而不必摆弄所有的样式。@RaymondChen:是的,但问题是,当窗口一开始不是子窗口时,你怎么做?我真的不介意代码是否复杂,只要它有效。(甚至有可能吗?我认为
SetParent
的存在意味着它是…@RaymondChen:或者,让我提出一个不同的问题,如果你愿意的话:在创建窗口后不应该修改窗口的哪些属性?(换句话说,
CreateWindowEx
的哪些参数可以推迟到以后,我必须提供哪些参数才能正确操作?)根据您的回答,我假设
hwndParent
是其中之一,并且(显然)类名是其中之一——但还有其他的吗?
#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);
    }
}