С++ WinAPI manifest

Общие вопросы, не зависящие от языка реализации.

Модераторы: Duncon, Hawk, Romeo, Eugie

Ответить
Sinarionn
Сообщения: 4
Зарегистрирован: 13 авг 2009, 00:14

Пишу програмку на MVС++ и появилась пара проблемных мест:
1. Как сделать кнопки (класс "button") в стиле ХР? Получаются в стиле 98. Погуглил - нашел схему реализации через манифесты, c трудом, но получилось, можно ли как то по другому это реализовать? Плюс к этому, когда копки стали отрисовываться в стиле ХР, перестал работать код:
SendMessage(button.hwnd, BM_SETSTATE, 1, 0);
Sleep(100);
SendMessage(button.hwnd, BM_SETSTATE, 0, 0);
Что с этим можно сделать?

2. Подскажите, в чём может быть проблема:
В Вин 7 через манифест сделал округлое оформление кнопок в стиле ХР, однако в самой ХР - рабочие элементы (кнопки, поля и т.д.) не выводятся (просто пустая рамочка окна)! Без манифеста - всё нормально (но квадратные кнопки не устраивают). Пробовал собирать проект на ХР - результат такой же плачевный
Аватара пользователя
mc-black
Сообщения: 250
Зарегистрирован: 08 май 2008, 16:09
Откуда: Россия, Нижний Новгород
Контактная информация:

нашел схему реализации через манифесты
Какую именно? Можно файл манифеста назвать имя_бинарника.exe.manifest, а можно манифест-файл добавить в ресурс (23). Второй вариант предпочтительней и он работает по дефолту в новых версиях Visual Studio. На обработку сообщений manifest влиять не должен, может просто интервал Sleep надо увеличить, чтобы видно было? По второму вопросу - какой вид манифеста ты используешь - может поищешь и попробуешь другой манифест - есть же разные варианты. Покажи то, что у тебя есть?
На заказ: VBA, Excel mc-black@yandex.ru
Sinarionn
Сообщения: 4
Зарегистрирован: 13 авг 2009, 00:14

#pragma comment(linker, "\"/manifestdependency:type='Win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='X86' publicKeyToken='6595b64144ccf1df' language='*'\"")
Таким способом подключаю, если через ресурсы или через опцию в линковщике результат от этого не меняется. Другую версию манифеста не видел, везде где говорят про стиль ХР - используют такую постановку.
Ещё один маленький вопросик - как добавить шрифт в ресурс и использовать его а не системные (CreateFont())?
Аватара пользователя
mc-black
Сообщения: 250
Зарегистрирован: 08 май 2008, 16:09
Откуда: Россия, Нижний Новгород
Контактная информация:

Я использовал вот такой mainifest-файл:

Код: Выделить всё

<?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>
Вот такой rc-скрипт для создания ресурса

Код: Выделить всё

1	24	DISCARDABLE	"manifest.xml"
Вот так компилировал ресурс, программу и линковал все вместе (это ассемблер, MASM32 SDK):

Код: Выделить всё

\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
Какую версию VS используешь? Этот путь, что ты показал, скорее характерен для среды разработки, не знаю, верно там все или нет, может версия manifestVersion не та что требуется для WinXP?

Добавлено:
Насчет шрифта в ресурсах, почитай справку по компилятору ресурсов 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
Sinarionn
Сообщения: 4
Зарегистрирован: 13 авг 2009, 00:14

С манифестом разобрался - проблема в архитектуре проца. Теперь вопрос - как сделать что б работало на всех видах?
#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
Sinarionn
Сообщения: 4
Зарегистрирован: 13 авг 2009, 00:14

'*' не меняет реультат. Остальные варианты попробую позже - скажу. Сейчас нет доступа к компьютеру с ХР.
Ответить