FASM: разные идентификаторы одного окна

Тема в разделе "WASM.BEGINNERS", создана пользователем SSERG, 21 сен 2005.

  1. SSERG

    SSERG New Member

    Публикаций:
    0
    Регистрация:
    23 июл 2005
    Сообщения:
    6
    Адрес:
    Russia
    Объясните почему при создании Win окошка идентификатор один (CreateWindowEx), а в WindowProc передаётся другой?

    Пользуюсь FASM 1.64

    Вот пример кода:


    Код (Text):
    1.  
    2.  
    3. ; Template for program using standard Win32 headers
    4.  
    5. format PE GUI 4.0
    6. entry start
    7.  
    8. include 'win32a.inc'
    9.  
    10. section '.data' data readable writeable
    11.  
    12.   _title db 'Win32 program template',0
    13.   _class db 'FASMWIN32',0
    14.  
    15.   wc WNDCLASS 0,WindowProc,0,0,NULL,NULL,NULL,COLOR_BTNFACE+1,NULL,_class
    16.  
    17.   msg MSG
    18.  
    19.   hWnd      dd  0         ;; Идентификатор нашего окна!!!!
    20.  
    21. section '.code' code readable executable
    22.  
    23.   start:
    24.  
    25.     invoke  GetModuleHandle,0
    26.     mov [wc.hInstance],eax
    27.     invoke  LoadIcon,0,IDI_APPLICATION
    28.     mov [wc.hIcon],eax
    29.     invoke  LoadCursor,0,IDC_ARROW
    30.     mov [wc.hCursor],eax
    31.     invoke  RegisterClass,wc
    32.  
    33.     invoke  CreateWindowEx,0,_class,_title,WS_VISIBLE+WS_DLGFRAME+WS_SYSME   NU,128,128,192,192,NULL,NULL,[wc.hInstance],NULL
    34.     mov [hWnd],eax         ;;  <--------- Идентификатор нашего окна!!!!
    35.  
    36.   msg_loop:
    37.     invoke  GetMessage,msg,NULL,0,0
    38.     or  eax,eax
    39.     jz  end_loop
    40.     invoke  TranslateMessage,msg
    41.     invoke  DispatchMessage,msg
    42.     jmp msg_loop
    43.  
    44.   end_loop:
    45.     invoke  ExitProcess,[msg.wParam]
    46. ;;===================================================================
    47.  
    48.  
    49.  
    50. ;;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++   +++++++++
    51. ;;===================================================================
    52.  
    53.  
    54.  
    55. proc WindowProc hwnd,wmsg,wparam,lparam
    56.     push    ebx esi edi
    57.  
    58.     cmp [wmsg],WM_CREATE
    59.     je  wmcreate
    60.     cmp [wmsg],WM_DESTROY
    61.     je  wmdestroy
    62.   defwndproc:
    63.     invoke  DefWindowProc,[hwnd],[wmsg],[wparam],[lparam]
    64.     jmp finish
    65. ;;===================================================================
    66.  
    67.  
    68.  
    69.   wmcreate:
    70.     mov eax,[hwnd]
    71.     cmp eax,[hWnd]
    72.     je  finish                  ;;  <---- Если равны, то сообщения НЕ БУДЕТ!
    73.     invoke  MessageBox,0,_class,_class,MB_OK
    74.     jmp finish
    75. ;;===================================================================
    76.  
    77.  
    78.  
    79.   wmdestroy:
    80.     invoke  PostQuitMessage,0
    81.     xor eax,eax
    82.   finish:
    83.     pop edi esi ebx
    84.     ret
    85. endp
    86. ;;===================================================================
    87.  
    88.  
    89.  
    90. ;;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++   +++++++++
    91. ;;===================================================================
    92.  
    93.  
    94.  
    95. section '.idata' import data readable writeable
    96.  
    97.   library kernel32,'KERNEL32.DLL',\
    98.       user32,'USER32.DLL'
    99.  
    100.   include 'apia\kernel32.inc'
    101.   include 'apia\user32.inc'
    102.  
    103.  
     
  2. electron

    electron New Member

    Публикаций:
    0
    Регистрация:
    26 май 2005
    Сообщения:
    32
    Попробуй так:

    вместо

    wmcreate:

    mov eax,[hwnd]

    ...

    поставь

    mov eax,hwnd

    ...
     
  3. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    electron

    Не шути так, это не масм.



    mov eax,hwnd - это mov eax,ebp+4
     
  4. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Если у тебя есть дочерние окна, то они тоже будут слать свой hwnd в WindowProc родителя. И они естественно будут отличаться от родительского. Поэтому и передаётся параметр hwnd в оконную процедуру, чтобы различать, от кого сообщение.