Проект Комментария к "Win32 API Tutorial" by Iczelion

Тема в разделе "WASM.PROJECTS", создана пользователем kero, 20 июн 2008.

  1. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    Plis, давно сюда не заглядывал, извините.

    Выкладываю наскоро переделанный код урока 18:
    все, что касается таймера - закомментировано, а взамен - вариант с потоком
    (вообще-то SendMessage между потоками лучше бы заменить на PostMessage или SendMessageTimeout).
    А в своем коде вы уж сами найдите, что не так, ладно?
    Код (Text):
    1. .386
    2. .model flat,stdcall
    3. option casemap:none
    4. include \masm32\include\windows.inc
    5. include \masm32\include\user32.inc
    6. include \masm32\include\kernel32.inc
    7. include \masm32\include\comctl32.inc
    8. includelib \masm32\lib\comctl32.lib
    9. includelib \masm32\lib\user32.lib
    10. includelib \masm32\lib\kernel32.lib
    11.  
    12. WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
    13.  
    14. .const
    15. IDC_PROGRESS    equ 1
    16. IDC_STATUS      equ 2
    17. IDC_TIMER       equ 3
    18.  
    19. .data
    20. ClassName       db "CommonControlWinClass",0
    21. AppName         db "Common Control Demo",0
    22. ProgressClass   db "msctls_progress32",0
    23. Message     db "Finished!",0
    24. ;TimerID        dd 0
    25.  
    26. .data?
    27. hInstance       HINSTANCE ?
    28. hwndProgress    dd ?
    29. hwndStatus  dd ?
    30. CurrentStep dd ?
    31.  
    32. .code
    33.  
    34. ThreadProc proc uses edi esi lParam:LPARAM
    35.   xor edi,edi  
    36.   xor esi,esi
    37. @@:
    38.   dec esi
    39.   test esi,esi
    40.   jz @f
    41.   inc edi
    42.   cmp edi,01000000h
    43.   jnz @b
    44.   xor edi,edi
    45.   invoke SendMessage,hwndProgress,PBM_STEPIT,0,0
    46.   sub CurrentStep,10
    47.   mov eax,CurrentStep
    48.   test eax,eax
    49.   jnz @b
    50. @@:
    51.   invoke SendMessage,hwndStatus,SB_SETTEXT,0,addr Message
    52.   invoke MessageBox,lParam,addr Message,addr AppName,MB_OK+MB_ICONINFORMATION
    53.   invoke SendMessage,hwndStatus,SB_SETTEXT,0,0
    54.   invoke SendMessage,hwndProgress,PBM_SETPOS,0,0
    55.   ret
    56. ThreadProc endp
    57.  
    58. start:
    59.     invoke GetModuleHandle, NULL
    60.     mov    hInstance,eax
    61.     invoke WinMain, hInstance,NULL,NULL, SW_SHOWDEFAULT
    62.     invoke ExitProcess,eax
    63.     invoke InitCommonControls
    64.  
    65. WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
    66.     LOCAL wc:WNDCLASSEX
    67.     LOCAL msg:MSG
    68.     LOCAL hwnd:HWND
    69.     mov   wc.cbSize,SIZEOF WNDCLASSEX
    70.     mov   wc.style, CS_HREDRAW or CS_VREDRAW
    71.     mov   wc.lpfnWndProc, OFFSET WndProc
    72.     mov   wc.cbClsExtra,NULL
    73.     mov   wc.cbWndExtra,NULL
    74.     push  hInst
    75.     pop   wc.hInstance
    76.     mov   wc.hbrBackground,COLOR_APPWORKSPACE
    77.     mov   wc.lpszMenuName,NULL
    78.     mov   wc.lpszClassName,OFFSET ClassName
    79.     invoke LoadIcon,NULL,IDI_APPLICATION
    80.     mov   wc.hIcon,eax
    81.     mov   wc.hIconSm,eax
    82.     invoke LoadCursor,NULL,IDC_ARROW
    83.     mov   wc.hCursor,eax
    84.     invoke RegisterClassEx, addr wc
    85.     invoke CreateWindowEx,WS_EX_CLIENTEDGE,ADDR ClassName,ADDR AppName,\
    86.            WS_OVERLAPPED+WS_CAPTION+WS_SYSMENU+WS_MINIMIZEBOX+WS_MAXIMIZEBOX+WS_VISIBLE,CW_USEDEFAULT,\
    87.            CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,\
    88.            hInst,NULL
    89.     mov   hwnd,eax
    90.     .while TRUE
    91.         invoke GetMessage, ADDR msg,NULL,0,0
    92.         .BREAK .IF (!eax)
    93.         invoke TranslateMessage, ADDR msg
    94.         invoke DispatchMessage, ADDR msg
    95.     .endw
    96.     mov eax,msg.wParam
    97.     ret
    98. WinMain endp
    99.  
    100. WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
    101.     .if uMsg==WM_CREATE
    102.         invoke CreateWindowEx,NULL,ADDR ProgressClass,NULL,\
    103.               WS_CHILD+WS_VISIBLE,100,\
    104.              200,300,20,hWnd,IDC_PROGRESS,\
    105.                hInstance,NULL
    106.         mov hwndProgress,eax
    107.         mov eax,1000
    108.         mov CurrentStep,eax
    109.         shl eax,16
    110.         invoke SendMessage,hwndProgress,PBM_SETRANGE,0,eax
    111.         invoke SendMessage,hwndProgress,PBM_SETSTEP,10,0
    112.         invoke CreateStatusWindow,WS_CHILD+WS_VISIBLE,NULL,hWnd,IDC_STATUS
    113.         mov hwndStatus,eax
    114. ;       invoke SetTimer,hWnd,IDC_TIMER,100,NULL
    115. ;       mov TimerID,eax
    116.     invoke CreateThread,0,0,offset ThreadProc,hWnd,0,0
    117.     invoke CloseHandle,eax
    118.     .elseif uMsg==WM_DESTROY
    119.         invoke PostQuitMessage,NULL
    120. ;       .if TimerID!=0
    121. ;           invoke KillTimer,hWnd,TimerID
    122. ;       .endif
    123. ;   .elseif uMsg==WM_TIMER
    124. ;       invoke SendMessage,hwndProgress,PBM_STEPIT,0,0
    125. ;       sub CurrentStep,10
    126. ;       .if CurrentStep==0
    127. ;           invoke KillTimer,hWnd,TimerID
    128. ;           mov TimerID,0
    129. ;           invoke SendMessage,hwndStatus,SB_SETTEXT,0,addr Message
    130. ;           invoke MessageBox,hWnd,addr Message,addr AppName,MB_OK+MB_ICONINFORMATION
    131. ;           invoke SendMessage,hwndStatus,SB_SETTEXT,0,0
    132. ;           invoke SendMessage,hwndProgress,PBM_SETPOS,0,0
    133. ;       .endif
    134.     .else
    135.         invoke DefWindowProc,hWnd,uMsg,wParam,lParam       
    136.         ret
    137.     .endif
    138.     xor eax,eax
    139.     ret
    140. WndProc endp
    141.  
    142. end start
     
  2. Plis

    Plis New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    26
    kero
    Спасибо!
    Здесь : http://www.wasm.ru/forum/viewtopic.php?pid=340863#p340863 , уже задал вопрос, на всякий случай продублирую:
    в примере esi и edi используются для цикла, о чём и написал Mikl___.

    Что за переходы :

    jz @f
    jnz @b

    т.е. я понимаю что они переходят к одной метке @@ и к другой, понимаю и зачем это делается - а вот почему это работает? Можно ведь так и обозначить метки @f и @b, или в твоём примере есть какое-то преимущество?
     
  3. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    я уже ответил тебе в твоем топике, тут добавлю - обозначать метки зарезервированным словами - дурной тон - в 99% случаев будет ошибка в 1% тяжело отлавливаемый глюк
    @@, @f, @b зарезервированы для быстрого создания условных переходов и используются строго по инструкции
     
  4. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    Ну, добавить нечего, разве что по мнемонике:
    "f"("F") - "forward",
    "b"("B") - "back".
     
  5. Plis

    Plis New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    26
    kero
    Rockphorr
    Сенкью...
     
  6. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    kero
    из всего что ты здесь напсотил ты статью сделаешь ?
    я вобщем уже и так все закопипастил, но это ведь не окончательный вариант ....
     
  7. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    Rockphorr
    Да, знаю, надо бы привести в порядок. Жду подходящего настроения :)
    Возможно, оно появится очень скоро: Yahoo! GeoCities 26 октября прикрывает все халявные сайты,
    в том числе и мой (9 годков отроду), так что хошь не хошь - придется возбудиться.
     
  8. mega_t72

    mega_t72 New Member

    Публикаций:
    0
    Регистрация:
    3 ноя 2009
    Сообщения:
    9
    привет, kero,
    хорошая статья, спасибо,
    я зарегистрировался специально по ее поводу,
    т.к. пока не вижу в рунете более менее специфической дискуссии в теме диалогов,
    а вернее их суперклассинга

    для меня еще остается белое пятно этой темы пожалуй только в одном месте:
    т.е. помимо строки тут можно указать идентификатор
    сначала была мысль, что диалоги умеют работать с атомами,
    и думаю, вполне логично, что появился соблазн синхронизировать атом класса в проекте с именем класса в ресурсе,
    опишу пример на ресурсах MSVC:
    описываем в resource.h дополнительную константу
    Код (Text):
    1. #define WC_MYCLASS 100
    и в *.rc формируем ресурс DIALOGEX, с ее учетом:
    после чего регистрируем класс
    Код (Text):
    1. WNDCLASSEX wcex;
    2. ...
    3. wcex.lpszClassName = MAKEINTRESOURCE( WC_MYCLASS );
    4. ...
    в итоге - приходим к ошибке "Не удается найти класс окна" после DialogBox, CreateDialog и т.п.,
    т.е. не вышло: диалоги не умеют работать с атомами

    но вот сейчас мелькнула другая мысль:
    что, если это не атом, а идентификатор строкового ресурса?

    получится не очень удобно, но все же такой финт тоже можно будет провернуть:
    в ресурсе добавляем строковый ресурс с содержанием типа:
    можно конечно выделить для строкового ресурса другой идентификатор, суть не в этом,
    этот вариант я пока не проверял, но скорее всего он пройдет,
    по крайней мере в части задействования CLASS в качестве идентификатора,

    конечно будет проще использовать другой вариант:
    дешего и сердито )
     
  9. mega_t72

    mega_t72 New Member

    Публикаций:
    0
    Регистрация:
    3 ноя 2009
    Сообщения:
    9
    и тоже не работает...

    что же это за "16-bit unsigned integer"?
     
  10. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    mega_t72
    Да нет, этот атом вам возврашает система через RegisterClassEx:
    это просто числовой идентификатор строки (придуманного вами имени оконного класса) в соответствующей системной таблице.
    Регистрировать строки можете, а выбирать место в таблице - нет :)
     
  11. mega_t72

    mega_t72 New Member

    Публикаций:
    0
    Регистрация:
    3 ноя 2009
    Сообщения:
    9
    да, знаю, только атомы классов(RegisterClassEx) и атомы системы (AddAtom) - несколько разные вещи,
    в классах - простое число, кторое можно указать вместо имени класса,
    в структуре WNDCLASSEX (и оно же вернется из RegisterClassEx) [это уже практический опыт, не домыслы],
    с обычными атомами это число объединяет только тип данных ATOM, и больше ничего,

    я писал именно об атомах классов, только вопрос все равно остается:
    если это не атом класса и не идентификатор строкового ресурса, то что?
     
  12. mega_t72

    mega_t72 New Member

    Публикаций:
    0
    Регистрация:
    3 ноя 2009
    Сообщения:
    9
    кстати, не заметил в статье об их упоминании, можешь тоже включить:
    все имена классов, начинающиеся с '#'
    и продолжающиеся десятичным набором цифр - те самые атомы, в том числе и системные:
     
  13. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    поясните про что идет речь??
    весь представленный здесь материал ???
    или что конкретное
     
  14. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    дай ссылочку, а ???
     
  15. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    mega_t72
    ага, ровно 3 года назад тут это обсуждалось :) - Как узнать имена стандартных классов окон в Win32, пост #26 и соседние.
    Мне уже доводилось отмечать, что этот списочек из MSDN - не шибко полный, к примеру, в нем нема занятнейшего #32774 :)
    Но поскольку наткнулся на несколько интересных моментов с классами именно благодаря ExtraSpy - пожалуй, и правда стоит немного дополнить главку 14 (Анализатор класса). Постараюсь сделать на неделе.
    ---

    Rockphorr
    Кое-что перебросил на http://xmemor.narod.ru/

    --------
    +
    FrameRector v.2011-04-05:
     
  16. mega_t72

    mega_t72 New Member

    Публикаций:
    0
    Регистрация:
    3 ноя 2009
    Сообщения:
    9
    ну, для этого достаточно было просто заглянуть в MSDN :)
     
  17. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    mega_t72
    "Заглянуть в MSDN" - это всегда необходимо, но никогда не достаточно :)

    Чему подтверждение - #32774. Или ваш здесь вопрос о регистрации оконного класса :)

    --------
    +
    WinTreeSnap v.2011-04-05

    (подробности см. на 1-ой странице)
     
  18. mega_t72

    mega_t72 New Member

    Публикаций:
    0
    Регистрация:
    3 ноя 2009
    Сообщения:
    9
    вобщем, кто хочет автоматизировать синхронизацию атомов в ресурсах DIALOG или DIALOGEX,
    может пользоваться вот такими несложными макросами:
    Код (Text):
    1. #define make_string( a )        #a
    2. #define make_class_atom( a )    make_string( \x23##a )
    нужно просто поместить эти макросы в ваши ресурсы (*.rc) и далее,
    уже можно назначать класс для диалога следующим образом:
    Код (Text):
    1. IDD_DIALOG DIALOGEX ...
    2. STYLE ...
    3. CAPTION "Dialog"
    4. CLASS mkatom( MY_CLASS_ATOM )
    нужно только не забывать, что строка имени сласса с использованием атома формируется из десятичного набора,
    поэтому объявление MY_CLASS_ATOM должно быть именно десятичным числом, например:
    Код (Text):
    1. #define MY_CLASS_ATOM 3
    или
    Код (Text):
    1. #define MY_CLASS_ATOM 48
    но ни как не:
    Код (Text):
    1. #define MY_CLASS_ATOM 0x30
    сами объявления атомов можно хранить как в resource.h, так и вне его, например в дополнительном хидере,
    только нужно тогда не забыть его подключить в самом ресурсе, в *.rc
    а программное обращение к этому атому должно быть таким же, как было показано ранее:
    Код (Text):
    1. WNDCLASSEX wcex;
    2. ...
    3. wcex.lpszClassName = MAKEINTRESOURCE( MY_CLASS_ATOM );
    4. ...
     
  19. mega_t72

    mega_t72 New Member

    Публикаций:
    0
    Регистрация:
    3 ноя 2009
    Сообщения:
    9
    упс, поправочка:
    Код (Text):
    1. ...
    2. IDD_DIALOG DIALOGEX ...
    3. STYLE ...
    4. CAPTION "Dialog"
    5. CLASS make_class_atom( MY_CLASS_ATOM )
    6. ...
     
  20. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    mega_t72, и спасибо ему за это, таки подтолкнул на некоторое расширение главки "14) Анализатор класса" (см. выше "Некоторые подробности о диалогах").

    К тому же одновременно в форуме поинтеоесовались странностью атома из RegisterClassEx,
    Iczelion-овский 22 урок "Суперклассинг" предъявил зависимость регистрации от манифеста,
    а васмовский поиск подбросил весьма подходящие подзабытые топики...

    Так что вот: выкладываю первую из нескольких намеченных учебных утилиток - WindowClassNameAtom.
    По задумке - это собрание тестов для практического прощупывания темы, в противовес теоретическим словесам по древу.

    Тем не менее, на неделе добавлю и текст: что-то вроде обозрения под рабочим названием "Window Class Name & Atom".