Поиск:

Ответ в темуСоздание новой темы Создание опроса
> События WM_CHAR не обрабатываются 
:(
    Опции темы
cdman
Дата 28.12.2010, 23:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 1.2.2009
Где: Новосибирск

Репутация: нет
Всего: нет



Привет всем, вот опять запарился с очередной проблемой.

В отладчике стоп ставлю на cmp KeyboardChar,dword ptr 0dh   jnz WWE и никогда Z флаг не 1 !  Чего может быть ? Enter жму и тишина ...
    .686P
    .model flat,stdcall
    option casemap:none
    include C:\masm32\INCLUDE\ADVAPI32.INC 
    include C:\masm32\include\windows.inc
    include C:\masm32\include\user32.inc
    include C:\masm32\include\kernel32.inc
    include C:\masm32\include\gdi32.inc
    include C:\masm32\include\comdlg32.inc
    include C:\masm32\include\shell32.inc
    include C:\masm32\include\masm32.inc
    includelib C:\masm32\lib\user32.lib
    includelib C:\masm32\lib\kernel32.lib
    includelib C:\masm32\lib\gdi32.lib
    includelib C:\masm32\lib\comdlg32.lib
    includelib C:\masm32\lib\shell32.lib
    includelib C:\masm32\lib\masm32.lib
    includelib C:\masm32\lib\advapi32.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
.const
NULL equ 0
TRUE equ 1
FALSE equ 0
COLOR_BLACK        equ 0
.data?

KeyboardChar    WPARAM ?
hWndNumberTrade    HWND ?
hInstance        HINSTANCE ?
CommandLine        LPSTR ?
hBrushBkNumberTrade    dd ?
hGreyBrushBkNumberTrade    dd ?
hBlackBrushBkNumberTrade    dd ?
.data
LenNumber    dd 0
TextNumberTrade    db 0
ClassName        db "Base",0
StatClName        db "static",0
EditClName        db "edit",0
FormCaption        db "Form",0
.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
        xor        eax,eax
invoke CreateSolidBrush,eax
    mov        wc.hbrBackground,eax
    mov        wc.cbSize,SIZEOF WNDCLASSEX
    mov        wc.style,CS_BYTEALIGNCLIENT
    mov        wc.lpfnWndProc,offset WndProc
    mov        wc.cbClsExtra,NULL
    mov        wc.cbWndExtra,NULL
    push    hInst
    pop        wc.hInstance
    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
    mov        wc.lpszMenuName,0
invoke RegisterClassEx,addr wc
invoke CreateWindowEx,WS_EX_TOPMOST,ADDR ClassName,ADDR FormCaption,WS_CAPTION or WS_SYSMENU or WS_MINIMIZEBOX,312,308,717,78,0,0,hInst,0
    mov        hWnd,eax

invoke ShowWindow,hWnd,TRUE
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 DeleteObject,hGreyBrushBkNumberTrade
invoke DeleteObject,hBlackBrushBkNumberTrade
invoke PostQuitMessage,NULL

    .ELSEIF uMsg == WM_CREATE
;Edit NumberTrade
                mov    eax,eax
                invoke        CreateWindowEx,0,ADDR EditClName,ADDR TextNumberTrade,WS_CHILD or WS_VISIBLE or ES_NUMBER or WS_BORDER,0,0,47,23,hWnd,1,hInstance,0
                mov            hWndNumberTrade,eax
;Устанавливаем максимальное кол-во симолов в байтах
                invoke        SendMessage,hWndNumberTrade,EM_LIMITTEXT,3,0
;Создаём кисти
                xor            eax,eax
                invoke        CreateSolidBrush,eax
                mov            hBlackBrushBkNumberTrade,eax
                RGB            100,100,100
                invoke        CreateSolidBrush,eax
                mov            hGreyBrushBkNumberTrade,eax
                mov            hBrushBkNumberTrade,eax
;Устанавливаем фокус на Edit NumberTrade
                invoke        SetFocus,hWndNumberTrade

                invoke        RedrawWindow,hWndNumberTrade,0,0,RDW_INVALIDATE

.ELSEIF uMsg == WM_CHAR ;102h

                mov            eax,lParam
                cmp            eax,hWndNumberTrade
                jnz            WM_CHAR_Exit
                
                push        wParam
mov    ecx,wParam
mov    edx,lParam
                pop        KeyboardChar
;                invoke        RedrawWindow,hWndNumberTrade,0,0,RDW_INVALIDATE
WM_CHAR_Exit:

.ELSEIF uMsg == WM_CTLCOLOREDIT
                cmp            KeyboardChar,dword ptr 0dh
                jnz            YY

                xor            eax,eax
                invoke        ExitProcess,eax

YY:                mov            eax,lParam
                cmp            eax,hWndNumberTrade
                jnz            WM_CTLCOLOREDIT_Exit
;Назначаем цвет фона Edit'а
                invoke        SelectObject,wParam,hBrushBkNumberTrade
                invoke        SetTextColor,wParam,0000ff00h ;0033FF67h
                invoke        SetBkColor,wParam,TRANSPARENT            ;У шрифта фон не нужен
                mov            eax,hBrushBkNumberTrade                        ;Кладём в eax хендл кисти, который мы хотим применить к цвету фона
WM_CTLCOLOREDIT_Exit:


.ELSEIF uMsg == WM_COMMAND
                cmp            KeyboardChar,dword ptr 0dh
                jnz            WWE

                xor            eax,eax
                invoke        ExitProcess,eax
                
                
WWE:                mov            eax,lParam
                cmp            eax,hWndNumberTrade
                jnz            WM_COMMAND_Exit

                cmp            KeyboardChar,0dh
                jnz            EM4

                xor            eax,eax
                invoke        ExitProcess,eax

;                invoke        GetAsyncKeyState,0Dh ;проверяем не нажата ли клавиша Enter
;                shl            eax,1 ;cmp            eax, -32767d
;                jnc            EM4
;PushingEnter
        ;        xor    eax,eax
        ;        invoke ExitProcess,eax
                
EM4:                
;Проверяем, какая длина введёного номера в Edit NumberTrade
        ;        mov            eax,hWndNumberTrade  ;?
                invoke        GetWindowTextLength,eax ;hWndNumberTrade
                mov            LenNumber,eax
                or            eax,eax
                jz            EM1

                mov            eax,hBlackBrushBkNumberTrade
                cmp            eax,hBrushBkNumberTrade                
                jz            EM3
                jnz            EM2

EM1:            mov            eax,hGreyBrushBkNumberTrade
                cmp            eax,hBrushBkNumberTrade
                jz            EM3

EM2:            mov            hBrushBkNumberTrade,eax
                push eax
                invoke        RedrawWindow,hWndNumberTrade,0,0,RDW_INVALIDATE
                pop eax
                
EM3:
WM_COMMAND_Exit:

    .ELSE
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
        ret
    .ENDIF
        xor        eax,eax
        ret
WndProc endp
end start

Кстати, это прога не работает под Семёркой, поле редактирования чёрное ! У меня Семёрки нет, так бы в отладчике я быстро допёр, почему Edit некорректно отображается. Может кто попробует разобраться с этим косячком ?

Если можно обойтись без сабклассинга, то было бы круто ! У кого какие мысли ?
Кому охота повозиться, вот мой скайп: cdman__x


Это сообщение отредактировал(а) cdman - 29.12.2010, 01:46
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для Windows/DOS"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для Windows/Dos | Следующая тема »


 




[ Время генерации скрипта: 0.0473 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.