0 / 0 / 0
Регистрация: 10.10.2010
Сообщений: 4
1

Добавить рисование линии мышкой, как в Paint

23.12.2010, 18:54. Показов 1651. Ответов 1
Метки нет (Все метки)

Программа работает но нужно добавить рисование линии мышкой как на Paint
И чтоб видно как елипс рисуется а не просто появляется после проведения курсором по окне !
На Masm 32.
Может кто помочь ?

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
157
.386               ; директива визначення типу мікропроцесора
.model flat,stdcall                     ; завдання лінійної моделі пам’яті
                              ; та угоди ОС Windows
option casemap:none          ; відмінність малих та великих літер
WinMain proto :DWORD,:DWORD,:DWORD,:DWORD
include \masm32\include\windows.inc
include \masm32\include\masm32.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\gdi32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\gdi32.lib
includelib \masm32\lib\masm32.lib
 
.data                   ; директива визначення даних
ClassName db "SimpleWinClass",0
AppName  db "Результат выполнения программы",0
MenuName db "FirstMenu",0
About_string db "Выполнил: ",0
buf db 30 dup(0)
color3      RGBQUAD  <128,255,255>   ; ясно-бірюзовий
hPen1 dd 0
hOldPen dd 0
x1 dd 0
y1 dd 0
blueBrush dd ? ; комірка для  параметрів кисті
.data?
hInstance HINSTANCE ?
CommandLine LPSTR ?
.const
IDM_FUNC equ 1
IDM_EXIT equ 2
IDM_ABOUT equ 3
IDI_ICON  equ 22
.code
start:
    invoke GetModuleHandle, NULL ; отримання дескриптора програми
    mov    hInstance,eax         ; збереження дескриптора програми
    invoke GetCommandLine
    mov CommandLine,eax
    invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT
    invoke ExitProcess,eax
WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
    LOCAL wc:WNDCLASSEX
    LOCAL msg:MSG
    LOCAL hwnd:HWND
    mov   wc.cbSize,SIZEOF WNDCLASSEX       ; кількість байтів структури
    mov   wc.style, CS_HREDRAW or CS_VREDRAW    ; стиль та поведінка вікна
    mov   wc.lpfnWndProc, OFFSET WndProc    ; адреса процедури WndProc
    mov   wc.cbClsExtra,NULL    ; кількість байтів для структури
    mov   wc.cbWndExtra,NULL    ; кількість байтів для структури
    push  hInst     ; збереження в стеці дескриптора програми
    pop   wc.hInstance  ; повернення дескриптора в поле структури
    mov   wc.hbrBackground,COLOR_WINDOW+1   ; колір вікна
    mov   wc.lpszMenuName,OFFSET MenuName   ; ім’я ресурсу меню
    mov   wc.lpszClassName,OFFSET ClassName     ; ім’я класу
    invoke  LoadIcon,hInstance, IDI_ICON    ; ресурс піктограми
    mov   wc.hIcon,eax          ; дескриптор піктограми
    mov   wc.hIconSm,eax            ; дескриптор маленького віконця
    invoke LoadCursor,NULL,IDC_ARROW    ; ресурс курсору
    mov   wc.hCursor,eax
    invoke RegisterClassEx, addr wc     ;  регістрація класу вікна
invoke CreateWindowEx, \                 ; функція створення вікна за зразком
 NULL,ADDR ClassName, \                            ; стиль та адреса імені класу
  ADDR AppName,\                ; адреса імені вікна
  WS_OVERLAPPEDWINDOW, \                    ; базовий стиль
  CW_USEDEFAULT,CW_USEDEFAULT,\; гориз. та верт. координати вікна
    700,500, \            ; ширина та висота вікна
      0,0, hInst,0                 ; дескриптори батьківського вікна, меню, програми
 
    mov   hwnd,eax
    INVOKE ShowWindow, hwnd,SW_SHOWNORMAL
    INVOKE UpdateWindow, hwnd
    .WHILE TRUE
                INVOKE GetMessage, ADDR msg,NULL,0,0
                .BREAK .IF (!eax)
                INVOKE DispatchMessage, ADDR msg
    .ENDW
    mov     eax,msg.wParam
    ret
WinMain endp
 
WndProc proc hWnd:HWND,uMsg:UINT,wParam:WPARAM,IParam:LPARAM 
LOCAL hdc:HDC       ; резервування стеку під хендл вікна
 
.if uMsg==WM_DESTROY
invoke PostQuitMessage,NULL 
.ELSEIF uMsg==WM_CREATE   ; обробка  повідомлення WM_CREATE
invoke  CreatePen,\   ; створення пера
  PS_SOLID,40,\         ; завтовшки  40  пікселов
   dword ptr color3        ; світло-бірюзовий
mov     hPen1,eax   ; збереження отриманого  дескриптора пера
 
.elseif uMsg==WM_LBUTTONDOWN
  mov eax, IParam
  and eax,0ffffh 
  mov x1,eax
  mov eax, IParam
  shr eax,16 
  mov y1, eax
 
.elseif uMsg==WM_LBUTTONUP
invoke GetDC, hWnd ; отримати дескриптор контексту пристрою для функції GDI
mov hdc, eax   ; збереження
  mov eax, IParam
  mov edx, IParam
  and eax,0ffffh
  shr edx,16
  
invoke Ellipse, \       ; функція малювання еліпсу
 hdc, \             ; дескриптор контексту пристрою
  x1, \                  ; х-координата верхнього лівого куту прямокутника
   y1,\              ; y-координата верхнього лівого куту прямокутника
   eax,\             ; х-координата нижнього правого куту прямокутника
     edx                 ;  y-координата нижнього правого куту прямокутника 
 
 invoke ltoa, eax,addr buf
invoke GetDC, hWnd ; отримати дескриптор контексту пристрою для функції GDI
mov hdc, eax   ; збереження
 invoke TextOut, hdc, 20,20, addr buf,20
 
.elseif uMsg==WM_COMMAND
mov eax,wParam 
 
.if ax==IDM_FUNC
invoke GetDC, hWnd ; отримати дескриптор контексту пристрою для функції GDI
mov hdc, eax   ; збереження
invoke SelectObject,\ ;  Виберемо  в  контекст
   hdc,hPen1            ; нове  перо
invoke CreateHatchBrush, \        ; створення кісті для замалювання фігури
   HS_DIAGCROSS,\   ; стиль – штриховка під 450 зліва та справа
      dword ptr color3          ; значення кольору
mov blueBrush,eax       ; збереження параметрів кісті 
invoke SelectObject,\  ; вибір об’єкта з параметрами
  hdc,\             ; контекст пристрою
    blueBrush       ; параметри кісті
invoke Ellipse, \       ; функція малювання еліпсу
 hdc, \             ; дескриптор контексту пристрою
  40, \                  ; х-координата верхнього лівого куту прямокутника
   220,\             ; y-координата верхнього лівого куту прямокутника
    250,\            ; х-координата нижнього правого куту прямокутника
     95                  ;  y-координата нижнього правого куту прямокутника 
invoke ReleaseDC, hWnd, hdc 
.elseif ax==IDM_ABOUT
invoke MessageBox,NULL,ADDR About_string,OFFSET AppName,MB_OK 
.else
invoke DestroyWindow,hWnd 
.endif 
.else
invoke DefWindowProc,hWnd,uMsg,wParam,IParam 
Ret 
.endif
xor eax,eax 
Ret 
WndProc endp 
end start
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.12.2010, 18:54
Ответы с готовыми решениями:

Рисование прямой линии
Сразу, прошу, на алгоритмы типа &quot;Брейзенхема&quot; не посылать. С помощью рекурсии, пытаюсь то что...

Рисование линии в видеорежиме
Написать программу, которая в видережиме 13h выводит на экран лини. произвольной длины и единичной...

Рисование по алгоритму DDA-линии
пытаюсь написать программу, которая выводит прямую у=кх+b по алгоритму DDA-линии(вроде так...

Рисование линии по двут точкам (ЦВЕТ!!!)
Люди подскажите как в этой программе поменять цвет линий. Программа работает по алгоритму...

1
2013 / 1285 / 60
Регистрация: 05.06.2010
Сообщений: 2,213
24.12.2010, 16:38 2
Jarviz, я установил флаг operation - он переключает режим по нажатию правой кнопки мыши - некрасиво конечно, сделай менюшку какую нибудь
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
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
.386               ; директива визначення типу мікропроцесора
.model flat,stdcall                     ; завдання лінійної моделі пам’яті
                                                  ; та угоди ОС Windows
option casemap:none          ; відмінність малих та великих літер
WinMain proto :DWORD,:DWORD,:DWORD,:DWORD
include \masm32\include\windows.inc
include \masm32\include\masm32.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\gdi32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\gdi32.lib
includelib \masm32\lib\masm32.lib
 
.data                           ; директива визначення даних
ClassName db "SimpleWinClass",0
AppName  db "Результат выполнения программы",0
MenuName db "FirstMenu",0
About_string db "Выполнил: ",0
buf db 30 dup(0)
color3      RGBQUAD  <128,255,255>   ; ясно-бірюзовий
hPen1 dd 0
hOldPen dd 0
x1 dd 0
y1 dd 0
x2 dd 0
y2 dd 0
blueBrush dd ? ; комірка для  параметрів кисті
 
operation   db  1
bTracking   db  0
 
.data?
hInstance HINSTANCE ?
CommandLine LPSTR ?
hdc dd  ?
 
.const
IDM_FUNC equ 1
IDM_EXIT equ 2
IDM_ABOUT equ 3
IDI_ICON  equ 22
.code
start:
        invoke GetModuleHandle, NULL ; отримання дескриптора програми
        mov    hInstance,eax         ; збереження дескриптора програми
        invoke GetCommandLine
        mov CommandLine,eax
        invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT
        invoke ExitProcess,eax
WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
        LOCAL wc:WNDCLASSEX
        LOCAL msg:MSG
        LOCAL hwnd:HWND
        mov   wc.cbSize,SIZEOF WNDCLASSEX               ; кількість байтів структури
        mov   wc.style, CS_HREDRAW or CS_VREDRAW        ; стиль та поведінка вікна
        mov   wc.lpfnWndProc, OFFSET WndProc    ; адреса процедури WndProc
        mov   wc.cbClsExtra,NULL        ; кількість байтів для структури
        mov   wc.cbWndExtra,NULL        ; кількість байтів для структури
        push  hInst             ; збереження в стеці дескриптора програми
        pop   wc.hInstance      ; повернення дескриптора в поле структури
        mov   wc.hbrBackground,COLOR_WINDOW+1   ; колір вікна
        mov   wc.lpszMenuName,OFFSET MenuName   ; ім’я ресурсу меню
        mov   wc.lpszClassName,OFFSET ClassName         ; ім’я класу
        invoke  LoadIcon,hInstance, IDI_ICON    ; ресурс піктограми
        mov   wc.hIcon,eax                      ; дескриптор піктограми
        mov   wc.hIconSm,eax                    ; дескриптор маленького віконця
        invoke LoadCursor,NULL,IDC_ARROW        ; ресурс курсору
        mov   wc.hCursor,eax
        invoke RegisterClassEx, addr wc         ;  регістрація класу вікна
invoke CreateWindowEx, \                 ; функція створення вікна за зразком
 NULL,ADDR ClassName, \                            ; стиль та адреса імені класу
  ADDR AppName,\                                ; адреса імені вікна
  WS_OVERLAPPEDWINDOW, \                                ; базовий стиль
  CW_USEDEFAULT,CW_USEDEFAULT,\; гориз. та верт. координати вікна
    700,500, \            ; ширина та висота вікна
      0,0, hInst,0                 ; дескриптори батьківського вікна, меню, програми
 
        mov   hwnd,eax
        INVOKE ShowWindow, hwnd,SW_SHOWNORMAL
        INVOKE UpdateWindow, hwnd
        .WHILE TRUE
                INVOKE GetMessage, ADDR msg,NULL,0,0
                .BREAK .IF (!eax)
                INVOKE DispatchMessage, ADDR msg
        .ENDW
        mov     eax,msg.wParam
        ret
WinMain endp
 
WndProc proc hWnd:HWND,uMsg:UINT,wParam:WPARAM,IParam:LPARAM 
;LOCAL hdc:HDC           ; резервування стеку під хендл вікна
 
.if uMsg==WM_DESTROY
invoke ReleaseDC, hWnd, hdc
invoke PostQuitMessage,NULL
 
.ELSEIF uMsg==WM_CREATE   ; обробка  повідомлення WM_CREATE
invoke  CreatePen,\   ; створення пера
  PS_SOLID,40,\         ; завтовшки  40  пікселов
   dword ptr color3        ; світло-бірюзовий
mov     hPen1,eax       ; збереження отриманого  дескриптора пера
invoke GetDC, hWnd
mov hdc, eax
 
.elseif uMsg==WM_RBUTTONDOWN
    xor operation, 1
 
.elseif uMsg==WM_LBUTTONDOWN
  mov eax, IParam
  and eax,0ffffh 
  mov x1,eax
  mov eax, IParam
  shr eax,16 
  mov y1, eax
  or  bTracking, 1
cmp operation, 0
jnz @op2_down
    invoke MoveToEx, hdc, x1, y1, NULL
@op2_down:
    invoke SetROP2, hdc, R2_NOTXORPEN
    mov eax, x1
    mov x2, eax
    mov eax, y1
    mov y2, eax
 
.elseif uMsg==WM_LBUTTONUP
    and bTracking, 0
    invoke SetROP2, hdc, R2_COPYPEN
 
.elseif uMsg==WM_MOUSEMOVE
    cmp bTracking, 1
    jnz @end_move
cmp operation, 0
jnz @op2_move
    mov eax, IParam
    and eax,0ffffh 
    mov x2,eax
    mov eax, IParam
    shr eax,16 
    mov y2, eax
    invoke LineTo, hdc, x2, y2
@op2_move:
cmp operation, 1
jnz @end_move
    cmp bTracking, 1
    jnz @end_move
    invoke Ellipse, hdc, x1, y1, x2, y2
    mov eax, IParam
    and eax,0ffffh 
    mov x2,eax
    mov eax, IParam
    shr eax,16 
    mov y2, eax
    invoke Ellipse, hdc, x1, y1, x2, y2
@end_move:
 
.elseif uMsg==WM_COMMAND
mov eax,wParam 
 
.if ax==IDM_FUNC
;invoke GetDC, hWnd ; отримати дескриптор контексту пристрою для функції GDI
;mov hdc, eax   ; збереження
;invoke SelectObject,\ ;  Виберемо  в  контекст
;   hdc,hPen1                    ; нове  перо
;invoke CreateHatchBrush, \        ; створення кісті для замалювання фігури
;   HS_DIAGCROSS,\       ; стиль – штриховка під 450 зліва та справа
;      dword ptr color3                  ; значення кольору
;mov blueBrush,eax               ; збереження параметрів кісті 
;invoke SelectObject,\  ; вибір об’єкта з параметрами
;  hdc,\                         ; контекст пристрою
;    blueBrush           ; параметри кісті
;invoke Ellipse, \               ; функція малювання еліпсу
; hdc, \                         ; дескриптор контексту пристрою
;  40, \                          ; х-координата верхнього лівого куту прямокутника
;   220,\                 ; y-координата верхнього лівого куту прямокутника
;    250,\                ; х-координата нижнього правого куту прямокутника
;     95                          ;  y-координата нижнього правого куту прямокутника 
;invoke ReleaseDC, hWnd, hdc 
.elseif ax==IDM_ABOUT
invoke MessageBox,NULL,ADDR About_string,OFFSET AppName,MB_OK 
.else
invoke DestroyWindow,hWnd 
.endif 
.else
invoke DefWindowProc,hWnd,uMsg,wParam,IParam 
Ret 
.endif
xor eax,eax 
Ret 
WndProc endp 
end start
Добавлено через 5 часов 47 минут
щас попробовал запустить - че то не то, надо добавить переход
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
...
.elseif uMsg==WM_LBUTTONDOWN
  mov eax, IParam
  and eax,0ffffh 
  mov x1,eax
  mov eax, IParam
  shr eax,16 
  mov y1, eax
  or  bTracking, 1
cmp operation, 0
jnz @op2_down
    invoke MoveToEx, hdc, x1, y1, NULL
    jmp @xx
@op2_down:
    invoke SetROP2, hdc, R2_NOTXORPEN
@xx:    
    mov eax, x1
    mov x2, eax
    mov eax, y1
    mov y2, eax
 
.elseif uMsg==WM_LBUTTONUP
...
иначе линия рисуемая поверх, стирает предыдущую
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.12.2010, 16:38

Рисование прямой линии, как в Paint
Доброго всем времени суток. Нужно в PictureBox нарисовать прямую линию. Рисовать надо как в...

Рисование линии как в Paint (фиксация с одного конца и следование за курсором - с другого)
private void tmImgRysownica_MouseDown(object sender, MouseEventArgs e) { if...

Рисование линии мышкой
Я делаю графический редактор и возник вопрос: как нарисовать линию? Линия должна рисоваться с...

Рисование линии мышкой на PictureBox
Всем привет. Решил побаловаться, попробовать реализовать некое подобие Paint на C#. Начал с...


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

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

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