Проблема стиля диалогов в Fаsm

Тема в разделе "WASM.ASSEMBLER", создана пользователем Arthur, 19 июн 2007.

  1. Arthur

    Arthur New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2007
    Сообщения:
    494
    Приветствую!

    Нарисовал я диалог с помощью ResEd и скомпилил RC из пакета masm32, запихал в секцию таким методом:

    Код (Text):
    1. section '.rsrc' data readable resource from 'rsrc.res'
    В самой программе запускаю диалог посредством DialogBoxParam, но вместо того чтобы диалог появился в центре и его компоненты имели дизаин текущей темы Windows, диалог появляется в самом начале, а его компоненты имеют старый стиль (Win95-2000). В самом диалоге я указал DS_3DLOOK | DS_CENTER | DS_MODALFRAME и WS_CAPTION | WS_SYSMENU | WS_VISIBLE.

    Почему эти стили не работают? Или чего то я не зделал?
     
  2. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    Добавь манифест в ресурсы и вызови InitCommonControls в программе.
    Можеш скачать и посмотреть пример тут www.twit.wen.ru/Javanna_last.zip :), файл rsrc.asm.
    A вот положение окна надо вручную менять.
     
  3. Arthur

    Arthur New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2007
    Сообщения:
    494
    Я вот скачал пример install_machine, там вроде диалог вызывается так как должен со всеми стилями (исходник для masm32)
     
  4. Yaroslav

    Yaroslav New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2007
    Сообщения:
    3
    Может в линкере дело? Вот, например, компилим это:
    Код (Text):
    1. ;dlg.asm
    2. .386p
    3. .model flat, stdcall
    4.  
    5. includelib c:\masm32\lib\kernel32.lib
    6. extrn GetModuleHandleA@4:near
    7. extrn ExitProcess@4:near
    8.  
    9. includelib c:\masm32\lib\user32.lib
    10. extrn DialogBoxParamA@20:near
    11. extrn EndDialog@8:near
    12.  
    13. _DATA segment dword public use32 'DATA'
    14.  somedata dd 0
    15. _DATA ends
    16.  
    17. _TEXT segment dword public use32 'CODE'
    18. START:
    19.  push 0
    20.  call GetModuleHandleA@4
    21.  push 0
    22.  push offset DlgProc
    23.  push 0
    24.  push 1
    25.  push eax
    26.  call DialogBoxParamA@20
    27.  push 0
    28.  call ExitProcess@4
    29.  retn
    30.  
    31. DlgProc proc
    32.  push ebp
    33.  mov  ebp, esp
    34.  cmp  dword ptr [ebp+0Ch], 10h
    35.  jz   WM_CLOSE
    36.  xor  eax, eax
    37.  pop  ebp
    38.  retn 10h
    39. WM_CLOSE:
    40.  push 0
    41.  push [ebp+8]
    42.  call EndDialog@8
    43.  mov  eax, 1
    44.  pop  ebp
    45.  retn 10h
    46. DlgProc endp
    47.  
    48. _TEXT ends
    49.  
    50. end START
    и это:
    Код (Text):
    1. ;dlg.rc
    2. 1 DIALOG 0, 0, 200, 100
    3. STYLE 0x80800
    4. CAPTION "Dialog"
    5. FONT 8, "MS Sans Serif"
    6. {
    7. }
    - в MASM получаем симпатишное серенькое окошко по центру экрана
    - в TASM - чуть менее симпатишное, белое, не того размера и в левом верхнем углу
     
  5. Arthur

    Arthur New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2007
    Сообщения:
    494
    Yaroslav
    Скорее всего. Так как в install machine есть манифест, но нету вызова InitCommonControls. Да и к тому же я попробовал зделать так (взял манифест от install machine и вызвал InitCommonControls перед DialogBoxParam) один пуп, все также без изменений :dntknw:
     
  6. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    версию ОС поставь в фасме 4.0, а затем убери и посмотри разницу в диалогах.
     
  7. Arthur

    Arthur New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2007
    Сообщения:
    494
    asmfan
    поставил версию - диалог грузится по середине, но компы все равно старенькие (вместе с манифестом и InitCommCtrls), убрал - диалог появляется в самом начале экрана.
     
  8. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    эти диалоги выводятся по центру - сравни со своим
    ------------
    да - скачивается с ашипкой
     
  9. Arthur

    Arthur New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2007
    Сообщения:
    494
    Чаго то архив не распаковывается, ни WinRar'ом, ни 7z.
     
  10. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    или 7з старый, или ошипка. вот в зипе:
    -----------
    и этот тоже :dntknw: наверное, проблема заливки/скачивания :dntknw:
    -----------
    вот здесь
     
  11. Arthur

    Arthur New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2007
    Сообщения:
    494
    shoo это понятно. В стилях диалогов указан DS_CENTER отвечающий за начальную позицию диалога. Если не указана версия ОС в fasm, то этот стиль не действует, ну а если поставить версию 4.0 то диалог выстраивается по центру.
    Код (Text):
    1. format pe gui ; Без версии ОС
    2. format pe gui 4.0 ; с версией
    При чем кроме 4.0 другую версию не поставишь (т. к. приложение не запустит винда), но как я заметил версию можно указать в манифесте. Но проблема дизайна контролов так и остается с выставленными версиями ОС, приатаччивании манифеста(от Javanna с версией ОС 6.0), и вызова InitCommonControls'а. Шо делать я не знаю?
     
  12. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    Вызов initcommoncontrols ставиш до создания диалога или после?
    Кстати 6.0 это версия не ос, а commoncontrols'ов.
    Зы. Заметь что манифест добавляется с типом 24
     
  13. Arthur

    Arthur New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2007
    Сообщения:
    494
    до вызова диалога:
    Код (Text):
    1.    invoke InitCommonControls
    2.    invoke DialogBoxParam,...
    Еще пробовал запихать вызов CommonControls'a в инициализацию диалога, т. е. в DialogProc, но результаты отрицательны.

    Буду знать.

    Я не использую стандартные средства работы с ресурсами FAsm'a, а использую ResEd, и в таблицы ресурсов у манифеста я выставил Name: winxp, ID: 24. Се равно не получается :dntknw:
     
  14. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    Хорошо, тогда манифест не кидай в ресурсы, а добавь его в папку с твоей прогой и назови его имя_файла_проги.exe.manifest
    рекомендую так же снять тип DS_CENTER, у меня например с ним диалог не создается, как и с DS_NOIDLEMSG!
     
  15. Arthur

    Arthur New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2007
    Сообщения:
    494
    twgt
    Заработало!!! Чудеса Windows XP или корявые пальцы Microsoft'a :)
    Спасибо.
     
  16. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    Это было именно из-за того, что тип манифеста не 24 ставится в файле ресурсов.
     
  17. TOR

    TOR New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2004
    Сообщения:
    99
    Адрес:
    Ukraine
    Манифест должен быть включен в файл рессурсов самым первым.
     
  18. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    да ну?!
     
  19. TOR

    TOR New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2004
    Сообщения:
    99
    Адрес:
    Ukraine
    В данный момент времени в файле winuser.h от VC 6 не описан тип ресурса 24 - там описание заканчивается типом 23, который называется RT_HTML, но если посмотреть в других местах, то можно найти, что 24 - это RT_MANIFEST, а 1 (идентификатор ресурса) определен как CREATEPROCESS_MANIFEST_RESOURCE_ID. Поэтому, если Вы пишите на VC++, то можете добавить в файл winuser.h после строки следующий текст:
    Код (Text):
    1. #define RT_MANIFEST                        MAKEINTRESOURCE(24)
    2. #define CREATEPROCESS_MANIFEST_RESOURCE_ID MAKEINTRESOURCE(1)
    3. #define ISOLATIONAWARE_MANIFEST_RESOURCE_ID MAKEINTRESOURCE(2)
    4. #define ISOLATIONAWARE_NOSTATICIMPORT_MANIFEST_RESOURCE_ID MAKEINTRESOURCE(3)
    5. #define MINIMUM_RESERVED_MANIFEST_RESOURCE_ID MAKEINTRESOURCE(1 /*inclusive*/)
    6. #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
    Пить меньше нужно ))
     
  20. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    Ну так это не мне, а тебе надо пить меньше :)
    естественно что в директории ресурсов с типом 24 он должен быть первым, или даже единственным.
    Я думал все же что ты имел ввиду другое, говоря 'Манифест должен быть включен в
    файл рессурсов самым первым' ;)
    вот по теме ссылка, можно почитать