Приветствую! Нарисовал я диалог с помощью ResEd и скомпилил RC из пакета masm32, запихал в секцию таким методом: Код (Text): section '.rsrc' data readable resource from 'rsrc.res' В самой программе запускаю диалог посредством DialogBoxParam, но вместо того чтобы диалог появился в центре и его компоненты имели дизаин текущей темы Windows, диалог появляется в самом начале, а его компоненты имеют старый стиль (Win95-2000). В самом диалоге я указал DS_3DLOOK | DS_CENTER | DS_MODALFRAME и WS_CAPTION | WS_SYSMENU | WS_VISIBLE. Почему эти стили не работают? Или чего то я не зделал?
Добавь манифест в ресурсы и вызови InitCommonControls в программе. Можеш скачать и посмотреть пример тут www.twit.wen.ru/Javanna_last.zip , файл rsrc.asm. A вот положение окна надо вручную менять.
Я вот скачал пример install_machine, там вроде диалог вызывается так как должен со всеми стилями (исходник для masm32)
Может в линкере дело? Вот, например, компилим это: Код (Text): ;dlg.asm .386p .model flat, stdcall includelib c:\masm32\lib\kernel32.lib extrn GetModuleHandleA@4:near extrn ExitProcess@4:near includelib c:\masm32\lib\user32.lib extrn DialogBoxParamA@20:near extrn EndDialog@8:near _DATA segment dword public use32 'DATA' somedata dd 0 _DATA ends _TEXT segment dword public use32 'CODE' START: push 0 call GetModuleHandleA@4 push 0 push offset DlgProc push 0 push 1 push eax call DialogBoxParamA@20 push 0 call ExitProcess@4 retn DlgProc proc push ebp mov ebp, esp cmp dword ptr [ebp+0Ch], 10h jz WM_CLOSE xor eax, eax pop ebp retn 10h WM_CLOSE: push 0 push [ebp+8] call EndDialog@8 mov eax, 1 pop ebp retn 10h DlgProc endp _TEXT ends end START и это: Код (Text): ;dlg.rc 1 DIALOG 0, 0, 200, 100 STYLE 0x80800 CAPTION "Dialog" FONT 8, "MS Sans Serif" { } - в MASM получаем симпатишное серенькое окошко по центру экрана - в TASM - чуть менее симпатишное, белое, не того размера и в левом верхнем углу
Yaroslav Скорее всего. Так как в install machine есть манифест, но нету вызова InitCommonControls. Да и к тому же я попробовал зделать так (взял манифест от install machine и вызвал InitCommonControls перед DialogBoxParam) один пуп, все также без изменений
asmfan поставил версию - диалог грузится по середине, но компы все равно старенькие (вместе с манифестом и InitCommCtrls), убрал - диалог появляется в самом начале экрана.
или 7з старый, или ошипка. вот в зипе: ----------- и этот тоже наверное, проблема заливки/скачивания ----------- вот здесь
shoo это понятно. В стилях диалогов указан DS_CENTER отвечающий за начальную позицию диалога. Если не указана версия ОС в fasm, то этот стиль не действует, ну а если поставить версию 4.0 то диалог выстраивается по центру. Код (Text): format pe gui ; Без версии ОС format pe gui 4.0 ; с версией При чем кроме 4.0 другую версию не поставишь (т. к. приложение не запустит винда), но как я заметил версию можно указать в манифесте. Но проблема дизайна контролов так и остается с выставленными версиями ОС, приатаччивании манифеста(от Javanna с версией ОС 6.0), и вызова InitCommonControls'а. Шо делать я не знаю?
Вызов initcommoncontrols ставиш до создания диалога или после? Кстати 6.0 это версия не ос, а commoncontrols'ов. Зы. Заметь что манифест добавляется с типом 24
до вызова диалога: Код (Text): invoke InitCommonControls invoke DialogBoxParam,... Еще пробовал запихать вызов CommonControls'a в инициализацию диалога, т. е. в DialogProc, но результаты отрицательны. Буду знать. Я не использую стандартные средства работы с ресурсами FAsm'a, а использую ResEd, и в таблицы ресурсов у манифеста я выставил Name: winxp, ID: 24. Се равно не получается
Хорошо, тогда манифест не кидай в ресурсы, а добавь его в папку с твоей прогой и назови его имя_файла_проги.exe.manifest рекомендую так же снять тип DS_CENTER, у меня например с ним диалог не создается, как и с DS_NOIDLEMSG!
В данный момент времени в файле winuser.h от VC 6 не описан тип ресурса 24 - там описание заканчивается типом 23, который называется RT_HTML, но если посмотреть в других местах, то можно найти, что 24 - это RT_MANIFEST, а 1 (идентификатор ресурса) определен как CREATEPROCESS_MANIFEST_RESOURCE_ID. Поэтому, если Вы пишите на VC++, то можете добавить в файл winuser.h после строки следующий текст: Код (Text): #define RT_MANIFEST MAKEINTRESOURCE(24) #define CREATEPROCESS_MANIFEST_RESOURCE_ID MAKEINTRESOURCE(1) #define ISOLATIONAWARE_MANIFEST_RESOURCE_ID MAKEINTRESOURCE(2) #define ISOLATIONAWARE_NOSTATICIMPORT_MANIFEST_RESOURCE_ID MAKEINTRESOURCE(3) #define MINIMUM_RESERVED_MANIFEST_RESOURCE_ID MAKEINTRESOURCE(1 /*inclusive*/) #define MAXIMUM_RESERVED_MANIFEST_RESOURCE_ID MAKEINTRESOURCE(16 /*inclusive*/) Но, в принципе, вполне можно запомнить, что для того, чтобы добавить в Вашу программу манифест просто достаточно в имеющийся (или специально для этого созданный и подключенный к проекту) файл .rc добавить строку 1 24 DISCARDABLE "manifest.xml" Где 1 - это идентификатор ресурса (манифест обязательно должен быть под идентификатором 1) и 24 - это тип ресурса, а заканчивается строка именем файла, в котором находится информация, помещаемая в ресурсы - в данном случае это файл "manifest.xml". (C- откуда-то) Короче вот это важно: Где 1 - это идентификатор ресурса (манифест обязательно должен быть под идентификатором 1) и 24 - это тип ресурса, а заканчивается строка именем файла, в котором находится информация, помещаемая в ресурсы - в данном случае это файл "manifest.xml". Манифест должен быть включен в файл рессурсов самым первым (подразумевалось что с идентификатором 1) twgt Пить меньше нужно ))
Ну так это не мне, а тебе надо пить меньше естественно что в директории ресурсов с типом 24 он должен быть первым, или даже единственным. Я думал все же что ты имел ввиду другое, говоря 'Манифест должен быть включен в файл рессурсов самым первым' вот по теме ссылка, можно почитать