purebasic.info

PureBasic forum
Текущее время: Чт фев 20, 2020 7:49 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 27 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: пунктирное выделение
СообщениеДобавлено: Пт сен 06, 2013 3:42 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Вс дек 09, 2012 9:02 pm
Сообщений: 780
Откуда: Дагестан
Благодарил (а): 0 раз.
Поблагодарили: 14 раз.
Пункты репутации: 0
помогите разобраться
Код:
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
194
195
196
197
Global SelectMouse
Global MouseSelectStartX, MouseSelectLastX
Global MouseSelectStartY, MouseSelectLastY
 
Global hdc, hpen, pen
;Global
 
 
 
; ------------------------------------------
;{- процедура для рисования точек Plot    
;-- процедура для рисования точек Plot
; ----------------------------------------
Enumeration #PB_Compiler_EnumerationValue
  #CanvasGadget
  #CanvasGadget1
EndEnumeration  
 
Procedure  DrawPointsPlot(Windows, Output)
  ; Уменьшаем мерцания окна с помошью Api при изменении его размеров.
  ;RedrawWindow_(WindowID(Windows), 0, 0, #RDW_UPDATENOW|#RDW_ALLCHILDREN)
 
  If IsWindow(Windows) ; Проверяем есть ли такое окно с "WindowID(Windows)"
   
    ;SetFocus_(WindowID(Windows)) ; Установыть фокус на окно с "WindowID(Windows)"
   ;OldGadgetList = UseGadgetList(WindowID(Windows)) ; Выбирает окно с "WindowID(Windows)", к которому будут добавлятся гаджеты
    ;CanvasGadget(#CanvasGadget, 0, 0, WindowWidth(Windows), WindowHeight(Windows)) : DisableGadget(#CanvasGadget,1)
    ;ResizeGadget(#CanvasGadget, 0, 0, WindowWidth(Windows), WindowHeight(Windows)): DisableGadget(#CanvasGadget,1)
    If StartDrawing(Output) ; рисуем на канвасе.
      For i = 4 To (OutputWidth())-1 Step 10
       For j = 4 To (OutputHeight())-1 Step 10
        Plot(i, j , 0)
      Next :Next
      StopDrawing()
     EndIf
   ;UseGadgetList(OldGadgetList) ; Возвращает WindowID предыдущего окна.
 Else
  MessageBox_(0,"В процедуре - DrawPoints"+#CRLF$+" (Window) - ID не указан,"+#CRLF$+"или указан не сушествующий - ID!","Сообщение",0)
 EndIf
EndProcedure
 
;}----------------------------------------
; ------------------------------------------
 
 
Procedure DrawPenRect(Output, Pen, PenColor=0, PenWidth=0, BoxColor=0)
  hdc = StartDrawing(Output)
  If BoxColor=0
    BoxColor=$FFFFFF
  EndIf
  If hdc
  DrawingMode(#PB_2DDrawing_Outlined)
  Box(0, 0, OutputWidth(), OutputHeight(), BoxColor)
  ;// Создаем перо
  hpen = CreatePen_(Pen, PenWidth, PenColor);
  hpenOld = SelectObject_(hdc, hpen);
  Rectangle_(hdc, MouseSelectStartX,MouseSelectStartY,MouseSelectLastX,MouseSelectLastY);
  ;SmartWindowRefresh(window,0)
 
               
  ;// Не забывайте очищать.
  SelectObject_(hdc, hpenOld);
  DeleteObject_(hpen)
   ;RestoreDC_(hdc, -1)
  StopDrawing()
 EndIf
EndProcedure  
 
;#CanvasGadget=1
OpenWindow(0, 0, 0, 600, 600, "2DDrawing Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered| #PB_Window_SizeGadget)
SetWindowIcon(WindowID(0),ExtractIcon_(0,"shell32.dll",130))
CanvasGadget(#CanvasGadget, 0, 0, 600, 600)
;CanvasGadget(#CanvasGadget1, 0, 0, 300, 300)
 
; ----------------------------------------
;{- обработка событий в окне
;-- обработка событий в окне
; ----------------------------------------
Procedure Event(hWnd,Msg,wParam,lParam)
 
 
  Select Msg
    Case #WM_PAINT
     
    Case 799
    Case #PB_Event_Repaint
    Case #WM_SIZING
    Case #WM_RBUTTONDOWN
    Case #WM_LBUTTONDOWN
    Case #WM_LBUTTONUP
    Case #WM_MOUSEMOVE
    Case #PB_Event_Gadget
     Select EventGadget()
      Case #CanvasGadget
       Select EventType()
        Case #PB_EventType_LeftButtonDown ;#WM_LBUTTONDOWN
          SelectMouse  = 1
          MouseSelectStartX = WindowMouseX(Window)
          MouseSelectStartY = WindowMouseY(Window)
         
        Case #PB_EventType_MouseMove ;#WM_MOUSEMOVE
          MouseSelectLastX = WindowMouseX(Window);-MouseSelectStartX
          MouseSelectLastY = WindowMouseY(Window);-MouseSelectStartY
         
          If SelectMouse > 0 ;And wParam & #MK_LBUTTON
            If SelectMouse > 1
              DrawPenRect(CanvasOutput(#CanvasGadget), #PS_DOT)
              Else
              SelectMouse+1
            EndIf
           
          EndIf
         
        Case #PB_EventType_LeftButtonUp ;#WM_LBUTTONUP
          ;Debug MouseSelectStartX
          ;Debug MouseSelectLastX
          SelectMouse =0
         
         
        Default
      EndSelect  
     EndSelect
    Default  
     
  EndSelect
  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure :SetWindowCallback(@Event())
 
;}----------------------------------------
; ----------------------------------------
 
 
; ---------------------------------------
;{- обработка событий на CanvasGadget-е
;-- обработка событий на CanvasGadget-е
; ---------------------------------------
Procedure EventCanvas(Window)
 
  Select EventGadget()
    Case #CanvasGadget
      Select EventType()
        Case #PB_EventType_LeftButtonDown ;#WM_LBUTTONDOWN
          SelectMouse  = 1
          MouseSelectStartX = WindowMouseX(Window)
          MouseSelectStartY = WindowMouseY(Window)
         
        Case #PB_EventType_MouseMove ;#WM_MOUSEMOVE
          MouseSelectLastX = WindowMouseX(Window);-MouseSelectStartX
          MouseSelectLastY = WindowMouseY(Window);-MouseSelectStartY
         
          If SelectMouse > 0 ;And wParam & #MK_LBUTTON
            If SelectMouse > 1
              DrawPenRect(CanvasOutput(#CanvasGadget), #PS_DOT)
             
              Else
              SelectMouse+1
            EndIf
            DrawPointsPlot(0, CanvasOutput(#CanvasGadget))
     
          EndIf
         RedrawWindow_(GadgetID(#CanvasGadget), 0, 0, #RDW_UPDATENOW|#RDW_ALLCHILDREN)
         
        Case #PB_EventType_LeftButtonUp ;#WM_LBUTTONUP
          ;Debug MouseSelectStartX
          ;Debug MouseSelectLastX
          SelectMouse =0
         
        Default
      EndSelect  
  EndSelect
 
EndProcedure
 
;}---------------------------------------
; ---------------------------------------
 
 
 
Repeat
  Select WaitWindowEvent()
    Case #PB_Event_Repaint
     DrawPointsPlot(0, CanvasOutput(#CanvasGadget))
     ;DrawPenRect(CanvasOutput(#CanvasGadget), hpenOld)
     
    Case #PB_Event_SizeWindow
     ResizeGadget(#CanvasGadget, 0, 0, WindowWidth(0), WindowHeight(0))
     
    Case #PB_Event_Gadget
     
      EventCanvas(0)
     
    Case #PB_Event_CloseWindow
      End
     
  EndSelect
 
ForEver



Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт сен 06, 2013 5:48 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 929
Благодарил (а): 2 раз.
Поблагодарили: 46 раз.
Пункты репутации: 9
Мне так чуть понятнее
Код:
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
Global SelectMouse 
Global MouseSelectStartX, MouseSelectLastX
Global MouseSelectStartY, MouseSelectLastY
Global hdc, hpen, pen  
 Procedure DrawPointsPlot(Windows, Output)
   ; Уменьшаем мерцания окна с помошью Api при изменении его размеров.
   ;RedrawWindow_(WindowID(Windows), 0, 0, #RDW_UPDATENOW|#RDW_ALLCHILDREN)
   
   If IsWindow(Windows) ; Проверяем есть ли такое окно с "WindowID(Windows)"
     
     ;SetFocus_(WindowID(Windows)) ; Установыть фокус на окно с "WindowID(Windows)"
    ;OldGadgetList = UseGadgetList(WindowID(Windows)) ; Выбирает окно с "WindowID(Windows)", к которому будут добавлятся гаджеты
     ;CanvasGadget(#CanvasGadget, 0, 0, WindowWidth(Windows), WindowHeight(Windows)) : DisableGadget(#CanvasGadget,1)
     ;ResizeGadget(#CanvasGadget, 0, 0, WindowWidth(Windows), WindowHeight(Windows)): DisableGadget(#CanvasGadget,1)
     If StartDrawing(Output) ; рисуем на канвасе.
       For i = 4 To (OutputWidth())-1 Step 10
        For j = 4 To (OutputHeight())-1 Step 10
         Plot(i, j , 0)
       Next :Next
       StopDrawing()
      EndIf
    ;UseGadgetList(OldGadgetList) ; Возвращает WindowID предыдущего окна.
  Else
   MessageBox_(0,"В процедуре - DrawPoints"+#CRLF$+" (Window) - ID не указан,"+#CRLF$+"или указан не сушествующий - ID!","Сообщение",0)
  EndIf
 EndProcedure
 Procedure DrawPenRect(Output, Pen, PenColor=0, PenWidth=0, BoxColor=0)
   hdc = StartDrawing(Output)
   If BoxColor=0
     BoxColor=$FFFFFF
   EndIf
   If hdc
   DrawingMode(#PB_2DDrawing_Outlined)
   Box(0, 0, OutputWidth(), OutputHeight(), BoxColor)
   ;// Создаем перо
   hpen = CreatePen_(Pen, PenWidth, PenColor);
   hpenOld = SelectObject_(hdc, hpen);
   Rectangle_(hdc, MouseSelectStartX,MouseSelectStartY,MouseSelectLastX,MouseSelectLastY);
   ;SmartWindowRefresh(window,0)
   
                 
   ;// Не забывайте очищать.
   SelectObject_(hdc, hpenOld);
   DeleteObject_(hpen)
    ;RestoreDC_(hdc, -1)
   StopDrawing()
  EndIf
 EndProcedure  
 Procedure Event(hWnd,Msg,wParam,lParam)
   
   
   Select Msg
     Case #WM_PAINT
       
     Case 799
     Case #PB_Event_Repaint
     Case #WM_SIZING
     Case #WM_RBUTTONDOWN
     Case #WM_LBUTTONDOWN
     Case #WM_LBUTTONUP
     Case #WM_MOUSEMOVE
     Case #PB_Event_Gadget
      Select EventGadget()
       Case 1
        Select EventType()
         Case #PB_EventType_LeftButtonDown ;#WM_LBUTTONDOWN
           SelectMouse  = 1
           MouseSelectStartX = WindowMouseX(Window)
           MouseSelectStartY = WindowMouseY(Window)
           
         Case #PB_EventType_MouseMove ;#WM_MOUSEMOVE
           MouseSelectLastX = WindowMouseX(Window);-MouseSelectStartX
           MouseSelectLastY = WindowMouseY(Window);-MouseSelectStartY
           
           If SelectMouse > 0 ;And wParam & #MK_LBUTTON
             If SelectMouse > 1
               DrawPenRect(CanvasOutput(1), #PS_DOT)
               Else
               SelectMouse+1
             EndIf
             
           EndIf
           
         Case #PB_EventType_LeftButtonUp ;#WM_LBUTTONUP
           ;Debug MouseSelectStartX
           ;Debug MouseSelectLastX
           SelectMouse =0
           
           
         Default
       EndSelect    
      EndSelect
     Default    
       
   EndSelect
   ProcedureReturn #PB_ProcessPureBasicEvents
 EndProcedure :SetWindowCallback(@Event())
 
 OpenWindow(0, 0, 0, 600, 600, "2DDrawing Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget| #PB_Window_SizeGadget)
 CanvasGadget(1, 0, 0, 600, 600)
 Repeat
   Event=WaitWindowEvent()
  If Event
    Select Event
     Case  #PB_Event_CloseWindow
       End
     Case #PB_Event_SizeWindow
       ResizeGadget(1, 0, 0, WindowWidth(0), WindowHeight(0))  
     Case #PB_Event_Repaint
      DrawPointsPlot(0, CanvasOutput(1))
      ;DrawPenRect(CanvasOutput(1),hpenOld)  
    EndSelect
  EndIf
 
If Event=#PB_Event_Gadget;если событие гаджетов
    Gadget=EventGadget()
     Select Gadget  
       Case 1;если событие гаджета (CanvasGadget(1))
         Select EventType()
           Case #PB_EventType_LeftButtonDown ;#WM_LBUTTONDOWN
            SelectMouse  = 1
            MouseSelectStartX = WindowMouseX(0)
            MouseSelectStartY = WindowMouseY(0)  
           Case #PB_EventType_MouseMove ;#WM_MOUSEMOVE
            MouseSelectLastX = WindowMouseX(0);-MouseSelectStartX
            MouseSelectLastY = WindowMouseY(0);-MouseSelectStartY
            If SelectMouse > 0 ;And wParam & #MK_LBUTTON
             If SelectMouse > 1
               DrawPenRect(CanvasOutput(1), #PS_DOT)
              Else
               SelectMouse+1
             EndIf
             DrawPointsPlot(0, CanvasOutput(1))
           EndIf
           RedrawWindow_(GadgetID(1), 0, 0, #RDW_UPDATENOW|#RDW_ALLCHILDREN)  
         Case #PB_EventType_LeftButtonUp ;#WM_LBUTTONUP
           ;Debug MouseSelectStartX
           ;Debug MouseSelectLastX
           SelectMouse =0
          Default
        EndSelect    
    EndSelect  
EndIf      
ForEver
 
 



Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт сен 06, 2013 6:19 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Вс дек 09, 2012 9:02 pm
Сообщений: 780
Откуда: Дагестан
Благодарил (а): 0 раз.
Поблагодарили: 14 раз.
Пункты репутации: 0
Сергейчик Я твой юмор не понял.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт сен 06, 2013 6:51 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт июн 25, 2009 1:02 pm
Сообщений: 2329
Откуда: Russia — Belarus
Благодарил (а): 7 раз.
Поблагодарили: 75 раз.
Пункты репутации: 11
В чем именно проблема? В том, что при уменьшении рамки появляется шлейф в Windows-стиле?
Что надо сделать? Простой канвас с таким выделением? Просто по-моему проще код переписать с нуля (для меня).

_________________
EnableExplicit User


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт сен 06, 2013 7:03 pm 
Не в сети
PureBasic Coder
Аватар пользователя

Зарегистрирован: Чт ноя 10, 2011 10:50 am
Сообщений: 4049
Откуда: Ростов-на-Дону
Благодарил (а): 71 раз.
Поблагодарили: 81 раз.
Пункты репутации: 24
А это обязательно, чтобы прежние рисунки оставались??

_________________
Пурик - лучший язык программирования


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт сен 06, 2013 8:35 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Вс дек 09, 2012 9:02 pm
Сообщений: 780
Откуда: Дагестан
Благодарил (а): 0 раз.
Поблагодарили: 14 раз.
Пункты репутации: 0
Цитата:
В чем именно проблема? В том, что при уменьшении рамки появляется шлейф в Windows-стиле?
да чтобы следы не оставались.
вот эту строку убираю
Код:
1
2
DrawingMode(#PB_2DDrawing_Outlined)
 

на первый взгляд все хорошо, но это не подходить мерцание много. Как будто постоянно перерисовывается.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вс сен 08, 2013 7:51 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Вс дек 09, 2012 9:02 pm
Сообщений: 780
Откуда: Дагестан
Благодарил (а): 0 раз.
Поблагодарили: 14 раз.
Пункты репутации: 0
вот подобые этой функции никто не знает?
Код:
1
ValidateRect_(WindowID(0), #Null)

но более эффективной.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вс сен 08, 2013 10:42 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Вс дек 09, 2012 9:02 pm
Сообщений: 780
Откуда: Дагестан
Благодарил (а): 0 раз.
Поблагодарили: 14 раз.
Пункты репутации: 0
в дельфи вот эта строка убирает следы
Код:
1
Pen.Mode := pmXor;


но как в пурике применить не нахожу.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вс сен 08, 2013 10:47 am 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11587
Благодарил (а): 4 раз.
Поблагодарили: 485 раз.
Код:
1
DrawingMode(#PB_2DDrawing_XOr)


_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: пунктирное выделение
СообщениеДобавлено: Сб дек 21, 2013 9:49 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Вс дек 09, 2012 9:02 pm
Сообщений: 780
Откуда: Дагестан
Благодарил (а): 0 раз.
Поблагодарили: 14 раз.
Пункты репутации: 0
Не получается чтобы линия чертилась поверх гаджетов, помогите.
Код:
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
Procedure  DrawPointsPlot(ID,BoxColor=0,PlotColor=0,Distance=8) 
Protected  hDC
 Protected hWnd :If WindowID < 9999 :hWnd=WindowID(ID) :Else :hWnd=WindowID :EndIf
 If BoxColor=0 :BoxColor=RGB(239,239,239) :EndIf
  If PlotColor=0 :PlotColor=RGB(5,5,5) :EndIf
 hDC = CreateImage(#PB_Any, distance, distance)
  If hDC
     If StartDrawing(ImageOutput(hDC)) ; рисуем на канвасе.
        Box(0, 0, distance, distance, BoxColor)
         Plot(0, 0, PlotColor)
        StopDrawing()
      EndIf
    SetClassLongPtr_(hWnd, #GCL_HBRBACKGROUND, CreatePatternBrush_(ImageID(hDC)))
  InvalidateRect_(hWnd, 0, #True)
 EndIf
EndProcedure
 
 
; ----------------------------------------------
;{- выделение области для выделения Gadgetов         ; No
;-- выделение области для выделения Gadgetов
; ----------------------------------------------
Procedure GetSelectGadgets(Window,*FrameSize.RECT)
 
EndProcedure
 
Procedure SelectSelector(Window,*MouseSelectStart.RECT, Color=0)
 Protected .RECT MouseSelectStop
 Protected Click = Abs(GetAsyncKeyState_(#VK_LBUTTON) + GetAsyncKeyState_(#VK_RBUTTON)*3 + GetAsyncKeyState_(#VK_MBUTTON)*2)/$8000  
 Static SelectWindow
 If  Click=1
  If IsWindow(Window) :hWnd= WindowID(Window);GetDesktopHandle()
   If hWnd= ChildWindowFromPoint_(hWnd,WindowMouseX(Window)|(WindowMouseY(Window)<<32) )
    SelectWindow=1
   EndIf
  Else
   MessageBox_(0,"В процедуре - DrawPoints"+#CRLF$+" (Window) - ID не указан,"+#CRLF$+"или указан не сушествующий - ID!","Сообщение",0)
  EndIf
 Else
    SelectWindow=0
 EndIf
 If *MouseSelectStart\left > *MouseSelectStart\right
    MouseSelectStop\left   = *MouseSelectStart\right
    MouseSelectStop\right  = *MouseSelectStart\left
  Else
    MouseSelectStop\left   = *MouseSelectStart\left
    MouseSelectStop\right  = *MouseSelectStart\right
  EndIf
 If *MouseSelectStart\top > *MouseSelectStart\bottom
    MouseSelectStop\top    = *MouseSelectStart\bottom
    MouseSelectStop\bottom = *MouseSelectStart\top
  Else
    MouseSelectStop\top    = *MouseSelectStart\top
    MouseSelectStop\bottom = *MouseSelectStart\bottom
  EndIf
 
 If SelectWindow
  ;чтобы убрать мерцание гаджетов
   If GetWindowLong_(hWnd, #GWL_STYLE) & #WS_CLIPCHILDREN = #False
     SetWindowLong_(hWnd,#GWL_STYLE, GetWindowLong_(hWnd, #GWL_STYLE)|#WS_CLIPCHILDREN)
    EndIf
   If Color =0 :hPenColor= RGB(51,153,255)
     Else :hPenColor=Color :EndIf
   
   InvalidateRect_(hWnd,0,#True)
   UpdateWindow_(hWnd)
    hDC = GetDC_(hWnd)
   If hDC
      hBrush = GetStockObject_(#HOLLOW_BRUSH) ; Прозрачная кисть.
      hBrushOld = SelectObject_(hdc, hBrush)    ;делаем кисть активной
      SetBkMode_(hdc, #TRANSPARENT) ;убрать белый фон между линиями
      hpen = CreatePen_(#PS_DASHDOT, 1, hPenColor);
      hpenOld = SelectObject_(hdc, hpen);
      ;ClientToScreen_(hWnd,*MouseSelectStart)
      ;ScreenToClient_(hWnd,*MouseSelectStart)
      ;FrameRect_(hDC,@MouseSelectStop,hpen)
      Rectangle_(hdc, MouseSelectStop\left, MouseSelectStop\top, MouseSelectStop\right, MouseSelectStop\bottom)
      ;DrawFocusRect_(hDC,@MouseSelectStop)
     
     SelectObject_(hdc, hpenOld) :DeleteObject_(hpen)
      SelectObject_(hdc, hBrushOld) :DeleteObject_(hBrush)
      ReleaseDC_(hWnd,hDC)
   EndIf
  EndIf
 EndProcedure
 
Procedure DrawSelectSelector(Window, Color=0)
 Protected.RECT Size
 Static.RECT MouseSelectStart
 Static IsDown,Down
 With MouseSelectStart
  If \left > \right
    Size\left   = \right
    Size\right  = \left
  Else
    Size\left   = \left
    Size\right  = \right
  EndIf
  If \top > \bottom
    Size\top    = \bottom
    Size\bottom = \top
  Else
    Size\top    = \top
    Size\bottom = \bottom
  EndIf
  Size\right = Size\right-Size\left
  Size\bottom = Size\bottom-Size\top
 EndWith
 
    SelectSelector(Window,@MouseSelectStart.RECT,Color)
     If GetAsyncKeyState_(#VK_LBUTTON) :IsDown+1
      If IsDown=1 :Down=1
       MouseSelectStart\left = WindowMouseX(Window)
       MouseSelectStart\top = WindowMouseY(Window)
      EndIf
       MouseSelectStart\right = WindowMouseX(Window)
       MouseSelectStart\bottom = WindowMouseY(Window)
     Else    
     If Down=1 :IsDown=0 :Down=0
       If Size\left <> Size\top And Size\right <> Size\bottom
         GetSelectGadgets(Window,@MouseSelectStart.RECT)
       EndIf
     EndIf  
   EndIf
 EndProcedure  
;}
 
 
OpenWindow(1,0,0,400,400,"Mega Mouse Selector",#PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_Invisible| #PB_Window_SizeGadget)
DrawPointsPlot(1)
ButtonGadget(2,45,45,145,35,"правый клик на форме",#WS_CLIPSIBLINGS )
ButtonGadget(3,145,185,155,35,"чтобы увидить результать" )
HideWindow(1,0)
   
Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow :End
 
    Case #WM_MOUSEMOVE    
      DrawSelectSelector(1)
     
    Case #WM_LBUTTONUP, 13112
       hWnd=WindowID(1)
       InvalidateRect_(hWnd,0,#True)
       UpdateWindow_(hWnd)
     
   EndSelect
ForEver



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: пунктирное выделение
СообщениеДобавлено: Сб дек 21, 2013 10:29 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Вс дек 09, 2012 9:02 pm
Сообщений: 780
Откуда: Дагестан
Благодарил (а): 0 раз.
Поблагодарили: 14 раз.
Пункты репутации: 0
Я понимаю что, я черчу на окне раз так гаджет сверху окна и получается я черчу снизу гаджета, а чтобы эффект был такой который мне нужен я должен либо чертит на десктопе либо на прозрачном окне расположенной сверху, правильно ли я думаю?
На прозрачное окно не получается рамка тоже становится не видимой.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: пунктирное выделение
СообщениеДобавлено: Сб дек 21, 2013 6:57 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Вс дек 09, 2012 9:02 pm
Сообщений: 780
Откуда: Дагестан
Благодарил (а): 0 раз.
Поблагодарили: 14 раз.
Пункты репутации: 0
подскажите что делать куда копать, как чертить пунктир по верх гаджетов?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: пунктирное выделение
СообщениеДобавлено: Вс дек 22, 2013 9:43 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Вс дек 09, 2012 9:02 pm
Сообщений: 780
Откуда: Дагестан
Благодарил (а): 0 раз.
Поблагодарили: 14 раз.
Пункты репутации: 0
Оконые координаты превратить экраные как сделать?
Код:
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
    Procedure  DrawPointsPlot(ID,BoxColor=0,PlotColor=0,Distance=8)
    Protected  hDC
     Protected hWnd :If WindowID < 9999 :hWnd=WindowID(ID) :Else :hWnd=WindowID :EndIf
     If BoxColor=0 :BoxColor=RGB(239,239,239) :EndIf
      If PlotColor=0 :PlotColor=RGB(5,5,5) :EndIf
     hDC = CreateImage(#PB_Any, distance, distance)
      If hDC
         If StartDrawing(ImageOutput(hDC)) ; рисуем на канвасе.
            Box(0, 0, distance, distance, BoxColor)
             Plot(0, 0, PlotColor)
            StopDrawing()
          EndIf
        SetClassLongPtr_(hWnd, #GCL_HBRBACKGROUND, CreatePatternBrush_(ImageID(hDC)))
      InvalidateRect_(hWnd, 0, #True)
     EndIf
    EndProcedure
 
 
    ; ----------------------------------------------
    ;{- выделение области для выделения Gadgetов         ; No
    ;-- выделение области для выделения Gadgetов
    ; ----------------------------------------------
    Procedure GetSelectGadgets(Window,*FrameSize.RECT)
     
    EndProcedure
Global delta.RECT
    Procedure SelectSelector(Window,*MouseSelectStart.RECT, Color=0)
     Protected .RECT MouseSelectStop,s
     Protected Click = Abs(GetAsyncKeyState_(#VK_LBUTTON) + GetAsyncKeyState_(#VK_RBUTTON)*3 + GetAsyncKeyState_(#VK_MBUTTON)*2)/$8000  
     Static SelectWindow
     If  Click=1
      If IsWindow(Window) :hWnd= WindowID(Window);GetDesktopHandle()
       If hWnd= ChildWindowFromPoint_(hWnd,WindowMouseX(Window)|(WindowMouseY(Window)<<32) )
        SelectWindow=1
       EndIf
      Else
       MessageBox_(0,"В процедуре - DrawPoints"+#CRLF$+" (Window) - ID не указан,"+#CRLF$+"или указан не сушествующий - ID!","Сообщение",0)
      EndIf
     Else
        SelectWindow=0
     EndIf
     If *MouseSelectStart\left > *MouseSelectStart\right
        MouseSelectStop\left   = *MouseSelectStart\right
        MouseSelectStop\right  = *MouseSelectStart\left
      Else
        MouseSelectStop\left   = *MouseSelectStart\left
        MouseSelectStop\right  = *MouseSelectStart\right
      EndIf
     If *MouseSelectStart\top > *MouseSelectStart\bottom
        MouseSelectStop\top    = *MouseSelectStart\bottom
        MouseSelectStop\bottom = *MouseSelectStart\top
      Else
        MouseSelectStop\top    = *MouseSelectStart\top
        MouseSelectStop\bottom = *MouseSelectStart\bottom
      EndIf
     
     If SelectWindow
      ;чтобы убрать мерцание гаджетов
       If GetWindowLong_(hWnd, #GWL_STYLE) & #WS_CLIPCHILDREN = #False
         SetWindowLong_(hWnd,#GWL_STYLE, GetWindowLong_(hWnd, #GWL_STYLE)|#WS_CLIPCHILDREN)
        EndIf
       If Color =0 :hPenColor= RGB(51,153,255)
         Else :hPenColor=Color :EndIf
     
       InvalidateRect_(hWnd,0,#True)
       UpdateWindow_(hWnd)
       hWnd=0
        hDC = GetDC_(hWnd)
         ;ScreenToClient_(hWnd,*MouseSelectStart)
       ClientToScreen_(hWnd,@MouseSelectStop)
       s\left=MouseSelectStop\left-delta\left
       s\top=MouseSelectStop\top-delta\top
       
       ;ScreenToClient_(hWnd,@MouseSelectStop)
       s\right=MouseSelectStop\right-delta\right
       s\bottom=MouseSelectStop\bottom-delta\bottom
       ;ClientToScreen_(hWnd,*MouseSelectStart)
       
        If hDC
          hBrush = GetStockObject_(#HOLLOW_BRUSH) ; Прозрачная кисть.
          hBrushOld = SelectObject_(hdc, hBrush)    ;делаем кисть активной
          SetBkMode_(hdc, #TRANSPARENT) ;убрать белый фон между линиями
          hpen = CreatePen_(#PS_DASHDOT, 1, hPenColor);
          hpenOld = SelectObject_(hdc, hpen);
          ;FrameRect_(hDC,@MouseSelectStop,hpen)
          Rectangle_(hdc, s\left, s\top, s\right, s\bottom)
          ;Rectangle_(hdc, MouseSelectStop\left, MouseSelectStop\top, MouseSelectStop\right, MouseSelectStop\bottom)
          ;DrawFocusRect_(hDC,@MouseSelectStop)
         
         SelectObject_(hdc, hpenOld) :DeleteObject_(hpen)
          SelectObject_(hdc, hBrushOld) :DeleteObject_(hBrush)
          ReleaseDC_(hWnd,hDC)
       EndIf
      EndIf
     EndProcedure
     
    Procedure DrawSelectSelector(Window, Color=0)
     Protected.RECT Size
     Static.RECT MouseSelectStart
     Static IsDown,Down
     With MouseSelectStart
      If \left > \right
        Size\left   = \right
        Size\right  = \left
      Else
        Size\left   = \left
        Size\right  = \right
      EndIf
      If \top > \bottom
        Size\top    = \bottom
        Size\bottom = \top
      Else
        Size\top    = \top
        Size\bottom = \bottom
      EndIf
      Size\right = Size\right-Size\left
      Size\bottom = Size\bottom-Size\top
     EndWith
 
        SelectSelector(Window,@MouseSelectStart.RECT,Color)
         If GetAsyncKeyState_(#VK_LBUTTON) :IsDown+1
          If IsDown=1 :Down=1
           MouseSelectStart\left = DesktopMouseX();WindowMouseX(Window)
           MouseSelectStart\top = DesktopMouseX();WindowMouseY(Window)
           delta\left=MouseSelectStart\left-WindowX(Window)
           delta\top=MouseSelectStart\top-WindowY(Window)
       
          EndIf
           MouseSelectStart\right = DesktopMouseX();WindowMouseX(Window)
           MouseSelectStart\bottom = DesktopMouseX();WindowMouseY(Window)
           delta\right=delta\left
           delta\bottom=delta\top
       
         Else  
         If Down=1 :IsDown=0 :Down=0
           If Size\left <> Size\top And Size\right <> Size\bottom
             GetSelectGadgets(Window,@MouseSelectStart.RECT)
           EndIf
         EndIf
       EndIf
     EndProcedure
    ;}
     
     
    OpenWindow(1,0,0,400,400,"Mega Mouse Selector",#PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_Invisible| #PB_Window_SizeGadget)
    DrawPointsPlot(1)
    ButtonGadget(2,45,45,145,35,"правый клик на форме",#WS_CLIPSIBLINGS )
    ButtonGadget(3,145,185,155,35,"чтобы увидить результать" )
    HideWindow(1,0)
       
    Repeat
      Select WaitWindowEvent()
        Case #PB_Event_CloseWindow :End
     
        Case #WM_MOUSEMOVE  
          DrawSelectSelector(1)
         
        Case #WM_LBUTTONUP, 13112
           hWnd=WindowID(1)
           InvalidateRect_(hWnd,0,#True)
           UpdateWindow_(hWnd)
         
       EndSelect
    ForEver



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: пунктирное выделение
СообщениеДобавлено: Вс дек 22, 2013 10:39 pm 
Не в сети
PureBasic Coder
Аватар пользователя

Зарегистрирован: Чт ноя 10, 2011 10:50 am
Сообщений: 4049
Откуда: Ростов-на-Дону
Благодарил (а): 71 раз.
Поблагодарили: 81 раз.
Пункты репутации: 24
Цитата:
Оконые координаты превратить экраные как сделать?
Прибавить к ним координаты окна. Например, ScreenX = оконная координата X + WindowX (...)

_________________
Пурик - лучший язык программирования


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: пунктирное выделение
СообщениеДобавлено: Пн дек 23, 2013 12:12 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Вс дек 09, 2012 9:02 pm
Сообщений: 780
Откуда: Дагестан
Благодарил (а): 0 раз.
Поблагодарили: 14 раз.
Пункты репутации: 0
вроде бы нашел толь ко при быстром перемещении мыши дергается можно ли это побороть?
Код:
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
; RectangleSelector.pb
    ; by BasicallyPure
    ; 12/13/2013
    ; PB 5.21 LTS(x86)
    ; windows only
    ;
    ; Purpose: Use the mouse to select a rectangular area on a window.
    ; You can drag the selection rectangle with the mouse or resize the
    ; selection by draging the small square in the lower right corner.
    ; Clicking outside the selection will remove the selection rectangle.
    ; The structured variable 'selection.SelType' will contain the x y
    ; boundaries of the selected area.
 
    ;EnableExplicit
 
 
    #WinNum = 0
   
    Procedure SelectArea()
       ; Use the mouse to select an area on a window.
       
       Static active
       Static.i x, y, lenX, lenY, lastX, lastY, boxSet
       Protected.i drag, stretch, msx, msy, ox, oy
       Protected Win = GetActiveWindow(),hdc,pen
     
       With selection
          x = WindowMouseX(Win)
          y = WindowMouseY(Win)
       
         
         
          While WaitWindowEvent(99) <> #WM_LBUTTONUP
            hdc=StartDrawing(WindowOutput(Win))
                DrawingMode(#PB_2DDrawing_XOr)
                If active = #True
                   ; erase previous selection rectangle
                   hBrush = GetStockObject_(#HOLLOW_BRUSH) ; Прозрачная кисть.
                   hBrushOld = SelectObject_(hdc, hBrush)    ;делаем кисть активной
                    SetBkMode_(hdc, #TRANSPARENT) ;убрать белый фон между линиями
                   hpen = CreatePen_(4, 1, hPenColor);
                   hpenOld = SelectObject_(hdc, hpen);
     
                   
                   Rectangle_(hdc, lastX, lastY, lastX + lenX, lastY + lenY)
     
                   ;LineXY(lastX, lastY, lastX + lenX, lastY, 0)
                  ; LineXY(lastX, lastY, lastX, lastY + lenY, 0)
                   ;LineXY(lastX, lastY + lenY, lastX + lenX, lastY + lenY, 0)
                   ;LineXY(lastX + lenX, lastY, lastX + lenX, lastY + lenY, 0)
                Else
                   ; activate for a new or freshly updated image
                   active = #True
                  ; lastX = x
                   ;lastY = y
                   ;boxSet = #False
                EndIf
               
                msx = WindowMouseX(Win)
                msy = WindowMouseY(Win)
                lenX = msx - x
                lenY = msy - y
                   
                Rectangle_(hdc, lastX, lastY, lastX + lenX, lastY + lenY)
               
                ; draw the selection rectangle
                ;LineXY(x, y, x + lenX, y, 0)
                ;LineXY(x, y, x, y + lenY, 0)
                ;LineXY(x, y + lenY, x + lenX, y + lenY, 0)
                ;LineXY(x + lenX, y, x + lenX, y + lenY, 0)
               
                lastX = x
                lastY = y
             StopDrawing()
       
           Wend
         
      EndWith
       
     
    EndProcedure
 
If OpenWindow(#WinNum,0,0,750,500,"Rectangle Selection Demo",#PB_Window_ScreenCentered | #PB_Window_SystemMenu)
      CanvasGadget(0,100,10,55,55)
       
       ButtonGadget(1,180,20,80,30,"Unselect")
       
     
       Repeat ; event loop
          Select WaitWindowEvent()
             Case #PB_Event_CloseWindow
                Break
             Case #WM_LBUTTONDOWN
                SelectArea()
          EndSelect
       ForEver
    EndIf



Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 27 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: Assay, MAKER BTC2, Render и гости: 11


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB