Как применить CS_DROPSHADOW к подклассу CDialog

У меня есть класс С++, MyDialog, производный от CDialog, где я удалил фрейм Windows и тем самым создал тень Windows.

Я хотел бы снова добавить тень, не добавляя рамку. Я обнаружил, что есть стиль класса CS_DROPSHADOW, который можно применить. Но я не могу найти, как его применить.

Я нашел метод ModifyStyle, но он изменяет только стили WS_..., а не стили CS_....

Как применить стиль класса CS_DROPSHADOW?


person JOG    schedule 07.08.2012    source источник


Ответы (2)


Мой коллега помог мне зарегистрировать класс с таким стилем класса:

    WNDCLASS wndClass;
    GetClassInfo(NULL, WC_DIALOG, &wndClass);
    wndClass.style |= CS_DROPSHADOW;
    wndClass.lpszClassName = TEXT("MyDialog");
    RegisterClass(&wndClass); 

где WC_DIALOG — это класс для обычного CDialog.

Затем этот класс используется в файле ресурсов, где определен мой диалог:

IDD_MYDIALOGEX 54, 22, 264, 95
STYLE DS_SETFONT | DS_CENTER | WS_POPUP
CLASS "MyDialog"
FONT 8, "Microsoft Sans Serif", 0, 0, 0x0
BEGIN
    // Contents ...
END

Это добавило тень, и это хорошо. Но это не та аэротень, которую я искал. введите здесь описание изображения

Дополнительные ответы приветствуются!

person JOG    schedule 07.08.2012

Возможно, вы сможете сохранить стиль фрейма, но ответьте на WM_NCCALCSIZE, чтобы клиент покрыл все окно, фактически сделав границу нулевой ширины.

person Mark Ransom    schedule 07.08.2012
comment
Я пытался манипулировать NCCALCSIZE_PARAMS в методе OnNcCalcSize. Но если я раздуваю прямоугольник (lpncsp->rgrc), клиент либо просто становится меньше при уменьшении, либо просто получает белую рамку при увеличении. Тень без изменений. Как мне это сделать? - person JOG; 08.08.2012
comment
@JOG, извини, это единственная идея, которая у меня есть на данный момент. Я никогда не пытался сделать это, но я знаю, что пытаться достичь чего-то, что Microsoft никогда не задумывала, всегда сложно. Жаль, что не получилось. - person Mark Ransom; 08.08.2012