2

トップレベルのWin32ウィンドウを別のウィンドウの子にする方法を学ぼうとしています。

ウィンドウの親を変更しても、タイトルバーが丸いトップレベルのウィンドウであるかのように、角が丸くなります。なんで?そして、どうすればこれを修正できますか?(私は助けることができませんでしWM_UPDATEUISTATEたが、それを正しく使用する方法もわかりません。)

スクリーンショット

#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);
    }
}
4

1 に答える 1

0

これは原則的には可能であるように見えますが、実際には「正しく」することは困難です(レイモンドのコメントによると)。

私はそれがうまくいくことを発見しましたSetWindowRgn(hWnd, NULL, TRUE);、しかし私はそれが正しいとは思いません-私が逃した他のことがあるかもしれません。したがって、正しい解決策は、おそらく最初にオブジェクトを正しく構築することです。

于 2012-05-06T19:59:52.633 に答える