Перейти к содержанию

Подключение Манифеста


Рекомендуемые сообщения

Для Windows XP для включения визуальных стилей достаточно было положить манифест в папку с приложением, на Win7 как я понял это не катит. Через ресурсы у меня не работает, хотя дело скорее в кривости рук. Пока набросал только рисование через GDI, докатываю memory manager, хочется использовать контролы текущей операционки, а не Winapi-шные.

6073a617375ac3fd029db54da53dc2e3.jpg

ps. это фича такая на форуме делать в теме первую букву каждого слова заглавной? :ninja:

Ссылка на комментарий
Поделиться на другие сайты

На чем пишешь? Вообще, в ресурсы запихивается манифест под типом 24 (RC_DATA), название ресурса должно быть "1" (без кавычек). И при запуске приложения (в самом начале функции WinMain, если манифест в ресурсах, обязательно нужно вызывать функцию InitCommonControls. Впрочем, для использования контролов текущей операционки, по сути, сам манифест не нужен. Он нужен только для поддержки визуальных тем операционки.

Ссылка на комментарий
Поделиться на другие сайты

На чем пишешь? Вообще, в ресурсы запихивается манифест под типом 24 (RC_DATA), название ресурса должно быть "1" (без кавычек). И при запуске приложения (в самом начале функции WinMain, если манифест в ресурсах, обязательно нужно вызывать функцию InitCommonControls. Впрочем, для использования контролов текущей операционки, по сути, сам манифест не нужен. Он нужен только для поддержки визуальных тем операционки.

Спасибо за ответ, пишу на unmanaged c++. Да, я имел ввиду визуальное оформление операционки.


<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1"
manifestVersion="1.0">
<assemblyIdentity
name="XPManifest"
processorArchitecture="x86"
version="1.0.0.0"
type="win32"/>
<description>Windows Shell</description>
<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 "resources\\manfiest\\manifest.xml"


int __stdcall WinMain (HINSTANCE hInstance, HINSTANCE h2, LPSTR cmd, int cmShow)
{
INITCOMMONCONTROLSEX icex;
icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
icex.dwICC = ICC_WIN95_CLASSES|ICC_COOL_CLASSES|ICC_BAR_CLASSES|ICC_USEREX_CLASSES|ICC_STANDARD_CLASSES;
InitCommonControlsEx(&icex);

Не спасает :ph34r:

UPD

чуть поколдовал :-D

уиии :3

44451525ab19289c9e5df42153bf0dd0.jpg

pss. И ещё одна проблемка:


LRESULT lResult = SendMessageA(hwnd, WM_SETICON, ICON_SMALL, IDI_ICON1);

Значок CoD4. Студия мне ставит какой-то замок:

3912ddcf45fedb16fb4947d2f23f5bb0.jpg

Ссылка на комментарий
Поделиться на другие сайты

Сначала нужно загрузить значок из ресурсов. Если у тебя IDI_ICON1 - это имя иконки, тогда воспользуйся макросом MAKINTRESOURCE(IDI_ICON1). А вообще, Насколько я помню, для WM_SETICON передается хэндл иконки. То есть, сначала надо сделать

hIcon = LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON1))

и только потом этот полученный хендл передавать в посыле сообщения WM_SETICON. Точно не помню, так ли это, проверять сейчас времени нет.

ЗЫ. Для "визуалок" необязательно использовать расширенную функцию. Достаточно простой InitCommonControls. Система сама заполнит структуру и перенаправит вызов на расширенную процедуру.

ЗЗЫ. Еще один маленький фокус - если в ресурсы иконку запихиваешь как

MAINICON ICON "c:\path\to\icon.ico"

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

Ссылка на комментарий
Поделиться на другие сайты

Xipho спасбио за советы! Но дело в том что я пробовал так, всёравно что-то не то :ph34r:

HICON hi=NULL;//глобальная переменная

После регистрации класса окна:


hi=LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON1));


case WM_INITDIALOG:
SendMessage(hWnd, WM_SETICON, ICON_SMALL, (LPARAM)hi);
break;

Ссылка на комментарий
Поделиться на другие сайты

После регистрации класса окна:

Так ты используешь не диалог, а обычное окно, я так понимаю? Если да, тогда при регистрации класса указывай в его структуре иконку. Это раз. И, если используется окно, а не диалог - обрабатывать нужно не WM_INITDIALOG, а WM_CREATE. Впрочем, при использовании обычного окна это не понадобится, ибо иконка, как я уже писал, указывается в определенных полях структуры создаваемого класса.


typedef struct tagWNDCLASSEX {
UINT cbSize;
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HINSTANCE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCTSTR lpszMenuName;
LPCTSTR lpszClassName;
HICON hIconSm;
} WNDCLASSEX, *PWNDCLASSEX;

Как видно, иконку нужно прописать в двух полях - hIcon, и hIconSm. Загрузить ее можно, как я уже показывал выше. Или же есть еще способ (несколько изуверский, но, тем не менее)


hIcon1 = (HICON) LoadImage( hInstance, MAKEINTRESOURCE(IDI_ICON1), IMAGE_ICON, 16, 16, LR_DEFAULTSIZE);

Это для маленькой иконки, а для большой - соответственно, размеры будут больше.

ЗЫ. Естественно, hInstance - это должна быть глобальная переменная, в которую, по идее, система сама хэндл процесса записывает, но я предпочитаю перестраховаться, вызвав в самом начале функцию


hInstance = GetModuleHandle(0);

Ссылка на комментарий
Поделиться на другие сайты

>> Значок CoD4. Студия мне ставит какой-то замок:

Synapsehome, если бы ты привёл свой исходный код,то тебе сразу ответили, что именно ты делаешь неправильно :)

Ссылка на комментарий
Поделиться на другие сайты

Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.