Изменение линий

Для свой программы захотелось изменить отображаемые линии.


If OpenWindow(0, 0, 0, 640, 480, "CanvasGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  CanvasGadget(0, 0, 0, 640, 480)
  
 hdc=StartDrawing(CanvasOutput(0))
 ;Box(0,0,640,480,0)
 If hdc
   hpen1=CreatePen_(#PS_SOLID,1,RGB(0,0,0))
   SelectObject_(hdc,hpen1)
   MoveToEx_(hdc,50,30,0)
   LineTo_(hdc,300,30)
   DeleteObject_(hpen1)
   
   hpen2=CreatePen_(#PS_DASH,1,RGB(0,0,0))
   SelectObject_(hdc,hpen2)
   MoveToEx_(hdc,50,50,0)
   LineTo_(hdc,300,50)
   SelectObject_(hdc,hpen2)
   MoveToEx_(hdc,50,70,0)
   LineTo_(hdc,300,70)
   DeleteObject_(hpen2)
   
   hpen3=CreatePen_(#PS_DOT,1,RGB(0,0,0))
   SelectObject_(hdc,hpen3)
   MoveToEx_(hdc,50,90,0)
   LineTo_(hdc,300,90)
   DeleteObject_(hpen3)
   
   hpen4=CreatePen_(#PS_DASHDOT,1,RGB(0,0,0))
   SelectObject_(hdc,hpen4)
   MoveToEx_(hdc,50,110,0)
   LineTo_(hdc,300,110)
   DeleteObject_(hpen4)
   
   hpen5=CreatePen_(#PS_DASHDOTDOT,1,RGB(0,0,0))
   SelectObject_(hdc,hpen5)
   MoveToEx_(hdc,50,130,0)
   LineTo_(hdc,300,130)
   DeleteObject_(hpen5)
    StopDrawing()
  Else
    Debug "err draw"
  EndIf 
  Repeat
    Event = WaitWindowEvent()
    
    
  Until Event = #PB_Event_CloseWindow
EndIf

If OpenWindow(0, 0, 0, 640, 480, "CanvasGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  CanvasGadget(0, 0, 0, 640, 480)
  
  lb.LOGBRUSH
;// Инициализация кисти пера.
 lb\lbStyle = #BS_SOLID; 
 lb\lbColor = RGB(255,0,0); 
 lb\lbHatch = 0           ; 
 
 hdc=StartDrawing(CanvasOutput(0))
 ;Box(0,0,640,480,0)
  If hdc
    For i=0 To 5
      Select i
          Case 0:dwPenStyle=#PS_DASH
          Case 1:dwPenStyle=#PS_DASHDOT
          Case 2:dwPenStyle=#PS_DOT
          Case 3:dwPenStyle=#PS_INSIDEFRAME
          Case 4:dwPenStyle=#PS_NULL
          Case 5:dwPenStyle=#PS_SOLID
        EndSelect
; HPEN ExtCreatePen(
;     DWORD dwPenStyle, // pen style 
;     DWORD dwWidth, // pen width 
;     CONST LOGBRUSH *lplb, // pointer To Structure For brush attributes 
;     DWORD dwStyleCount, // length of Array containing custom style bits 
;     CONST DWORD *lpStyle // optional Array of custom style bits 
;    );
    hPen = ExtCreatePen_(#PS_COSMETIC | dwPenStyle,1, @lb, 0, 0); 
    hPenOld = SelectObject_(hdc, hPen); 
    MoveToEx_(hdc, i * 20, 0, 0); 
    LineTo_(hdc, i * 20, 480); 
    SelectObject_(hdc, hPenOld); 
    DeleteObject_(hPen); 
  Next i
  For i=0 To 5
    Select i
        Case 0:lbh=#HS_BDIAGONAL
        Case 1:lbh=#HS_CROSS
        Case 2:lbh=#HS_DIAGCROSS
        Case 3:lbh=#HS_FDIAGONAL
        Case 4:lbh=#HS_HORIZONTAL
        Case 5:lbh=#HS_VERTICAL
    EndSelect
   lb\lbStyle = #BS_HATCHED; 
   lb\lbColor = RGB(0,0,255);     
   lb\lbHatch = lbh
   hPen = ExtCreatePen_(#PS_GEOMETRIC, 5, @lb, 0, 0); 
   hPenOld = SelectObject_(hdc, hPen); 
   MoveToEx_(hdc, 150 + (i * 20), 0, 0); 
   LineTo_(hdc, 150 + (i * 20), 480); 
   SelectObject_(hdc, hPenOld); 
   DeleteObject_(hPen); 
Next i
  
    StopDrawing()
  Else
    Debug "err draw"
  EndIf 
  Repeat
    Event = WaitWindowEvent()
    
    
  Until Event = #PB_Event_CloseWindow
EndIf
If OpenWindow(0, 0, 0, 640, 480, "Custom Brush", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  CanvasGadget(0, 0, 0, 640, 480)
  
  hBtm = CreateBitmap_(8, 8, 1, 1, ?bits8)
 hdc=StartDrawing(CanvasOutput(0))
 ;Box(0,0,640,480,0)
 If hdc
hCustomBrush = CreatePatternBrush_(hBtm);
hOldBrush = SelectObject_(hdc, hCustomBrush);
SelectObject_(hdc, GetStockObject_(#NULL_PEN));
Rectangle_(hdc, 20, 20, 250, 160);
SelectObject_(hdc, hOldBrush);
DeleteObject_(hCustomBrush);
SelectObject_(hdc, GetStockObject_(#BLACK_PEN));
    StopDrawing()
  Else
    Debug "err draw"
  EndIf 
  Repeat
    Event = WaitWindowEvent()
    
    
  Until Event = #PB_Event_CloseWindow
EndIf

DataSection
  bits8:
Data.l $111111ff, $ffffffff, $ffffffff, $ffffffff,$00000000, $00000000, $00000000, $00000000

Но от линий пришлось отказаться, так как у GDI нет режима рисования, как в PureBasic - наложение цвета операцией XOR.

Комментарии