Я пытаюсь сделать так, чтобы приложение, большая часть его разработки выполнялась в Visual C ++ 6.0, соответствовало тематике Windows, или, если быть точным, его аспект визуальных стилей.Рассматриваемое приложение является приложением MFC с набором символов MBCS.Прежде всего, для того, чтобы начать игру, потребовался трюк InitCommonControlsEx(...);
в сочетании с соответствующими манифестами для Common Controls 6.0.Пока ничего особенного.
После всего этого у меня есть тонны окон, на которых видны некоторые глюки рисования - белые прямоугольники на фоне, где раньше был серый, как в остальной части окна, но они не мешают.
Самый большой источник проблем - потомок CDialog
, который реализует (архаичный) диалог подсказки «знаете ли вы ...».Он отказывается рисовать что-либо кроме кнопок, флажков и декоративной рамки в тот момент, когда манифест находится на месте.Однако, если я возьму манифест OUT, все будет нормально.
Сравнение изображений сразу после вызова диалога
Я уже прошел через код OnPaint
(которыйрисует значок и текст «Знаете ли вы», и все функции возвращают разумные и успешные значения. Я также попытался удалить целые биты, выбранные пользователем (закомментировал отображения для сообщений WM_PAINT
и WM_CTLCOLOR
), но даже это вызвалонечего показывать или действовать иначе.
После того, как я нажму кнопку «Следующий совет», он будет правильно нарисовать следующий совет в списке. Однако заголовок customdrawn сзначок лампочки по-прежнему отсутствует.
Код на самом деле не делает ничего особенного, что я могу заметить, и я в растерянности. Поскольку я подозреваю, что определение диалога наиболее полезно, я добавлю это, хотя я могупубликуйте другие вещи, если у людей есть идеи о том, где скрываются проблемы.
IDD_TIP DIALOG DISCARDABLE 0, 0, 231, 164
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Tip of the Day"
FONT 8, "MS Sans Serif"
BEGIN
CONTROL "",IDC_STATIC,"Static",SS_BLACKFRAME,12,11,207,123
LTEXT "Some String",IDC_TIPSTRING,28,63,177,60
CONTROL "&Show Tips on StartUp",IDC_STARTUP,"Button",
BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,13,146,85,10
PUSHBUTTON "&Next Tip",IDC_NEXTTIP,109,143,50,14,WS_GROUP
DEFPUSHBUTTON "&Close",IDOK,168,143,50,14,WS_GROUP
CONTROL "",IDC_BULB,"Static",SS_BITMAP,20,17,190,111
END
Машина, на которой я тестирую это, - это 64-битная машина W7 с VS2010,Само рассматриваемое приложение является 32-битным.
Редактировать:
Новый день предоставляет новые идеи.Почему-то проблема связана с обработкой сообщения WM_CTLCOLOR
.Когда я установил его на возвращение NULL_BRUSH
, я наконец увидел, что что-то нарисовано (это, конечно, размыто поверх другого после первоначального рисования).Прибавляя это еще дальше, кажется, что когда nCtlColor == CTLCOLOR_STATIC
, если я верну NULL_BRUSH
, вещи будут отображаться.Однако, в тот момент, когда я делаю это WHITE_BRUSH
, ничто не обращается снова.
Оригинальный код:
HBRUSH CTipDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
if (pWnd->GetDlgCtrlID() == IDC_TIPSTRING)
return (HBRUSH)GetStockObject(WHITE_BRUSH);
<b> else if (nCtlColor == CTLCOLOR_STATIC)
/* Visual styles enabled causes the things we draw in our WM_PAINT
* to get cleared (and not redrawn) if we do not use a hollow brush here.
* Likely the default behaviour differs when using theming. */
return (HBRUSH)GetStockObject(HOLLOW_BRUSH);
</b>
return CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
}
Проблема решена!Жирные строки - это то, что я изменил, чтобы исправить мою проблему, включая обязательные комментарии.:)