Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: SetPixel не работает  (Прочитано 8986 раз)
0 Пользователей и 3 Гостей смотрят эту тему.
HungryEagle
Интересующийся

ru
Offline Offline
Пол: Мужской

« : 16-12-2009 09:49 » 

Почти всё выкинул, кроме создания окна и постановки точки. (Делал в masm'е так что откомпилируется без приключений)
Код:
.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

Чего я забыл ?
« Последнее редактирование: 16-12-2009 09:55 от Джон » Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 16-12-2009 10:11 » new

HungryEagle, вопрос: а не пробовал описать алгоритм в более компактном и читаемом виде? - разбираться с кучей асма как-то лениво.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 16-12-2009 16:23 » 

HungryEagle, зачем такие трудности для отображения пикселя? Не проще на 'C' написать?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 16-12-2009 16:25 » 

Offtopic:

Serg79, он же Галодный Арол! Улыбаюсь
Поставлю в угол.

Записан

HungryEagle
Интересующийся

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 16-12-2009 17:35 » 

У меня есть рабочий пример на C++ (с классами MFC), но оттуда выдрать суть очень сложно.
 Если есть простенький пример, то давайте его поразбираем.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 16-12-2009 17:54 » 

Простенькие примеры:
Код:
//(API)
::SetPixel(hdc,100,100,RGB(255,0,0));

//MFC
dc.SetPixel(100,100,RGB(255,0,0));
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines