MASM добавление кнопок - Assembler

Узнай цену своей работы

Формулировка задачи:

Помогите пожалуйста! Только начинаю изучать ассемблер. Было обычное окно, my caption, хочу добавить кнопки, но ничего не появляется, почему? Вот сам код
.386
        .model flat,stdcall
  option   casemap:none
                        include C:\masm32\INCLUDE\WINDOWS.INC
                        include C:\masm32\INCLUDE\KERNEL32.INC 
                        include C:\masm32\INCLUDE\USER32.INC
                        include C:\masm32\INCLUDE\ADVAPI32.INC 
                        include   C:\masm32\INCLUDE\GDI32.INC                                                
                        include  my.inc
                                                                     
                        includelib C:\masm32\lib\comctl32.lib
                        includelib C:\masm32\lib\user32.lib
                        includelib C:\masm32\lib\gdi32.lib
                        includelib C:\masm32\lib\kernel32.lib                
                        includelib C:\masm32\lib\user32.lib
                        includelib C:\masm32\lib\advapi32.lib      
;###########################################################
MAIN_WINDOW_PROC     PROTO   :DWORD ,  :DWORD , :DWORD ,  :DWORD 
;###########################################################
;data--data--data--data--data--data--data--data--data--data--     PROC
;----------------------------------------------------------------------------------------------
.DATA
HINST        DWORD      NULL
HWND_WIN        DWORD     NULL
;-
String_CLASS              DB    "MY_WINDOW",0  
String_CAPTION             DB  "MY_CAPTION",0
;-
BUTTON_CLASS        DB    "BUTTON",0
EDIT_CLASS               DB     "EDIT",0
COMBO_CLASS          DB      "COMBOBOX",0
;-
BUTTON_NAME           DB     "MY_BUTTON",0
STRING_NULL             DB    0,0,0,0
MSG_WIN        MSG      <0>
 
EXTERN MessageBoxA@16:NEAR
;##############################################################
;code--code--code--code--code--code--code--code--code--code-- PROC
;--------------------------------------------------------------------------------------------------
.CODE  
START:
 
                invoke  GetModuleHandle  ,  Null 
                 mov    HINST   ,  EAX   
                    ;-        
                      CALL   MY_REGISTER_CLASS 
                      cmp   EAX  ,  null
                  je   EXIT
              ;-       
                invoke    CreateWindowEx   ,  Null  ,   addr    String_CLASS   ,  addr  String_CAPTION  , \
                        WS_VISIBLE +  WS_CAPTION  + WS_SYSMENU   ,   100 , 100 ,  500 ,  500  , \
                        NULL ,  NULL  ,  HINST ,  NULL  
                  ;-       
                  MOV   HWND_WIN  , EAX     
                  ;-    
                invoke  ShowWindow   ,  HWND_WIN   , TRUE  
                invoke  UpdateWindow ,  HWND_WIN      
                                                                  
          ;====================
MSG_LOOP:
               invoke   GetMessage  ,    addr  MSG_WIN  , null , null , null
               CMP   Eax  ,  FALSE
                JE    EXIT     
                
               invoke   TranslateMessage  ,   addr   MSG_WIN 
               invoke   DispatchMessage       , addr  MSG_WIN
                   JMP   MSG_LOOP
          ;==================== 
EXIT:     
             invoke               ExitProcess        ,       Null
;----------------------------------------------------------------------------------------------------------
;                                    GET   POINT  SCREEN                                                        
;---------------------------------------------------------------------------------------------------------- 
MY_REGISTER_CLASS  PROC   
local  _Struct_WNDCLASS : WNDCLASS  
;-
      Mov  _Struct_WNDCLASS.style               ,       NULL               ;  стиль  окна
            ;  Mov   Eax  ,  
      Mov  _Struct_WNDCLASS.lpfnWndProc       ,     MAIN_WINDOW_PROC   ; процедура окна
      Mov  _Struct_WNDCLASS.cbClsExtra     ,    null            ; дополнительная память для класса
      Mov  _Struct_WNDCLASS.cbWndExtra   ,   null            ; дополнительная память для  окна
              Mov   Eax  ,  HINST
      Mov  _Struct_WNDCLASS.hInstance     ,       Eax         ;  handle   приложения
 
      Mov  _Struct_WNDCLASS.lpszMenuName     ,    NULL   ;  идентификатор меню
      Mov  _Struct_WNDCLASS.lpszClassName   ,     offset  String_CLASS  ;   адрес строки класса
   ;-
            invoke   LoadIcon  ,   NULL  ,    IDI_ASTERISK                   
      Mov  _Struct_WNDCLASS.hIcon       ,      Eax
         ;-
            invoke   LoadCursor  ,  NULL  ,   IDC_IBEAM
      Mov  _Struct_WNDCLASS.hCursor      ,   Eax
         ;-
            invoke   CreateSolidBrush  ,  0012FFffh                       ;  возвратит идентификатор  кисти
      Mov  _Struct_WNDCLASS.hbrBackground     ,  Eax
;==============   
          invoke  RegisterClassA        ,   addr     _Struct_WNDCLASS             
;==============  
ret  
MY_REGISTER_CLASS   ENDP
;---------------------------------------------------------------------------------------------------------------------------
;                                           WINDOW        PROCEDURE                                                              
;---------------------------------------------------------------------------------------------------------------------------
MAIN_WINDOW_PROC     PROC   USES  EBX   ESI  EDI  \
                                      hWnd_  :DWORD , MESG :DWORD , wParam :DWORD ,  lParam:DWORD 
;-
                                                     
                                            CMP     MESG    ,     WM_DESTROY
                                      JE      WMDESTROY     
;----                                         
               invoke   DefWindowProc ,  hWnd_   ,   MESG  ,  wParam , lParam  
               jmp      FINISH
;----   
WMCREATE: ; отсюда создание кнопок
                         
invoke    CreateWindowEx   ,  NULL ,    addr    BUTTON_CLASS   , \
                                                                                addr  BUTTON_NAME  , \
                        WS_CHILD + WS_VISIBLE ,   20 , 20 , 120 ,40 , \
                        hWnd_  ,  NULL  ,  HINST ,  NULL    
                    ;-       
                  invoke    CreateWindowEx   ,  WS_EX_CLIENTEDGE ,    addr    EDIT_CLASS   , \
                                                                                addr   STRING_NULL   , \
                        WS_CHILD + WS_VISIBLE ,   20 , 100 ,  200 ,  20  , \
                        hWnd_  ,  NULL  ,  HINST ,  NULL    
                    ;-       
                  invoke    CreateWindowEx   ,  NULL ,    addr    COMBO_CLASS   , \
                                                                                addr   STRING_NULL   , \
                        WS_CHILD + WS_VISIBLE + CBS_DROPDOWN    ,   20 , 150,  200 ,  200  , \
                        hWnd_  ,  NULL  ,  HINST ,  NULL    
                                                     ;
                     jmp        FINISH                                      
WMDESTROY:
              invoke    PostQuitMessage ,  False
 
;- 
FINISH:
RET  16                                           
MAIN_WINDOW_PROC     ENDP
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
END  START
Заранее спасибо!

Решение задачи: «MASM добавление кнопок»

textual
Листинг программы
CMP MESG, WM_CREATE
JE WMCREATE

Объяснение кода листинга программы

  1. MESG - это переменная, которая содержит сообщение, связанное с созданием окна.
  2. WM_CREATE - это константа, которая указывает на сообщение, связанное с созданием окна.
  3. WMCREATE - это метка, которая указывает на начало кода, выполняемого при создании окна.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4.125 из 5