Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
Seryoga_93
0 / 0 / 0
Регистрация: 19.09.2013
Сообщений: 19
1

Отрисовка точек в окне WinApi

09.12.2014, 20:27. Просмотров 610. Ответов 3
Метки нет (Все метки)

Доброго времени суток! В рамках задачи построения графика функции пытался разобраться с элементарной отрисовкой точек в цикле при отрисовке формы WM_PAINT (Win32). Дело в том, что программа зависает, когда я вставляю стандартную апи-функцию invoke SetPixel в цикл - допустим хочу вывести ряд точек... Если написать функцию вне цикла - точка выводится, а в цикле - все зависает... Конструкции циклов писал тоже разные. Такое ощущение, что делать это нужно не по событию WM_PAINT, типа получается цикл отрисовки в цикле опроса сообщений - слишком много? Тогда где отрисовывать? Направьте в нужную сторону, пожалуйста...
Пишу в WinAsm, недавно перебрался с ассемблера на TASM 16 О_о, поэтому с winapi пока не очень разбираюсь...
Привожу весь код, извиняюсь за комментарии, которых нет... в целом тут стандартное построение окна, нужный блок - выделен.

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
.386
.model flat, stdcall
option casemap :none
 
  include c:\masm32\include\windows.inc
  include c:\masm32\include\user32.inc
  include c:\masm32\include\kernel32.inc
  include c:\masm32\include\gdi32.inc
  
  includelib c:\masm32\lib\gdi32.lib
  includelib c:\masm32\lib\user32.lib
  includelib c:\masm32\lib\kernel32.lib
 
WinMain proto :DWORD,:DWORD,:DWORD,:DWORD
WndProc proto :HWND,:UINT,:WPARAM,:LPARAM
Drawing proto :DWORD
 
.DATA                       
 
ClassName db "WinClass", 0h             
AppName db "Г‹Г*áîðГ*òîðГ*Г*Гї Г°Г*áîòГ* В№7",0        
point dd 0,0,0,0
mycolor RGBQUAD <0, 0, 255>
.DATA?                              
hInstance HINSTANCE ?                   
CommandLine LPSTR ?
PS PAINTSTRUCT <?>
xc dd ?
yc dd ?
.CODE                                   
start:
invoke GetModuleHandle, NULL                                    
mov hInstance,eax           
invoke GetCommandLine                   
 
invoke WinMain, hInstance,NULL,GetCommandLine,SW_SHOWNORMAL 
invoke ExitProcess, eax                                             
                                                    
 
WinMain proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
 
    LOCAL hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
    LOCAL wc:WNDCLASSEX    
    LOCAL msg:MSG
    LOCAL hwnd:HWND
    
    invoke GetSystemMetrics,SM_CXSCREEN
    sar eax,1
    sub eax, 350
    mov xc, eax
    invoke GetSystemMetrics,SM_CYSCREEN
    sar eax,1
    sub eax, 200 
    mov yc, eax
 
    mov   wc.cbSize,SIZEOF WNDCLASSEX                   
    mov   wc.style, CS_HREDRAW or CS_VREDRAW        
    mov   wc.lpfnWndProc, OFFSET WndProc                
    mov   wc.cbClsExtra,NULL
 
    mov   wc.cbWndExtra,NULL
    push  hInstance                             
    pop   wc.hInstance
    mov   wc.hbrBackground,COLOR_WINDOW+1               
 
    mov   wc.lpszMenuName,NULL                      
    mov   wc.lpszClassName,OFFSET ClassName     
    invoke LoadIcon,NULL,IDI_APPLICATION
    mov   wc.hIcon,eax                                  
 
    mov   wc.hIconSm,eax
    invoke LoadCursor,NULL,IDC_ARROW
    mov   wc.hCursor,eax
    invoke RegisterClassEx, addr wc 
              
    invoke CreateWindowEx,WS_EX_TOPMOST,\
                ADDR ClassName,\
                ADDR AppName,\
                WS_OVERLAPPEDWINDOW,\
                xc,\
                yc,\
                700,\
                400,\
                NULL,\
                NULL,\
                hInst,\
                NULL               
                
    mov   hwnd,eax                  
    invoke ShowWindow, hwnd,SW_NORMAL               
    invoke UpdateWindow, hwnd                           
 
    .WHILE TRUE   ; Enter message loop
                invoke GetMessage, ADDR msg,NULL,0,0
                .BREAK .IF (!eax)
 
                invoke TranslateMessage, ADDR msg
                invoke DispatchMessage, ADDR msg        
   .ENDW
    mov     eax, msg.wParam                         
    ret
WinMain endp
 
WndProc proc USES ebx edi esi, hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
    LOCAL _hdc:DWORD
    
    .IF uMsg==WM_DESTROY                        
        invoke PostQuitMessage,NULL                     
    .ELSEIF uMsg==WM_PAINT  
       invoke BeginPaint, hWnd, offset PS           
       mov _hdc, eax
       
       ;отрисовка осиY
       invoke MoveToEx, _hdc, 200, 50, point
       invoke LineTo, _hdc, 200, 300
       
       ;отрисовка оси X   
       invoke MoveToEx, _hdc, 50, 175, point
       invoke LineTo, _hdc, 600, 175
       
       ;стрелки Х      
       invoke LineTo, _hdc, 594, 169
       invoke MoveToEx, _hdc, 595, 180, point
       invoke LineTo, _hdc, 600, 175    
       
       ;стрелки Y
       invoke MoveToEx, _hdc, 205, 55, point
       invoke LineTo, _hdc, 200, 50
       invoke LineTo, _hdc, 194, 56
       
       invoke MoveToEx, _hdc, 50, 175, point 
       invoke CreatePen, PS_NULL, 3, dword ptr mycolor             
 
;>>>>>>>>>>>>>>>>>>>>TROUBLE>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>     
           mov ecx, 10
       cycle:   
        mov ebx, 250
        lea esi, AppName
        invoke SetPixel, _hdc, 300, 100, dword ptr mycolor 
        add ebx, 40
        inc esi     
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
      
          
       invoke EndPaint, _hdc, offset PS                     ;îñâîáîæäГ*ГҐГ¬ ГЄГ®Г*ГІГҐГЄГ±ГІ              
    .ELSE
        invoke DefWindowProc,hWnd,uMsg,wParam,lParam        ;ГґГіГ*êöèÿ îápГ*áîòêè îêГ*Г*
        ret
    .ENDIF
    
    
    xor eax,eax
    ret
WndProc endp
 
end start
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.12.2014, 20:27
Ответы с готовыми решениями:

Отрисовка на многослойном окне
Здравствуйте! Создаю многослойное окно с полупрозрачным фоном с помощью следующего кода: HBITMAP...

Отрисовка таблиц в окне
имею следующий код, но с ним что то не так: public static void listFrame(File f) { ...

[Си] WinApi, отрисовка png файла
Доброго времени суток! Пишу проект на чистом Си (принципиально) с использованием WinApi. Возникла...

Отрисовка графики в окне из консоли
Здравствуйте,

Отрисовка в окне до вызова ReleaseDC
Снимаю скриншоты с окна часто (через каждые 0.1 сек) и, затем, распознаю изображение. В самом окне...

3
Thread
programmer
1871 / 343 / 27
Регистрация: 01.06.2011
Сообщений: 3,085
Записей в блоге: 1
10.12.2014, 13:09 2
Seryoga_93,

в отладчике конечно причину не искали?
SetPixel изменяет регистры после выхода,поэтому стоит сохранять в стек ecx перед вызовом,а после восстановить.
1
Seryoga_93
0 / 0 / 0
Регистрация: 19.09.2013
Сообщений: 19
10.12.2014, 15:10  [ТС] 3
Спасибо, Thread, про изменение регистров не знал, а с отладчиком я в winasm еще не очень разобрался...
0
Thread
programmer
1871 / 343 / 27
Регистрация: 01.06.2011
Сообщений: 3,085
Записей в блоге: 1
10.12.2014, 15:59 4
Seryoga_93,

у меня в инструментах стоит для вызова OllyDbg,а примочка MiniDbg это не серьезно.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.12.2014, 15:59

Отрисовка содержимого pdf файла в окне java
Уважаемые форумчане, вопрос следующего порядка: в сети нашел вроде как бесплатную бибилотеку на...

Отрисовка массива точек
Есть 2 picturebox-a, в первом окошке картинка черно-белая(белый фон и на нём прямая линия...

OpenGL отрисовка большого количества точек
Столкнулся с следующей проблемой. При отрисовке большого количества точек в приложении происходит...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru