2013-02-11 2 views
1

Я создаю дочернее окно с CS_DROPSHADOW, но тень не отображается.
Я попытался позвонить SystemParametersInfo(SPI_SETDROPSHADOW, 0, (PVOID) TRUE, 0);, но это также не поможет.
Может кто-нибудь объяснить мне, что случилось?Стиль CS_DROPSHADOW не работает

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; 
+3

Вы просто не можете получить тени для дочерних окон, не утруждайте себя попытками. –

+0

Можно создать окно, которое не является дочерним окном, и его местоположение будет определено относительно другого окна? (как дочернее окно, определяемое местоположением в отношении родителя). – user1544067

ответ

3

Теперь я вижу: 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. "

+3

Использование 'WNDCLASS' или' WNDCLASSEX' требует использования 'RegisterClass()' или 'RegisterClassEx()' respectivelly. Он не имеет никакого значения для использования 'CreateWindow()' или 'CreateWindowEx()', эти два отличаются только возможностью указать расширенный стиль. – mity

 Смежные вопросы

  • Нет связанных вопросов^_^