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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.12.2009, 17:37   #1
cdman
Пользователь
 
Регистрация: 23.05.2009
Сообщений: 32
По умолчанию Не работает освежение окна

Немножко укоротил листинг.
Запутался совсем, вот последовательность действий :
; Регистрируем класс окна
...
...
CALL RegisterClassA@4
; создать окно зарегистрированного класса
...
...
CALL CreateWindowExA@48
...
...
CALL ShowWindow@8; показать созданное окно

CALL UpdateWindow@4 ; команда перерисовать видимую часть окна, сообщение WM_PAINT

; петля обработки сообщений
MSG_LOOP:
PUSH 0
PUSH 0
PUSH 0
PUSH OFFSET MSG
CALL GetMessageA@16
CMP EAX, 0
JE END_LOOP
PUSH OFFSET MSG
CALL TranslateMessage@4
PUSH OFFSET MSG
CALL DispatchMessageA@4
JMP MSG_LOOP
END_LOOP:
...
...
call ExitProcess

; процедура окна
WNDPROC PROC
PUSH EBP
MOV EBP, ESP
PUSH EBX
PUSH ESI
PUSH EDI
CMP DWORD PTR [EBP+0CH], WM_DESTROY
JE WMDESTROY
CMP DWORD PTR [EBP+0CH], WM_CREATE
JE WMCREATE

cmp DWORD PTR [EBP+0CH],WM_PAINT
je WMPAINT

CMP DWORD PTR [EBP+0CH] ,WM_LBUTTONDOWN ;левая кнопка
JE LBUTTON
CMP DWORD PTR [EBP+0CH] ,WM_RBUTTONDOWN ;правая кнопка
JE RBUTTON
JMP DEFWNDPROC

WMPAINT:
;--------------------------
push OFFSET PNT
PUSH DWORD PTR [EBP+08H]
CALL BeginPaint@8
PUSH EAX ;Сохранить контекст (дескриптор)
;------------------------ цвет фона = цвет окна
PUSH RGBW
PUSH EAX
CALL SetBkColor@8
;------------------------ контекст
POP EAX
PUSH EAX
;------------------------ цвет текста (красный)
PUSH RGBT
PUSH EAX
CALL SetTextColor@8
;------------------------ контекст
POP EAX
;------------------------ вывести текст
PUSH OFFSET MyStatusBar
CALL LENSTR
PUSH EBX ;Длина строки.
PUSH OFFSET MyStatusBar ;Адрес строки.
PUSH YT ;Y
PUSH XT ;X
PUSH EAX ;Контекст окна.
CALL TextOutA@20

;--------------------------
PUSH OFFSET PNT
PUSH DWORD PTR [EBP+08H]
CALL BeginPaint@8
MOV HDC,EAX ;Сохранить контекст (дескриптор)
;Скопировать виртуальное окно на реальное.
PUSH 0CC0020h ;SRCCOPY=Изображение как есть
PUSH 0 ;у источника.
PUSH 0 ;х источника.
PUSH MEMDC ;Контекст источника.
PUSH YM ;Высота куда.
PUSH XM ;Ширина куда.
PUSH 0 ;у куда.
PUSH 0 ;х куда.
PUSH HDC ;Контекст куда.
CALL BitBlt@36



;------------------------ закрыть
PUSH OFFSET PNT
PUSH DWORD PTR [EBP+08H]
CALL EndPaint@8
; --------------------------------------------------
MOV EAX, 0
JMP FINISH
; нажатие правой кнопки приводит к закрытию окна
RBUTTON:
JMP WMDESTROY
; нажатие левой кнопки мыши
LBUTTON:
; выводим сообщение
PUSH 0 ; МВ_ОК
PUSH OFFSET CAP
PUSH OFFSET MES1
PUSH DWORD PTR [EBP+08H]
call MessageBoxA@16
MOV EAX, 0
JMP FINISH
WMCREATE:
;Создать окно-кнопку.
PUSH 0
PUSH [HINST]
PUSH 0
PUSH DWORD PTR [EBP+08H]
PUSH 20 ;DY
PUSH 80 ;DX
PUSH 10 ;Y
PUSH 10 ;X
PUSH STYLBTN
PUSH OFFSET CPBUT ;Имя окна.
PUSH OFFSET CLSBUTN ;Имя класса.
PUSH 0
CALL CreateWindowExA@48
MOV HWNDBTN,EAX ;Запомнить дескриптор кнопки.
cdman вне форума Ответить с цитированием
Старый 14.12.2009, 17:37   #2
cdman
Пользователь
 
Регистрация: 23.05.2009
Сообщений: 32
По умолчанию

;Создать окно редактирования.
PUSH 0
PUSH [HINST]
PUSH 0
PUSH DWORD PTR [EBP+08H]
PUSH 20 ;DY
PUSH 350 ;DX
PUSH 50 ;Y
PUSH 10 ;X
PUSH STYLEDT
PUSH OFFSET CPEDT ;Имя окна.
PUSH OFFSET CLSEDIT ;Имя класса.
PUSH 0
CALL CreateWindowExA@48
MOV HWNDEDT,EAX
;Поместить строку в окно редактирования.

lea eax,MyCommandLine
PUSH eax
PUSH 0
PUSH WM_SETTEXT
PUSH HWNDEDT
CALL SendMessageA@16

;Установить фокус на окне редактирования.
push HWNDEDT
call SetFocus@4

;Размеры экрана.
PUSH 0 ;X
CALL GetSystemMetrics@4
MOV XM,EAX
PUSH 1 ;Y
CALL GetSystemMetrics@4
MOV YM,EAX
;Открыть контекст окна.
PUSH DWORD PTR [EBP+08H]
CALL GetDC@4
MOV HDC,EAX
;Создать совместимый с данным окном контекст.
PUSH EAX
CALL CreateCompatibleDC@4
MOV MEMDC,EAX
;Создать в памяти растровое изображение, совместимое с hdc.
PUSH YM
PUSH XM
PUSH HDC
CALL CreateCompatibleBitmap@12
;Выбрать растровое изображение в данном контексте.
PUSH EAX
PUSH MEMDC
CALL SelectObject@8
;Цвет кисти
PUSH RGBW
CALL CreateSolidBrush@4 ;Создать кисть.
;Выбрать кисть в данном контексте.
PUSH EAX
PUSH MEMDC
CALL SelectObject@8
;Замкнутая фигура - прямоугольник.
;Вначале выбрать кисть для заполнения области.
PUSH HBRUSH
PUSH MEMDC
CALL SelectObject@8
;Теперь рисуем заполненный прямоугольник.
;Если не выбирать кисть, то будет нарисован незаполненный прямоугольник.
PUSH 350
PUSH 400
PUSH 200
PUSH 200
PUSH MEMDC
CALL Rectangle@20

;Заполнить данную прямоугольную область.
PUSH 0F00021h ;PATCOPY=заполнить данным цветом.
PUSH YM
PUSH XM
PUSH 0
PUSH 0
PUSH MEMDC
CALL PatBlt@24
;Создать кисть и перо для рисования.
PUSH RGBR
CALL CreateSolidBrush@4 ;Создать кисть.
MOV HBRUSH,EAX
;Задать перо.
PUSH RGBR ;Цвет.
PUSH 0 ;Толщина=1
PUSH 0 ;Сплошная линия.
CALL CreatePen@12
MOV HPEN,EAX


; Точка
MOV YP,200 ;Y
MOV XP,200 ;X
PUSH RGBP
PUSH YP
PUSH XP
PUSH MEMDC
CALL SetPixel@16
;Дать команду перерисовать окно.
PUSH 0
PUSH OFFSET RECT
PUSH DWORD PTR [EBP+08H]
CALL InvalidateRect@12
;Удалить контекст.
PUSH HDC
PUSH DWORD PTR [EBP+08H]
CALL ReleaseDC@8
mov eax,0
jmp FINISH
DEFWNDPROC:
PUSH DWORD PTR [EBP+14H]
PUSH DWORD PTR [EBP+10H]
PUSH DWORD PTR [EBP+0CH]
PUSH DWORD PTR [EBP+08H]
CALL DefWindowProcA@16
JMP FINISH

WMDESTROY:
PUSH 0 ; МВ_ОК
PUSH OFFSET CAP
PUSH OFFSET MES2
PUSH DWORD PTR [EBP+08H] ; дескриптор окна
CALL MessageBoxA@16
PUSH 0
CALL PostQuitMessage@4 ; сообщение WM_QUIT
MOV EAX, 0

FINISH:
POP EDI
POP ESI
POP EBX
POP EBP
RET 16
WNDPROC ENDP

Чего-то с чем-то перепутал. Сделал вывод текста, он нормально выдаётся. Но само окно не освежается.
Вообще надо в итоге сделать вывод графика в выделеную область (скрытую) и потом UpdateWindow.
Несколько раз планирую выдавать в окно, и непонятно, каждый раз нужно ReleaseDC@8 ? Не освободишь - зависнет. Но не пробовал.

Чего посоветуете ?
Могу выслать полностью по SKYPE'у, в реальном времени бы помучались )))
cdman вне форума Ответить с цитированием
Старый 14.12.2009, 20:08   #3
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Ну так
1. Вы не учитываите что это ассмблер, и то что Вы единственный отлично разбираитесь где у вас в коде что... а то что вы вывалили весь этот код сюда в надежде что кто-то будет его перелапатывать )) это врятли
2. После этого... я перестал читать, с какой целью вы вызываите два раза BeginPaint ?
Код:
WMPAINT:
;--------------------------
push OFFSET PNT
PUSH DWORD PTR [EBP+08H]
CALL BeginPaint@8
PUSH EAX ;Сохранить контекст (дескриптор)
;------------------------ цвет фона = цвет окна
PUSH RGBW
PUSH EAX
CALL SetBkColor@8
;------------------------ контекст
POP EAX
PUSH EAX
;------------------------ цвет текста (красный)
PUSH RGBT
PUSH EAX
CALL SetTextColor@8
;------------------------ контекст
POP EAX
;------------------------ вывести текст
PUSH OFFSET MyStatusBar
CALL LENSTR
PUSH EBX ;Длина строки.
PUSH OFFSET MyStatusBar ;Адрес строки.
PUSH YT ;Y
PUSH XT ;X
PUSH EAX ;Контекст окна.
CALL TextOutA@20

;--------------------------
PUSH OFFSET PNT
PUSH DWORD PTR [EBP+08H]
CALL BeginPaint@8
BOBAH13 вне форума Ответить с цитированием
Старый 14.12.2009, 20:18   #4
cdman
Пользователь
 
Регистрация: 23.05.2009
Сообщений: 32
По умолчанию

BOBAH13 Огромное спасибо, просмотрел этот момент. Теперь работает освежение окна ! Буду дальше ковыряться. Спасибо ! Мой Скайп cdman__x
добавляйтесь, будем общаться !
cdman вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
TP7 чтение из файла, работает но не работает!? Qousio Помощь студентам 7 02.06.2009 09:37
Библиотека НЕ работает с 2008, но работает с 2000 SQL namenike Общие вопросы C/C++ 0 26.05.2009 11:04
Размер окна в зависимости от размера окна Reverent JavaScript, Ajax 1 02.02.2008 15:49
закрыть все дочерни окна, кроме главного окна Worms Общие вопросы Delphi 2 03.12.2007 22:18
Как сделать чтобы дочерние окна в MDI-приложениях были вне главного окна??? dimonchuk Общие вопросы Delphi 1 11.08.2007 12:13