【问题标题】:CS_DROPSHADOW window style do not workCS_DROPSHADOW 窗口样式不起作用
【发布时间】:2013-02-11 13:03:52
【问题描述】:

我创建了一个 CS_DROPSHADOW 样式的子窗口,但没有显示阴影。
我试着打电话给SystemParametersInfo(SPI_SETDROPSHADOW, 0, (PVOID) TRUE, 0);,但也没有用。
谁能给我解释一下怎么回事?

    WNDCLASSEX wcex;

    HBRUSH bgBrush = CreateSolidBrush(RGB(171,181,201));

    wcex.cbSize = sizeof(WNDCLASSEX);
    wcex.style          = CS_DBLCLKS;
    wcex.lpfnWndProc    = KolmusProc;
    wcex.cbClsExtra     = 0;
    wcex.cbWndExtra     = 0;
    wcex.hInstance      = hInstance;
    wcex.hIcon          = LoadIconW(hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
    wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground  = bgBrush;
    wcex.lpszMenuName   = NULL;
    wcex.lpszClassName  = L"Kolmus";
    wcex.hIconSm        = LoadIconW(hInstance, MAKEINTRESOURCE(IDI_APPLICATION));

    RegisterClassEx(&wcex);

    wcex.style          = CS_DROPSHADOW;
    wcex.lpfnWndProc    = PageProc;
    wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszClassName  = L"Page";

    RegisterClassEx(&wcex);

    HWND hWnd = CreateWindow(L"Kolmus", L"Kolmus", WS_OVERLAPPEDWINDOW | WS_VISIBLE,
        CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); 

    HWND PageWnd = CreateWindow(L"Page", L"", WS_CHILD | WS_VISIBLE, 30, 30, 200, 200, hWnd, NULL, hInstance, NULL);

    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg); 
        DispatchMessage(&msg);
    }

    return (int)msg.wParam;

【问题讨论】:

  • 您根本无法在子窗口上获得阴影,不要费心尝试。
  • 是否可以创建一个不是子窗口的窗口,并且它的位置将相对于另一个窗口来确定? (作为子窗口,其位置相对于父窗口确定)。

标签: winapi window-style


【解决方案1】:

现在我看到了:I creating a child window ...

MSDN:http://msdn.microsoft.com/en-us/library/windows/desktop/ms632600(v=vs.85).aspx

WS_CHILD 阻止 CS_DROPSHADOW 如果您希望在您的窗口中创建一个临时弹出控件并希望使用 CS_DROPSHADOW 来加强弹出的短暂性,您不能将它与 WS_CHILD 一起使用——它只会忽略 CS_DROPSHADOW。您需要将控件设为 WS_POPUP,然后在打开时将其放置在您想要的位置。

尽管如此: 使用 HWND PageWnd = CreateWindowEx 而不是 HWND CreateWindow 因为 WNDCLASSEX wcex;

它很简单:WNDCLASS 与 CreateWindow 一起使用,WNDCLASSEX 与 CreateWindowEx 一起使用。

来自 MSDN: “CreateWindowEx 函数创建一个重叠的、弹出的或具有扩展窗口样式的子窗口;否则,此函数与 CreateWindow 函数相同。”

【讨论】:

  • 使用WNDCLASSWNDCLASSEX需要分别使用RegisterClass()RegisterClassEx()。它对使用CreateWindow()CreateWindowEx() 没有任何意义,这两者仅在指定扩展样式的可能性上有所不同。
猜你喜欢
  • 1970-01-01
  • 2011-10-17
  • 2017-11-22
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 2013-12-15
  • 2012-08-22
  • 1970-01-01
相关资源
最近更新 更多