|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
14.12.2009, 17:37 | #1 |
Пользователь
Регистрация: 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 ;Запомнить дескриптор кнопки. |
14.12.2009, 17:37 | #2 |
Пользователь
Регистрация: 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'у, в реальном времени бы помучались ))) |
14.12.2009, 20:08 | #3 |
Android Developer
Старожил Подтвердите свой е-майл
Регистрация: 19.02.2007
Сообщений: 3,708
|
Ну так
1. Вы не учитываите что это ассмблер, и то что Вы единственный отлично разбираитесь где у вас в коде что... а то что вы вывалили весь этот код сюда в надежде что кто-то будет его перелапатывать )) это врятли 2. После этого... я перестал читать, с какой целью вы вызываите два раза BeginPaint ? Код:
|
14.12.2009, 20:18 | #4 |
Пользователь
Регистрация: 23.05.2009
Сообщений: 32
|
BOBAH13 Огромное спасибо, просмотрел этот момент. Теперь работает освежение окна ! Буду дальше ковыряться. Спасибо ! Мой Скайп cdman__x
добавляйтесь, будем общаться ! |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
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 |