Пишу програмку на MVС++ и появилась пара проблемных мест:
1. Как сделать кнопки (класс "button") в стиле ХР? Получаются в стиле 98. Погуглил - нашел схему реализации через манифесты, c трудом, но получилось, можно ли как то по другому это реализовать? Плюс к этому, когда копки стали отрисовываться в стиле ХР, перестал работать код:
SendMessage(button.hwnd, BM_SETSTATE, 1, 0);
Sleep(100);
SendMessage(button.hwnd, BM_SETSTATE, 0, 0);
Что с этим можно сделать?
2. Подскажите, в чём может быть проблема:
В Вин 7 через манифест сделал округлое оформление кнопок в стиле ХР, однако в самой ХР - рабочие элементы (кнопки, поля и т.д.) не выводятся (просто пустая рамочка окна)! Без манифеста - всё нормально (но квадратные кнопки не устраивают). Пробовал собирать проект на ХР - результат такой же плачевный
С++ WinAPI manifest
Модераторы: Duncon, Hawk, Romeo, Eugie
- mc-black
- Сообщения: 250
- Зарегистрирован: 08 май 2008, 16:09
- Откуда: Россия, Нижний Новгород
- Контактная информация:
Какую именно? Можно файл манифеста назвать имя_бинарника.exe.manifest, а можно манифест-файл добавить в ресурс (23). Второй вариант предпочтительней и он работает по дефолту в новых версиях Visual Studio. На обработку сообщений manifest влиять не должен, может просто интервал Sleep надо увеличить, чтобы видно было? По второму вопросу - какой вид манифеста ты используешь - может поищешь и попробуешь другой манифест - есть же разные варианты. Покажи то, что у тебя есть?нашел схему реализации через манифесты
На заказ: VBA, Excel mc-black@yandex.ru
#pragma comment(linker, "\"/manifestdependency:type='Win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='X86' publicKeyToken='6595b64144ccf1df' language='*'\"")
Таким способом подключаю, если через ресурсы или через опцию в линковщике результат от этого не меняется. Другую версию манифеста не видел, везде где говорят про стиль ХР - используют такую постановку.
Ещё один маленький вопросик - как добавить шрифт в ресурс и использовать его а не системные (CreateFont())?
Таким способом подключаю, если через ресурсы или через опцию в линковщике результат от этого не меняется. Другую версию манифеста не видел, везде где говорят про стиль ХР - используют такую постановку.
Ещё один маленький вопросик - как добавить шрифт в ресурс и использовать его а не системные (CreateFont())?
- mc-black
- Сообщения: 250
- Зарегистрирован: 08 май 2008, 16:09
- Откуда: Россия, Нижний Новгород
- Контактная информация:
Я использовал вот такой mainifest-файл:
Вот такой rc-скрипт для создания ресурса
Вот так компилировал ресурс, программу и линковал все вместе (это ассемблер, MASM32 SDK):
Какую версию VS используешь? Этот путь, что ты показал, скорее характерен для среды разработки, не знаю, верно там все или нет, может версия manifestVersion не та что требуется для WinXP?
Добавлено:
Насчет шрифта в ресурсах, почитай справку по компилятору ресурсов Microsoft rc.exe, файл называется rc.hlp или в MSDN, там есть ключевое слово для скрипта ресурсов FONT:
Добавлено сообщение
--------------------------------------------------------------------------------
Не ту статью про шрифт привел, посмотри лучше это описание:
Код: Выделить всё
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<description>Program Description</description>
<assemblyIdentity
version="1.0.0.0"
processorArchitecture="X86"
name="Program Name"
type="win32"
/>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="X86"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
</assembly>
Код: Выделить всё
1 24 DISCARDABLE "manifest.xml"
Код: Выделить всё
\masm32\bin\rc.exe tBalloon.rc
\masm32\bin\ml.exe /c /coff /nologo tBalloon.asm
\masm32\bin\link.exe /SUBSYSTEM:WINDOWS /STUB:s2b.bin /MERGE:.idata=.text /MERGE:.data=.text /MERGE:.rdata=.text /ALIGN:16 /IGNORE:4108 /IGNORE:4078 /NOLOGO tBalloon.obj tBalloon.res
Добавлено:
Насчет шрифта в ресурсах, почитай справку по компилятору ресурсов Microsoft rc.exe, файл называется rc.hlp или в MSDN, там есть ключевое слово для скрипта ресурсов FONT:
--------------------------------------------------------------------------------FONT Statement
FONT pointsize, typeface
The FONT statement defines the font with which Windows will draw text in the dialog box. The font must have been previously loaded, either from the WIN.INI file or by calling the LoadResource function.
Parameters
pointsize
Specifies the size, in points, of the font.
typeface
Specifies the name of the typeface. This name must be identical to the name defined in the [fonts] section of WIN.INI. This parameter must be enclosed in double quotes.
Example
The following example demonstrates the use of the FONT statement:
FONT 12, "MS Sans Serif"
Добавлено сообщение
--------------------------------------------------------------------------------
Не ту статью про шрифт привел, посмотри лучше это описание:
FONT Resource
nameID FONT [load-mem] filename
The FONT resource-definition statement specifies a file that contains a font.
For a font resource, nameID must be a number; it cannot be a name.
Parameters
nameID
Specifies either a unique name or a 16-bit unsigned integer value identifying the resource.
load-mem
Specifies loading and memory attributes for the resource. For more information, see "Common Resource Attributes".
filename
Specifies the name of the file that contains the resource. The name must be a valid filename; it must be a full path if the file is not in the current working directory. The path can either be a quoted or non-quoted string.
Example
The following example specifies a single font resource:
5 FONT CMROMAN.FNT
На заказ: VBA, Excel mc-black@yandex.ru
С манифестом разобрался - проблема в архитектуре проца. Теперь вопрос - как сделать что б работало на всех видах?
#if defined _M_IX86
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_IA64
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='ia64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_X64
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#else
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
#endif
использовал в коде. Но это работает только до компиляции. Если собрать на одной из приведенных архитектур - будет работать только для неё.
#if defined _M_IX86
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_IA64
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='ia64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_X64
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#else
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
#endif
использовал в коде. Но это работает только до компиляции. Если собрать на одной из приведенных архитектур - будет работать только для неё.
- mc-black
- Сообщения: 250
- Зарегистрирован: 08 май 2008, 16:09
- Откуда: Россия, Нижний Новгород
- Контактная информация:
processorArchitecture='Any CPU' будет работать? Есть такой выпадающий список в VS 2008 (или можно попробовать просто 'Any', '*' или совсем опустить опцию про процессор?
На заказ: VBA, Excel mc-black@yandex.ru
'*' не меняет реультат. Остальные варианты попробую позже - скажу. Сейчас нет доступа к компьютеру с ХР.