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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.10.2023, 19:23   #1
максхи
Пользователь
 
Регистрация: 20.12.2021
Сообщений: 59
По умолчанию Как передаётся сообщение окна? MASM

Вот секция code кода из учебника:
Код:
.CODE
start:
    invoke GetModuleHandle, NULL
    mov    hInstance,eax
    invoke GetCommandLine
    mov CommandLine,eax
    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_WINDOW+1
    mov   wc.lpszMenuName,NULL
    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,NULL,ADDR ClassName,ADDR AppName,\
           WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\

           CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,\
           hInst,NULL
    mov   hwnd,eax
    invoke ShowWindow, hwnd,SW_SHOWNORMAL
    invoke UpdateWindow, hwnd
        .WHILE TRUE
               invoke GetMessage, ADDR msg,NULL,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
    LOCAL hdc:HDC
    LOCAL ps:PAINTSTRUCT
    LOCAL rect:RECT
    .IF uMsg==WM_DESTROY
        invoke PostQuitMessage,NULL
    .ELSEIF uMsg==WM_PAINT
        invoke BeginPaint,hWnd, ADDR ps
        mov    hdc,eax
        invoke GetClientRect,hWnd, ADDR rect
        invoke DrawText, hdc,ADDR OurText,-1, ADDR rect, \
                DT_SINGLELINE or DT_CENTER or DT_VCENTER
        invoke EndPaint,hWnd, ADDR ps
    .ELSE
        invoke DefWindowProc,hWnd,uMsg,wParam,lParam
        ret
    .ENDIF
    xor   eax, eax
Но я не понимаю, когда в umsg передаётся WM_PAINT.
Это должно происходить в invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg, похоже судя по другому коду.
Но непонятно, как.
В этой строке это задаётся
Код:
mov   wc.lpfnWndProc, OFFSET WndProc
?
максхи вне форума Ответить с цитированием
Старый 10.10.2023, 20:07   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
Сообщение от максхи Посмотреть сообщение
Это должно происходить в invoke TranslateMessage, ADDR msg
Не должно.
Цитата:
Translates virtual-key messages into character messages. The character messages are posted to the calling thread's message queue, to be read the next time the thread calls the GetMessage or PeekMessage function.
Цитата:
Сообщение от максхи Посмотреть сообщение
invoke DispatchMessage, ADDR msg, похоже судя по другому коду.
Именно.
Цитата:
Dispatches a message to a window procedure. It is typically used to dispatch a message retrieved by the GetMessage function.
Цитата:
Но непонятно, как.
По hwnd берет класс окна, из класса берет
Код:
lpfnWndProc
и вызывает
p51x вне форума Ответить с цитированием
Старый 14.10.2023, 21:46   #3
максхи
Пользователь
 
Регистрация: 20.12.2021
Сообщений: 59
По умолчанию

У одногруппника такой код:
Код:
.ELSEIF uMsg==WM_CREATE
        invoke CreateWindowEx, WS_EX_CLIENTEDGE, addr EditClass, 0,\
                WS_CHILD or WS_VISIBLE or WS_BORDER or ES_LEFT,\
                20, 30, 280, 25, hWnd, Edit_1, hInstance, 0
        mov hEdit_1, eax
        invoke SetFocus, hEdit_1
        invoke CreateWindowEx, 0, addr ButtonClass, addr ButtonText_1,\
                WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON,\
                80, 120, 160, 25, hWnd, Button_1, hInstance, 0
        mov hButton_1, eax
    .ELSEIF uMsg==WM_COMMAND
        mov eax, wParam
        ;(код обработки строк и вывода вырезал)
        .ENDIF
То есть вопрос: от чего зависит, WM_PAINT или WM_CREATE будет в umsg?
максхи вне форума Ответить с цитированием
Старый 14.10.2023, 22:26   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

От того, что происходит, естественно.
WM_CREATE
Цитата:
Sent when an application requests that a window be created by calling the CreateWindowEx or CreateWindow function. (The message is sent before the function returns.) The window procedure of the new window receives this message after the window is created, but before the window becomes visible.
WM_PAINT
Цитата:
The WM_PAINT message is sent when the system or another application makes a request to paint a portion of an application's window. The message is sent when the UpdateWindow or RedrawWindow function is called, or by the DispatchMessage function when the application obtains a WM_PAINT message by using the GetMessage or PeekMessage function.
p51x вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не работает функция Отправить сообщение и изменение цвета окна Anonymous4722 WPF, UWP, WinRT, XAML 0 17.05.2020 13:22
Оконная процедура не получает сообщение о выходе мыши за пределы окна taras-proger Общие вопросы C/C++ 1 12.11.2014 20:39
Assembler под Windows (MASM32). Вывод массива в Edit диалогового окна используя WinAPI или функций MASM munthrekosh Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 04.06.2013 04:03
Тупая проблема - переменная не передаётся! delphicoding БД в Delphi 9 06.10.2011 14:26
Сообщение окна Alex Cones Помощь студентам 0 22.10.2010 10:11