Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.11.2015, 12:37   #1
nactyx
Форумчанин
 
Регистрация: 11.10.2010
Сообщений: 152
По умолчанию Окно с несколькими кнопками

Доброго времени суток!
Нужна помощь в объяснении кода и небольшом изменении.

Код:
    .386
    .model flat,stdcall
    option casemap:none
    include \masm32\include\windows.inc
    include \masm32\include\user32.inc
    include \masm32\include\kernel32.inc
    include \masm32\include\gdi32.inc
    include \masm32\include\comdlg32.inc
    include \masm32\include\shell32.inc
    includelib \masm32\lib\user32.lib
    includelib \masm32\lib\kernel32.lib
    includelib \masm32\lib\gdi32.lib
    includelib \masm32\lib\comdlg32.lib
    includelib \masm32\lib\shell32.lib
WinMain proto :DWORD,:DWORD,:DWORD,:DWORD
RGB macro red,green,blue
    xor     eax,eax
    mov     ah,blue
    shl     eax,8
    mov     ah,green
    mov     al,red
endm
szText MACRO Name,Text:VARARG
    LOCAL   lbl
    jmp     lbl
    Name    db Text,0
    lbl:
ENDM
.const
Button1ID       equ 1
.data?
hwndButton1     HWND ?
hInstance       HINSTANCE ?
CommandLine     LPSTR ?
.data
TextButton1     db "Button1",0
;_______________
ClassName       db "mbuilder",0
BtnClName       db "button",0
FormCaption     db "Form",0
;_______________
.code
start:
    invoke  GetModuleHandle,NULL
    mov     hInstance,eax
    invoke  GetCommandLine
    invoke  WinMain,hInstance,NULL,CommandLine,SW_SHOWDEFAULT
    invoke  ExitProcess,eax
WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
LOCAL wc    :WNDCLASSEX
LOCAL msg   :MSG
LOCAL hwnd  :HWND
    mov     wc.cbSize,SIZEOF WNDCLASSEX
    mov     wc.style,CS_HREDRAW or CS_VREDRAW
    mov     wc.lpfnWndProc,offset WndProc
    mov     wc.cbClsExtra,NULL
    mov     wc.cbWndExtra,NULL
    push    hInst
    pop     wc.hInstance
    mov     wc.hbrBackground,COLOR_BTNFACE+1
    mov     wc.lpszClassName,OFFSET ClassName
    invoke  LoadIcon,NULL,IDI_APPLICATION
    mov     wc.hIcon,eax
    mov     wc.hIconSm,eax
    invoke  LoadCursor,NULL,IDC_ARROW
    mov     wc.hCursor,eax
    invoke  RegisterClassEx,addr wc
invoke CreateWindowEx,0,ADDR ClassName,ADDR FormCaption,WS_SYSMENU or WS_SIZEBOX,448,84,384,291,0,0,hInst,0
    mov     hwnd,eax
    INVOKE  ShowWindow,hwnd,SW_SHOWNORMAL
    INVOKE  UpdateWindow,hwnd
    .WHILE TRUE
        invoke  GetMessage,ADDR msg,0,0,0
        .BREAK .IF (!eax)
        invoke  TranslateMessage,ADDR msg
        invoke  DispatchMessage,ADDR msg
    .ENDW
    mov eax,msg.wParam
    ret
WinMain endp
WndProc proc hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
    .IF uMsg == WM_DESTROY
        invoke  PostQuitMessage,NULL
    .ELSEIF uMsg == WM_CREATE
invoke CreateWindowEx,0,ADDR BtnClName,ADDR TextButton1,WS_CHILD or BS_DEFPUSHBUTTON or 

WS_VISIBLE,128,104,75,25,hWnd,Button1ID,hInstance,0
        mov     hwndButton1,eax
    .ELSEIF uMsg == WM_COMMAND
        mov eax,wParam
        .IF lParam != 0
            .IF ax == Button1ID
                shr eax,16
                .IF ax == BN_CLICKED
                    invoke  ExitProcess, 0
                .ENDIF
            .ENDIF
        .ENDIF
    .ELSE
        invoke  DefWindowProc,hWnd,uMsg,wParam,lParam
        ret
    .ENDIF
    xor     eax,eax
    ret
WndProc endp
end start
Тут обычное окно с кнопкой Button1. Необходимо сюда добавить еще две кнопки, Button2 и Button3. На Button3 - выход. А на две первые - запуск, например, notepad.exe. Реально такое сделать?

И еще вопрос, для понимания: какой именно кусок кода отвечает за клик по button1?
Этот или чуть больше/меньше кусок кода:
Код:
WS_VISIBLE,128,104,75,25,hWnd,Button1ID,hInstance,0
        mov     hwndButton1,eax
    .ELSEIF uMsg == WM_COMMAND
        mov eax,wParam
        .IF lParam != 0
            .IF ax == Button1ID
                shr eax,16
                .IF ax == BN_CLICKED
                    invoke  ExitProcess, 0
                .ENDIF
            .ENDIF
        .ENDIF
    .ELSE
        invoke  DefWindowProc,hWnd,uMsg,wParam,lParam
        ret
    .ENDIF

Последний раз редактировалось nactyx; 27.11.2015 в 12:40.
nactyx вне форума Ответить с цитированием
Старый 27.11.2015, 12:41   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну реально... invoke CreateWindowEx,0,ADDR BtnClNamе видишь?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 27.11.2015, 12:42   #3
nactyx
Форумчанин
 
Регистрация: 11.10.2010
Сообщений: 152
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Ну реально... invoke CreateWindowEx,0,ADDR BtnClNamе видишь?
Конечно вижу. Дальше?

Последний раз редактировалось nactyx; 27.11.2015 в 12:58.
nactyx вне форума Ответить с цитированием
Старый 27.11.2015, 13:08   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Это функция создания окна. Кнопка - это окно (тоже), поэтому по аналогии с этим примером сделай столько кнопок сколько нужно. Координаты только там подмени.
А потом и обработчики можно поописать.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 27.11.2015, 13:12   #5
nactyx
Форумчанин
 
Регистрация: 11.10.2010
Сообщений: 152
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Это функция создания окна. Кнопка - это окно (тоже), поэтому по аналогии с этим примером сделай столько кнопок сколько нужно. Координаты только там подмени.
А потом и обработчики можно поописать.
А сам обработчик где именно начинается и заканчивается в этом примере?
nactyx вне форума Ответить с цитированием
Старый 27.11.2015, 13:27   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Дык вся WndProc от начала и до конца - и есть обработчик.
Ты жеж смотри: OnCreate
Код:
...
.ELSEIF uMsg == WM_CREATE
invoke CreateWindowEx,0,ADDR BtnClName,ADDR TextButton1,WS_CHILD or BS_DEFPUSHBUTTON or 

WS_VISIBLE,128,104,75,25,hWnd,Button1ID,hInstance,0
        mov     hwndButton1,eax
...
Вот тебе границы обработчиков от ELSEIF до следующего ELSEIF.
Ты в курсе как в WinAPI описывается оконная программа? Базовые основы по обработке сообщений у тебя есть?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 27.11.2015, 13:28   #7
nactyx
Форумчанин
 
Регистрация: 11.10.2010
Сообщений: 152
По умолчанию

Вроде получилось.
Теперь два момента: когда .exe запускаю, кроме моего окна, появляется еще окно командой строки, это нормально или этого можно избежать?
И второй: как описать обработчик на запуск какого-нибудь системного .exe а-ля notepad.exe
Изображения
Тип файла: png 1.png (3.3 Кб, 62 просмотров)
Тип файла: jpg 2.jpg (8.3 Кб, 112 просмотров)
nactyx вне форума Ответить с цитированием
Старый 27.11.2015, 13:36   #8
nactyx
Форумчанин
 
Регистрация: 11.10.2010
Сообщений: 152
По умолчанию

Допустим в качестве практики я хочу сделать, чтобы по нажатию на любую кнопку можно было осуществить выход.

Код:
...
        mov     hwndButton1,eax
    .ELSEIF uMsg == WM_COMMAND
        mov eax,wParam
        .IF lParam != 0
            .IF ax == Button1ID
                shr eax,16
                .IF ax == BN_CLICKED
                    invoke  ExitProcess, 0
                .ENDIF
            .ENDIF
        .ENDIF
        mov     hwndButton2,eax
    .ELSEIF uMsg == WM_COMMAND
        mov eax,wParam
        .IF lParam != 0
            .IF ax == Button2ID
                shr eax,16
                .IF ax == BN_CLICKED
                    invoke  ExitProcess, 0
                .ENDIF
            .ENDIF
        .ENDIF
        mov     hwndButton3,eax
    .ELSEIF uMsg == WM_COMMAND
        mov eax,wParam
        .IF lParam != 0
            .IF ax == Button3ID
                shr eax,16
                .IF ax == BN_CLICKED
                    invoke  ExitProcess, 0
                .ENDIF
            .ENDIF
        .ENDIF
...
Т.о. стала работать только первая кнопка. Почему?
nactyx вне форума Ответить с цитированием
Старый 27.11.2015, 13:49   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
это нормально или этого можно избежать?
Та не... Этого быть не должно. Это значит ты тип проекта как консоль выбрал...
А нужен неконсольный проект, который в РЕ заголовке прописывает, что эта программа не работает как консоль.
Цитата:
стала работать только первая кнопка. Почему?
Код:
...
        mov     hwndButton1,eax
    .ELSEIF uMsg == WM_COMMAND
        mov eax,wParam
        .IF lParam != 0
             push eax
             shr eax,16
            .IF ax == BN_CLICKED
                mov eax,wParam
               .IF ax == Button1ID
                    invoke  ExitProcess, 0
               .ELSEIF ax == Button2ID
                    Кликнута вторая
               .ELSEIF ax == Button3ID
                   Кликнута третья
                .ENDIF

            .ENDIF
        
        .ENDIF
 
...
Это если я правильно помню.
I'm learning to live...

Последний раз редактировалось Stilet; 27.11.2015 в 13:54.
Stilet вне форума Ответить с цитированием
Старый 27.11.2015, 14:03   #10
nactyx
Форумчанин
 
Регистрация: 11.10.2010
Сообщений: 152
По умолчанию

Вот так правильно получилось:
Код:
    .ELSEIF uMsg == WM_COMMAND
        mov eax,wParam
        .IF lParam != 0
            .IF ax == Button1ID
                shr eax,16
                .IF ax == BN_CLICKED
                    invoke  ExitProcess, 0
                .ENDIF
            .ENDIF
		.IF ax == Button2ID
                shr eax,16
                .IF ax == BN_CLICKED
                    invoke  ExitProcess, 0
                .ENDIF
            .ENDIF
		.IF ax == Button3ID
                shr eax,16
                .IF ax == BN_CLICKED
                    invoke  ExitProcess, 0
                .ENDIF
            .ENDIF
        .ENDIF
Осталось понять как сделать не консоль и запуск .exe
nactyx вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Панель с кнопками. Kozlov Помощь студентам 1 09.07.2015 22:16
Проблема с кнопками countteran Помощь студентам 2 15.11.2011 23:35
Непонятки с кнопками Devoto Общие вопросы Delphi 2 16.11.2008 20:47
Окно с кнопками ппц полный Droid Win Api 1 30.10.2008 07:29
проблема с кнопками blackstersl Общие вопросы Delphi 3 12.10.2008 14:31