TextOut & ChooseFont (Where's the bug?)

Тема в разделе "WASM.BEGINNERS", создана пользователем kb_08h, 2 окт 2006.

  1. kb_08h

    kb_08h New Member

    Публикаций:
    0
    Регистрация:
    16 окт 2005
    Сообщения:
    17
    Адрес:
    Kyiv
    доброго времени суток, уважаемые кодеры.

    написал следующую прогу, в которой необходимо реализовать возможность изменения пользователем параметров шрифта посредством вызова из меню функции ChooseFont, и в следующем цикле создать шрифт, используя структуру LOGFONT с данными о выьранном шрифте, затем вывести в рабочую область текст при помощи TextOut; все бы хорошо, но при запуске программа выводит ошибку и завершает приложение:

    Код (Text):
    1. format PE GUI 4.0
    2. entry start
    3.  
    4. include '%fasminc%\WIN32A.INC'
    5.  
    6. section '.data' data readable writeable
    7. ;-------------------------------------------------------------------------
    8.     wmsg        MSG
    9.     wcls        WNDCLASS
    10.     stime       SYSTEMTIME
    11.     _ps         PAINTSTRUCT
    12.     _ccs        CHOOSECOLOR
    13.     _cfs        CHOOSEFONT
    14.     _logfont    LOGFONT
    15.     _rect       RECT
    16.  
    17.     whmain      dd    ?
    18.     whinst      dd    ?
    19.     hmenu       dd    ?
    20.     wtitle      db    'bsclock',0
    21.     class_name  db    'class',0
    22.     id_timer    equ   1
    23.     mn_color    equ   101
    24.     mn_close    equ   102
    25.     mn_about    equ   103
    26.     mn_font     equ   104
    27.     _ChooseFont db    'font setup',0
    28.     _color      db    'color setup',0
    29.     _about      db    'about',0
    30.     _close      db    'quit',0
    31.     abt_capt    db    'about bsclock',0
    32.     abt_text    db    'not implemented yet =)',0
    33.     FPointSize  dd    ?
    34.     CustColors  dd 16 dup (?)
    35.     FontColor   dd    ?
    36.     _hfont      dd    ?
    37.     _hdc        dd    ?
    38.     rgbresult   dd    ?
    39.     _date       db      '%02d/%02d/%02d',0
    40.     _time       db      '%02d:%02d:%02d',0
    41.     _buff       rb      9
    42.                 ;db     0
    43.  
    44. section '.code' readable executable
    45. ;-------------------------------------------------------------------------
    46.     start:
    47.    
    48.     ;-->    registering the window class --------------------------------
    49.  
    50.     invoke    GetModuleHandle,NULL
    51.     mov       [whinst],eax
    52.     mov       [wcls.hInstance],eax
    53.     mov       [wcls.style],CS_HREDRAW or CS_VREDRAW
    54.     mov       [wcls.lpfnWndProc],window_procedure
    55.     mov       [wcls.lpszClassName],class_name
    56.     mov       [wcls.hbrBackground],COLOR_WINDOW+1
    57.     invoke    LoadIcon,NULL,IDI_WINLOGO
    58.     mov       [wcls.hIcon],eax
    59.     invoke    LoadCursor,NULL,IDC_ARROW
    60.     mov       [wcls.hCursor],eax
    61.     invoke    RegisterClass,wcls
    62.  
    63.     ;--> creating the main window --------------------------------
    64.    
    65.     invoke    CreateWindowEx,\
    66.             0,\
    67.             class_name,\
    68.             wtitle,\
    69.             WS_EX_TOOLWINDOW,\
    70.             CW_USEDEFAULT,\
    71.             CW_USEDEFAULT,\
    72.             140,\
    73.             50,\
    74.             NULL,\
    75.             NULL,\
    76.             [whinst],\
    77.             NULL
    78.  
    79.     mov    [whmain],eax
    80.     invoke ShowWindow,[whmain],SW_SHOWNORMAL
    81.  
    82.     ;- getting current date -------------------------------------
    83.  
    84.     movzx    eax,[stime.wDay]
    85.     movzx    ebx,[stime.wMonth]
    86.     movzx    edi,[stime.wYear]
    87.     invoke   wsprintf,_buff,_date,eax,ebx,edi
    88.  
    89.     ;--> entering the message loop ------------------------------
    90.    
    91.     window_msg_loop_start:
    92.    
    93.     invoke    GetMessage,wmsg,NULL,0,0
    94.     or        eax,eax
    95.     je        window_message_loop_end
    96.     invoke    TranslateMessage,wmsg
    97.     invoke    DispatchMessage,wmsg
    98.     jmp        window_msg_loop_start
    99.  
    100.     window_message_loop_end:
    101.     invoke    ExitProcess,0
    102.  
    103.     ;- setting the LOGFONT structure -----------------------------
    104.     mov    [_logfont.lfHeight],10
    105.     mov    [_logfont.lfEscapement],0
    106.     mov    [_logfont.lfOrientation],0
    107.     mov    [_logfont.lfWeight],FW_BOLD
    108.     mov    [_logfont.lfItalic],NULL
    109.     mov    [_logfont.lfUnderline],NULL
    110.     mov    [_logfont.lfStrikeOut],NULL
    111.     mov    [_logfont.lfCharSet],ANSI_CHARSET
    112.     mov    [_logfont.lfOutPrecision],OUT_DEFAULT_PRECIS
    113.     mov    [_logfont.lfClipPrecision],CLIP_DEFAULT_PRECIS
    114.     mov    [_logfont.lfQuality],DEFAULT_QUALITY
    115.     mov    [_logfont.lfPitchAndFamily],DEFAULT_PITCH
    116.  
    117.  
    118.  
    119.     ;--> the window procedure  -------------------------------------------------------------------------------------------
    120.    
    121.     proc    window_procedure,hWnd,uMsg,wParam,lParam
    122.     push    ebx esi edi
    123.  
    124.     invoke    DefWindowProc,[hWnd],[uMsg],[wParam],[lParam]
    125.  
    126.     cmp    [uMsg],WM_COMMAND
    127.     je     .wm_command
    128.     cmp    [uMsg],WM_CONTEXTMENU
    129.     je     .init_menu
    130.     cmp    [uMsg],WM_DESTROY
    131.     je    .wm_destroy
    132.     cmp    [uMsg],WM_TIMER
    133.     je    .wm_timer
    134.     cmp    [uMsg],WM_CREATE
    135.     je    .wm_create
    136.     cmp   [uMsg],WM_PAINT
    137.     je    .wm_paint
    138.     jmp   .finish
    139.  
    140.     .init_menu:
    141.     ;=======================================
    142.     mov     eax, [lParam]       ;if so, show the popup menu
    143.     and     eax, 0ffffh
    144.     mov     ebx, [lParam]
    145.     shr     ebx, 16
    146.     invoke  TrackPopupMenu,[hmenu],TPM_LEFTALIGN,eax,ebx,0,[hWnd],0
    147.     jmp     .finish
    148.     ;---------------------------------------
    149.  
    150.     .wm_command:
    151.     ;=======================================
    152.     mov     eax,[wParam]
    153.     cmp     eax,mn_font
    154.     je     .choose_font
    155.     cmp     eax,mn_color
    156.     je      .menu_color
    157.     cmp     eax,mn_about
    158.     je      .about
    159.     cmp     eax,mn_close
    160.     je      .wm_destroy
    161.     jmp     .finish
    162.     ;---------------------------------------
    163.  
    164.     .wm_create:
    165.     ;=======================================
    166.     invoke SetTimer,[hWnd],id_timer,200,NULL       ;0.2 seconds interval
    167.     invoke  CreatePopupMenu,0
    168.     mov     [hmenu],eax
    169.     invoke  AppendMenu, [hmenu],MF_STRING,mn_font,_ChooseFont
    170.     invoke  AppendMenu, [hmenu],MF_STRING,mn_color,_color
    171.     invoke  AppendMenu, [hmenu],MF_STRING,mn_about,_about
    172.     invoke  AppendMenu, [hmenu],MF_STRING,mn_close,_close
    173.     jmp     .finish
    174.     ;---------------------------------------
    175.  
    176.     .wm_timer:
    177.     ;=======================================
    178.     invoke    GetLocalTime,stime
    179.     ;getting current time
    180.     movzx     eax,[stime.wHour]
    181.     movzx     ebx,[stime.wMinute]
    182.     movzx     edi,[stime.wSecond]
    183.     invoke    wsprintf,_buff,_time,eax,ebx,edi
    184.     ;---------------------------------------
    185.  
    186.     .wm_paint:
    187.     ;=======================================
    188.     invoke    BeginPaint,[hWnd],_ps
    189.     mov       [_hdc],eax
    190.     invoke    CreateFontIndirect,_logfont
    191.     invoke    SelectObject,[_hdc],eax
    192.     mov       [_hfont],eax
    193.     invoke    TextOut,[_hdc],0,0,_time,_buff
    194.     invoke    SelectObject,[_hdc],[_hfont]
    195.     invoke    EndPaint,[hWnd],_ps
    196.     jmp   .finish
    197.     ;---------------------------------------
    198.  
    199.     .wm_destroy:
    200.     ;=======================================
    201.     invoke    KillTimer,[hWnd],id_timer
    202.     invoke    PostQuitMessage,0
    203.     jmp   .finish
    204.     ;---------------------------------------
    205.  
    206.     .about:
    207.     ;=======================================
    208.     invoke   MessageBox,[whmain],abt_text,abt_capt,MB_ICONINFORMATION or MB_OK
    209.     jmp      .finish
    210.     ;---------------------------------------
    211.  
    212.     .menu_color:
    213.     ;=======================================
    214.  
    215.     mov      [_ccs.lStructSize],sizeof.CHOOSECOLOR
    216.     mov      eax,[hWnd]
    217.     mov      [_ccs.hwndOwner],eax
    218.     mov      [_ccs.lpCustColors],CustColors
    219.     mov      [_ccs.Flags],CC_FULLOPEN or CC_RGBINIT
    220.     mov      [_ccs.lpTemplateName],NULL
    221.     mov      [_ccs.lpfnHook],NULL
    222.  
    223.     invoke   ChooseColor,_ccs
    224.     jmp      .finish
    225.     ;---------------------------------------
    226.  
    227.     .choose_font:
    228.     ;=======================================
    229.      mov     [_cfs.lStructSize],sizeof.CHOOSEFONT
    230.      mov     eax,[hWnd]
    231.      mov     [_cfs.hwndOwner],eax
    232.      mov     eax,[_hdc]
    233.      mov     [_cfs.hDC],eax
    234.      mov     [_cfs.lpLogFont],_logfont
    235.      mov     [_cfs.rgbColors],FontColor
    236.      mov     [_cfs.Flags],CF_SCREENFONTS or CF_EFFECTS
    237.  
    238.      invoke  ChooseFont,_cfs
    239.      jmp     .finish
    240.  
    241.     .finish:
    242.     ;=======================================
    243.     pop    edi esi ebx
    244.     ret
    245.     ;---------------------------------------
    246.    
    247.     endp
    248.  
    249. ;-------------------------------------------------------------------------
    250. section '.idata' import data readable writeable
    251.      library   kernel32, 'KERNEL32.DLL',\
    252.                user32,   'USER32.DLL',\
    253.                gdi32,    'GDI32.DLL',\
    254.                comdlg32,   'comdlg32.dll'
    255.  
    256.      import    kernel32,\
    257.            GetModuleHandle,    'GetModuleHandleA',\
    258.            ExitProcess,        'ExitProcess',\
    259.            GetLocalTime,       'GetLocalTime'
    260.  
    261.      import    comdlg32,\
    262.            ChooseColor,         'ChooseColorA',\
    263.            ChooseFont,          'ChooseFontA'
    264.  
    265.      import    user32,\
    266.            MessageBox,          'MessageBoxA',\
    267.            AppendMenu,          'AppendMenuA',\
    268.            CreatePopupMenu,     'CreatePopupMenu',\
    269.            TrackPopupMenu,      'TrackPopupMenu',\
    270.            RegisterClass,       'RegisterClassA',\
    271.            CreateWindowEx,      'CreateWindowExA',\
    272.            DefWindowProc,       'DefWindowProcA',\
    273.            ShowWindow,          'ShowWindow',\
    274.            UpdateWindow,        'UpdateWindow',\
    275.            LoadCursor,          'LoadCursorA',\
    276.            LoadIcon,            'LoadIconA',\
    277.            BeginPaint,          'BeginPaint',\
    278.            InvalidateRect,      'InvalidateRect',\
    279.            EndPaint,            'EndPaint',\
    280.            GetMessage,          'GetMessageA',\
    281.            GetClientRect,       'GetClientRect',\
    282.            GetDC,               'GetDC',\
    283.            ReleaseDC,           'ReleaseDC',\
    284.            DrawText,            'DrawTextA',\
    285.            TranslateMessage,    'TranslateMessage',\
    286.            DispatchMessage,     'DispatchMessageA',\
    287.            PostQuitMessage,     'PostQuitMessage',\
    288.            wsprintf,            'wsprintfA',\
    289.            SetTimer,            'SetTimer',\
    290.            KillTimer,           'KillTimer'
    291.  
    292.      import    gdi32,\
    293.            TextOut,             'TextOutA',\
    294.            CreateFontIndirect,  'CreateFontIndirectA',\
    295.            SelectObject,        'SelectObject'
    пожалуйста, подскажите где ошибка.

    весьма признателен. :)
     
  2. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    по порядку
    Код (Text):
    1. include '%fasminc%\WIN32A.INC'
    в аттаче абсолютный путь, что не есть гуд.
    далее
    Код (Text):
    1. section '.code' readable executable
    ну всё красиво только вот code директивы не хватат чтобы считаться секцией кода ('.code' - название секции (прим.))
    Код (Text):
    1. include '%fasminc%\WIN32Axp.INC'
    сделай - сразу найдёшь ошибку, а исправив можно обратно в WIN32A.INC переключить
    бывай)
     
  3. masquer

    masquer wasm.ru

    Публикаций:
    0
    Регистрация:
    13 сен 2002
    Сообщения:
    890
    Адрес:
    Николаев
    точный диагноз можно будет поставить только после того, как мы выясним откуда ты взял описание аргументов TextOut
     
  4. kb_08h

    kb_08h New Member

    Публикаций:
    0
    Регистрация:
    16 окт 2005
    Сообщения:
    17
    Адрес:
    Kyiv
    2 asmfan:

    спасибо за замечания, учту;
    подключил win32axp.inc, при компиляции, фасм ругался на "invoke CreatePopupMenu,0", почитал win32.hlp, исправил на
    Код (Text):
    1. invoke CreatePopupMenu
    ошибок при компиляции нет, результат тот же. =\
     
  5. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    masquer абсолютно верно подметил - у тя с параметрами чехорда... Ставь OllyDbg и дебаж...на крайняк
     
  6. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    Код (Text):
    1. invoke   wsprintf,_buff,_date,eax,ebx,edi
    а стек кто будет чистить? Дворник Вася?
     
  7. kb_08h

    kb_08h New Member

    Публикаций:
    0
    Регистрация:
    16 окт 2005
    Сообщения:
    17
    Адрес:
    Kyiv
    блин туева хуча лажовых ошибок. =\
    cbString должен быть в 32-разрядным, исправил на

    Код (Text):
    1. invoke    TextOut,[_hdc],0,0,_time,00001001b
    Работает без ошибок, текст, правда, не выводит =)

    Ушел курить маны.
     
  8. madhex

    madhex New Member

    Публикаций:
    0
    Регистрация:
    17 авг 2006
    Сообщения:
    12
    invoke TextOut,[_hdc],0,0,_time,sizeof _time-1

    stack чистить:

    add esp,4*(количество параметров)
     
  9. kb_08h

    kb_08h New Member

    Публикаций:
    0
    Регистрация:
    16 окт 2005
    Сообщения:
    17
    Адрес:
    Kyiv
    2 madhex:
    спасибо, разобрался с выравниванием стека; после вызова TextOut добавил
    Код (Text):
    1. add esp,14h
    последний параметр в TextOut исправил следующим образом
    Код (Text):
    1. invoke    lstrlen,_buff
    2. invoke    TextOut,[_hdc],0,0,_time,eax
    не смотря на все исправления =), текст не выводится, ковыряю прогу в дебаггере, но пока не нашел ошибку. =\

    еще раз спасибо за замечания.
     
  10. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    madhex
    Не извращайтесь. Есть cinvoke для cdecl-функций.

    kb_08h
    Он имел ввиду как корректировать стек вообще. TextOut тут не при чём, она stdcall.
     
  11. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    А вообще, тебе не отладчик нужен, а справка по функциям.
     
  12. kb_08h

    kb_08h New Member

    Публикаций:
    0
    Регистрация:
    16 окт 2005
    Сообщения:
    17
    Адрес:
    Kyiv
    2 IceStudent:
    это мне и так ясно, я в азме нуль полный, а что нибудь конструктивное по проблеме посоветовать можете? где копать? =\
     
  13. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Копать справку по используемым функциям. Сколько и какие параметры, что возвращает. Дальше для развития читаешь ссылку "Неофиту" в меню сайта и доки в ней. Потом переписываешь правильно свой код и тогда уже садишься за отладчик и смотришь, что работает не так, как надо бы.
     
  14. kb_08h

    kb_08h New Member

    Публикаций:
    0
    Регистрация:
    16 окт 2005
    Сообщения:
    17
    Адрес:
    Kyiv
    2 IceStudent
    андерстенд, спасибо. =)
     
  15. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    Порыл из интереса прогу немного) совсем чуть-чуть кому интересно - копайтесь

    regards,
    asmfan

    EDITED: новые версии в последних постах.
     
  16. madhex

    madhex New Member

    Публикаций:
    0
    Регистрация:
    17 авг 2006
    Сообщения:
    12
    пошарь на сайте
    http://cyberdoomsystems.narod.ru/
    там много эфектов .
    По моему ты не создал правельно DC
    читай мсреф
    GetDc
    CreateCompatibleDC
    CreateCompatibleBitmap
    SelectObject
    потом уже TextOut
     
  17. kb_08h

    kb_08h New Member

    Публикаций:
    0
    Регистрация:
    16 окт 2005
    Сообщения:
    17
    Адрес:
    Kyiv
    большое спасибо и респект всем за суппорт!
     
  18. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    Новая версия часиков. Дополненная и переработанная
    а я и не создаю DC я его захватываю на время, и к тому же ты говоришь про Double Buffering - битмап в памяти, чего я вообще не делаю за ненадобностью...

    EDITED: новые версии в последнем посте.
     
  19. madhex

    madhex New Member

    Публикаций:
    0
    Регистрация:
    17 авг 2006
    Сообщения:
    12
    а я не тебе говорю..
    сегодня посмотрю твой клок.
     
  20. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    Новая версия часиков созрела
    Bug report is welcomed)