Собственный класс дочернего окна

Тема в разделе "WASM.WIN32", создана пользователем AlKuzVik, 6 дек 2009.

  1. AlKuzVik

    AlKuzVik New Member

    Публикаций:
    0
    Регистрация:
    8 июн 2008
    Сообщения:
    9
    Собственно, правильно ли я создаю класс?

    Почему-то нет сообщений WM_PAINT в процедуре дочернего окна.
    Идет только одно сообщение при запуске.
     
  2. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Все правильно. Несколько замечаний:
    1) После RegisterClassEx правильнее проверять регистр ax а не eax.
    2) В RegExtClass почему lea ebx, [wbc]/mov dword [ebx+4], eax? mov [wbc.lpfnWndProc], eax и т.п.
    3) invoke UpdateWindow,[hwnd]

    вызовет отправку WM_PAINT только в том случае, если окно имеет область, необходимую для обновления. Если окно ничем не перекрывалось, не выдвигалось за границы экрана и т.п., области для обновления не будет. Чтобы вручную установить область для обновления, нужно вызвать invoke InvalidateRect, [hwnd], 0, TRUE. После этого, можно вызвать UpdateWindow для немедленной отправки WM_PAINT окну, либо не вызывать, в этом случае WM_PAINT придет тогда, когда не будет никаких других сообщений в очереди окна.

    ЗЫ
    Вызов InvalidateRect в таком случае может вызвать мерцание окна.
     
  3. AlKuzVik

    AlKuzVik New Member

    Публикаций:
    0
    Регистрация:
    8 июн 2008
    Сообщения:
    9
    Не совсем понял, почему? я же проверяю на 0

    По 2 пункту - это я запарил :)

    InvalidateRect - я думал она не работает должным образом, а оказывается локальная переменная draw глючит. перенес draw в глобальную - все отлично. Скорей вссего дело в фасме (1.69.10)
    Думаю с этим можно справится.
    Вообще, каким образом это делается в стандартных контролах винды (кнопки и т.д.) ?

    и еще вопрос

    в CreateWindowEx я передаю указатель на lpWindowName, и как бы этот указатель поймать в функции окна для отрисовки текста. А то как-то по идиотски получается:
    Код (Text):
    1. lea     eax,[text]
    2. invoke  SendMessage,[hwnd],WM_GETTEXT,100h,eax
     
  4. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Потому что эта функция возвращает результат в ax, а не в eax. Старшая часть регистра eax может быть не равна нулю.

    Она не глючит, это обычное поведение локальных переменных. Их значения портятся между вызовами процедуры.
    Соответственно, фасм тут ни при чем :)

    Этот указатель передается в структуру CREATESTRUCT, указатель на которую передается процедуре окна при отправке WM_CREATE (через lParam или wParam не помню).
    Можно сохранить этот текст в глобальной переменной, но если нужно создавать несколько окон с разным текстом, следует почитать о WNDCLASS.cbWndExtra и SetWindowLong и SetWindowProp. Это позволит сохранять индивидуальные данные для каждого созданного окна. Так это и делается в стандартных элементах управления.

    icq 4665З299О пиши, все равно нечем заняться...
     
  5. AlKuzVik

    AlKuzVik New Member

    Публикаций:
    0
    Регистрация:
    8 июн 2008
    Сообщения:
    9
    Точно, я и забыл что с окном работаю :)

    почитаю, спасибо