Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Не работает освежение окна

42K
14 декабря 2009 года
cdman
7 / / 23.02.2009
SetPixel не работает ...
.686P
.XMM
.MODEL FLAT, stdcall
option casemap:none
; константы
; сообщение приходит при закрытии окна
WM_DESTROY equ 2
; сообщение приходит при создании окна
WM_CREATE equ 1
; сообщение при щелчке левой кнопкой мыши в области окна
WM_LBUTTONDOWN equ 201h
; сообщение при щелчке правой кнопкой мыши в области окна
WM_RBUTTONDOWN equ 204h
; свойства окна
CS_NOCLOSE equ 1h
CS_VREDRAW equ 1h
CS_HREDRAW equ 2h
CS_GLOBALCLASS equ 4000h
WS_OVERLAPPEDWINDOW equ 000CF0000H
style equ CS_HREDRAW+CS_VREDRAW+CS_GLOBALCLASS
; идентификатор стандартной иконки
IDI_APPLICATION equ 32512
; идентификатор курсора
IDC_CROSS equ 32515
; режим показа окна - нормальный
SW_SHOWNORMAL equ 1
STYLBTN equ WS_CHILD+BS_DEFPUSHBUTTON+WS_VISIBLE+WS_TABSTOP
STYLEDT equ WS_CHILD+WS_VISIBLE+WS_BORDER+WS_TABSTOP

;Сообщение приходит при перерисовке окна.
WM_PAINT equ 0Fh

;Сообщение, позволяющее послать элементу строку.
WM_SETTEXT equ 0Ch


WS_CHILD equ 40000000h
BS_DEFPUSHBUTTON equ 1h
WS_VISIBLE equ 10000000h
WS_TABSTOP equ 10000h
WS_BORDER equ 800000h

;Компоненты цветов.
RED equ 50
GREEN equ 50
BLUE equ 255
RGBW equ 0 ; Цвет окна - чёрный RGBW equ (RED or (GREEN shl 8)) or (BLUE shl 16)
RGBT equ 255 ;Красный.
RGBP equ 17
RGBR equ 150 ;Цвет региона.

; прототипы внешних процедур
EXTERN GetModuleHandleA@4:NEAR
EXTERN GetStdHandle@4:NEAR
EXTERN LoadCursorA@8:NEAR
EXTERN LoadIconA@8:NEAR
EXTERN RegisterClassA@4:NEAR

EXTERN MessageBoxA@16: NEAR

EXTERN DefWindowProcA@16:NEAR
EXTERN PostQuitMessage@4:NEAR

EXTERN CreateWindowExA@48:NEAR
EXTERN ShowWindow@8:NEAR
EXTERN UpdateWindow@4:NEAR
EXTERN GetMessageA@16:NEAR
EXTERN TranslateMessage@4:NEAR
EXTERN DispatchMessageA@4:NEAR
EXTERN SendMessageA@16:NEAR
EXTERN SetFocus@4:NEAR
EXTERN GetDC@4:NEAR
EXTERN ReleaseDC@8:NEAR
EXTERN CreateCompatibleDC@4:NEAR
EXTERN GetSystemMetrics@4:NEAR
EXTERN CreateCompatibleBitmap@12:NEAR
EXTERN SelectObject@8:NEAR
EXTERN PatBlt@24:NEAR
EXTERN BitBlt@36:NEAR
EXTERN CreatePen@12:NEAR
EXTERN SetPixel@16:NEAR
EXTERN Rectangle@20:NEAR
EXTERN InvalidateRect@12:NEAR

EXTERN CreateSolidBrush@4:NEAR
EXTERN BeginPaint@8:NEAR
EXTERN EndPaint@8:NEAR
EXTERN SetBkColor@8:NEAR
EXTERN SetTextColor@8:NEAR

EXTERN TextOutA@20:NEAR ; Вывод текста в окно по координатам


EXTERN ExitProcess@4:NEAR
EXTERN GetCommandLineA@0:NEAR

; директивы компоновщику для подключения библиотек
includelib e:\masm32\lib\user32.lib
includelib e:\masm32\lib\kernel32.lib
includelib e:\masm32\lib\gdi32.lib

;include e:\masm32\include\windows.inc
include E:\masm32\include\kernel32.inc
include E:\masm32\include\gdi32.inc
;--------------------------------------------------------------
; СТРУКТУРЫ

; структура сообщения
MSGSTRUCT STRUC
MSHWND DD ? ; идентификатор окна,
; получающего сообщение
MSMESSAGE DD ? ; идентификатор сообщения
MSWPARAM DD ? ; доп. информация о сообщении
MSLPARAM DD ? ; доп. информация о сообщении
MSTIME DD ? ; время посылки сообщения
MSPT DD ? ; положение курсора, во время посылки
; сообщения
MSGSTRUCT ENDS
;---------
WNDCLASS STRUC
CLSSTYLE DD ? ; стиль окна
CLWNDPROC DD ? ; указатель на процедуру окна
CLSCEXTRA DD ? ; информация о доп. байтах для
; данной структуры
CLWNDEXTRA DD ? ; информация о доп. байтах для окна
CLSHINSTANCE DD ? ; дескриптор приложения
CLSHICON DD ? ; идентификатор иконы окна
CLSHCURSOR DD ? ; идентификатор курсора окна
CLBKGROUND DD ? ; идентификатор кисти окна
CLMENUNAME DD ? ; имя-идентификатор меню
CLNAME DD ? ; специфицирует имя класса окон
WNDCLASS ENDS
;--------------------------------------------------------------
PAINTSTR STRUC
hdc DWORD 0
fErase DWORD 0
left DWORD 0
top DWORD 0
right DWORD 0
bottom DWORD 0
fRes DWORD 0
fIncUp DWORD 0
Reserv DB 32 dup(0)
PAINTSTR ENDS
;--------------------------------------------------------------
SIZET STRUC
X1 DWORD ?
Y1 DWORD ?
SIZET ENDS
;--------------------------------------------------------------
RECT STRUC
L DWORD ? ;X - левого верхнего угла.
T DWORD ? ;Y - левого верхнего угла.
R DWORD ? ;Х - правого нижнего угла.
B DWORD ? ;Y - правого нижнего угла.
RECT ENDS
;--------------------------------------------------------------
;СЕГМЕНТ ДАННЫХ
_DATA SEGMENT

MyMainWindowHandle DD 0
MSG MSGSTRUCT <?>
WC WNDCLASS <?>
PNT PAINTSTR <?>
SZT SIZET <?>
RCT RECT <?>

TITLENAME DB 'HAMMER',0
CLASSNAME DB 'CLASS32',0
CAP DB 'Сообщение',0
; Окно редактирования

CLSEDIT DB 'EDIT',0

HINST DWORD ?

XT DWORD 5
YT DWORD 1630

XP DWORD ?
YP DWORD ?

XM DWORD ?
YM DWORD ?
HDC DWORD ? ; Контекст

HPEN DWORD ?
HBRUSH DWORD ?

_DATA ENDS
;сегмент кода
_TEXT SEGMENT
Start:
; получить дескриптор приложения
push 0
call GetModuleHandleA@4
mov HINST,eax

push edi
push esi
;----------------------------------------------------------
; ЗАПОЛНИТЬ СТРУКТУРУ ОКНА
;----------------------------------------------------------
; стиль
mov [WC.CLSSTYLE], style
; процедура обработки сообщений
mov [WC.CLWNDPROC],OFFSET WNDPROC
mov [WC.CLSCEXTRA],0
mov [WC.CLWNDEXTRA],0
mov eax,[HINST]
mov [WC.CLSHINSTANCE],eax
;--------- иконка окна
push IDI_APPLICATION
push 0
call LoadIconA@8
mov [WC.CLSHICON],eax
;---------- курсор окна
push IDC_CROSS
push 0
call LoadCursorA@8
mov [WC.CLSHCURSOR],eax
;---------
push RGBW ;Цвет кисти.
call CreateSolidBrush@4 ;Создать кисть.
;---------
mov [WC.CLBKGROUND],0 ; цвет окна чёрный
mov DWORD ptr [WC.CLMENUNAME],0
mov DWORD ptr [WC.CLNAME],OFFSET CLASSNAME
push OFFSET WC
call RegisterClassA@4
; создать окно зарегистрированного класса
push 0
push [HINST]
push 0
push 0
push 1680 ; DY — высота окна
push 1050 ; DX - ширина окна
push 0 ; Y — координата левого верхнего угла
push 0 ; X — координата левого верхнего угла
push WS_OVERLAPPEDWINDOW or WS_VISIBLE
push OFFSET TITLENAME ; имя окна
push OFFSET CLASSNAME ; имя класса
push 0
call CreateWindowExA@48
cmp eax,0 ; Проверка на ошибку
jz _ERR

mov MyMainWindowHandle,eax ; Дескриптор окна

; петля обработки сообщений
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:
; выход из программы (закрыть процесс)
push [MSG.MSWPARAM]

pop esi
pop edi
invoke ExitProcess, 0
_ERR:
jmp END_LOOP

; --------------------------------------------------
; процедура окна
; расположение параметров в стеке
; [EBP+014H] LPARAM
; [EBP+10H] WAPARAM
; [EBP+0CH] MES
; [EBP+8] MyMainWindowHandle
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

jmp DEFWNDPROC

WMPAINT:
mov eax,0
jmp FINISH

WMCREATE:
;Открыть контекст окна.
push [MyMainWindowHandle] ;PUSH DWORD PTR [EBP+08H]
call GetDC@4
mov HDC,eax

;Точка
mov YP,200 ;Y
mov XP,200 ;X
push 255; RGBP
push YP
push XP
push HDC
call SetPixel@16
;Точка ещё
mov YP,200 ;Y
mov XP,202 ;X
push 17 ;RGBP
push YP
push XP
push HDC
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
call PostQuitMessage@4 ; сообщение WM_QUIT
mov eax,0

FINISH:
pop edi
pop esi
pop ebx
pop ebp
ret 16
WNDPROC endp

_TEXT ends
end Start

Люди, есть идеи ?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог