WedX - журнал о программировании и компьютерных науках

Внешний вид группового ящика

Я использую Visual Studio 2008 Professional Edition. Я разработал следующий диалог в редакторе диалогов: Диалог, который я разработал

Обратите особое внимание на групповое поле в диалоговом окне «Задачи». Здесь все выглядит нормально, но когда я отображаю его как немодальное диалоговое окно из своего приложения, внешний вид этого GroupBox внезапно меняется на -: Диалоговое окно при отображении из приложения

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

В моем файле ресурсов (Timer.rc) для диалога присутствует следующий код:

IDD_FORMVIEW DIALOGEX 0, 0, 204, 118
STYLE DS_ABSALIGN | DS_SETFONT | DS_SETFOREGROUND | DS_CENTER | WS_MINIMIZEBOX | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_APPWINDOW | WS_EX_NOACTIVATE
CAPTION "SR-Timer(Work in Progress)"
FONT 10, "Verdana", 400, 0, 0x0
BEGIN
    CONTROL         "Shutdown",IDC_RADIO1,"Button",BS_AUTORADIOBUTTON,73,37,48,10
    CONTROL         "Restart",IDC_RADIO2,"Button",BS_AUTORADIOBUTTON,73,54,39,10
    CONTROL         "Stand By",IDC_RADIO3,"Button",BS_AUTORADIOBUTTON,73,70,44,10
    CONTROL         "Hibernate",IDC_RADIO4,"Button",BS_AUTORADIOBUTTON,73,87,47,10
    GROUPBOX        "Tasks",IDC_STATIC,59,28,90,78
END

Заранее спасибо.

18.04.2012


Ответы:


1

Вы должны включить общий стиль управления XP.

Самый простой способ сделать это - включить это в файл манифеста, например. добавив его в компоновщик или добавив прагму в свой код, например:

#pragma comment(linker,"\"/manifestdependency:type='win32' \
name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \
processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")

EDIT: также может потребоваться явная инициализация общих элементов управления (не уверен на 100%), например:

INITCOMMONCONTROLSEX    InitStr;
InitStr.dwSize = sizeof(InitStr);
InitStr.dwICC  = ICC_WIN95_CLASSES|ICC_DATE_CLASSES|ICC_COOL_CLASSES;
// Other classes are: ICC_COOL_CLASSES, ICC_INTERNET_CLASSES, ICC_PAGESCROLLER_CLASS, ICC_USEREX_CLASSES
InitCommonControlsEx(&InitStr);

Также может потребоваться компиляция с правильными определениями версии Windows. Я компилирую, используя следующие параметры командной строки:

/D_WIN32_WINNT#0x0501 /DWINVER#0x0501 /D_WIN32_IE#0x0500

Но это всегда подразумевает, что приложению нужна как минимум Windows XP.

EDIT2 (как ответ на комментарий sreyan):

Я попытался скомпилировать следующий исходный файл (называемый test.cpp):

#include <iostream>

#pragma comment(linker,"\"/manifestdependency:type='win32' \
name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \
processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"") 

void main()
{
std::cout << "Hello World" << std::endl;
}

Используя следующие команды:

cl /EHsc /MD /c test.cpp
link test.obj

И были созданы следующие файлы:

23-04-12  10:49             9 728 test.exe
23-04-12  10:49               638 test.exe.manifest
23-04-12  10:49            16 812 test.obj

Файл test.exe.manifest содержит следующее:

<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level='asInvoker' uiAccess='false' />
      </requestedPrivileges>
    </security>
  </trustInfo>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*' />
    </dependentAssembly>
  </dependency>
</assembly>

Так что это, кажется, работает правильно.

Перепроверьте параметры, которые вы заполнили в Visual Studio, и добавленную прагму. Сначала попробуйте с небольшим приложением (например, выше), пока оно не заработает правильно. Затем перейдите к вашему большому приложению. Если это не работает, сравните отличия с небольшим приложением.

Успех.

18.04.2012
  • Это не работает. Я вставил код следующим образом: version='6.0.0.0'\processorArchitecture='' publicKeyToken='6595b64144ccf1df' language=''\) LRESULT CALLBACK WindowFunc(HWND , UINT, WPARAM, LPARAM); BOOL CALLBACK DialogFunc(HWND, UINT, WPARAM, LPARAM); char szWinName[]=Главное окно таймера; int WINAPI WinMain(HINSTANCE hThisInst, HINSTANCE hPrevInst, LPSTR lpszArgs, int nWinMode)... Я что-то пропустил??? 18.04.2012
  • Спасибо за информацию, но мне нужно, чтобы мое приложение работало с Win 2000 и выше. Кстати, в чем смысл комментария #pragma и параметра командной строки, который вы дали, я не могу понять это, без обид, я просто новичок в Win32 API и хочу знать. 18.04.2012
  • Прагма указывает компилятору добавить текст (для компоновщика) где-нибудь в сгенерированном файле .OBJ. Компоновщик возьмет эту информацию из файла .OBJ и будет использовать текст в качестве дополнительной опции командной строки (вы можете использовать этот трюк, чтобы добавить любую опцию в компоновщик). Параметр /manifestdependency указывает компоновщику добавить эту зависимость в сгенерированный файл манифеста (см. msdn.microsoft.com/en-us/library/ew0y5khy(v=vs.80).aspx). Наконец, вы можете использовать инструмент манифеста, чтобы включить манифест в качестве ресурса в исполняемый файл (см. ">msdn.microsoft.com/en-us/library/ms235591.aspx). 20.04.2012
  • Также msdn.microsoft.com/en-us/library/ms235591.aspx содержит хорошее объяснение по этому поводу. 20.04.2012
  • /manifestdependency:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processingArchitecture='' publicKeyToken='6595b64144ccf1df' language=''\) у меня есть добавил указанную выше строку в раздел дополнительных зависимостей манифеста в области компоновщика на странице свойств. Но я получаю сообщение об ошибке, что файл манифеста не может быть создан. \Debug\Timer.exe.intermediate.manifest: общая ошибка c1010070: не удалось загрузить и проанализировать манифест. Я знаю, что что-то упускаю, есть ли целый проект, на который я мог бы сослаться ?? 20.04.2012

  • 2

    По-видимому, для этого требуется манифест и/или вызов InitCommonControls(). См. включение визуальных стилей для получения дополнительной информации.

    18.04.2012
  • @ Joey Извините, я использую Windows XP Professional, поэтому эти стили не должны быть активированы по умолчанию. Я имею в виду, зачем идти на все эти проблемы только для того, чтобы активировать внешний вид текущей ОС???? 18.04.2012
  • @ Joey Я добавил следующую строку вверху кода: #pragma comment(linker,\/manifestdependency:type='win32' \ name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \ processingArchitecture='' publicKeyToken='6595b64144ccf1df' language=''\) Затем включил CommCtrl.h в свою программу, но получил следующую ошибку: Main.obj: error LNK2019: неразрешенный внешний символ __imp__InitCommonControls @0 упоминается в функции _WinMain@16 1>C:\Documents and Settings\Sreyan\My Documents\Visual Studio 2008\Projects\Timer\Debug\Timer.exe : фатальная ошибка LNK1120: 1 неразрешенный внешний файл 18.04.2012
  • Срейан, тематические элементы управления отличаются от обычных, поэтому вам нужно сделать ссылку на другую версию общих элементов управления. 18.04.2012
  • Есть ли в сети хороший учебник по этой теме, потому что объяснение msdn не совсем подходит для начинающих. 18.04.2012
  • Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]