Version 4 of Dash lines on Windows

Updated 2007-02-21 09:25:23

HJG On Linux, it works correctly: the drawings left and right are drawn with dashed lines. On Windows, the dash-pattern is ignored when the width is 2 or more.


 #!/bin/bash
 # the next line restarts using wish \
   exec /usr/bin/wish "$0" "$@"

 #: WinDash.tcl - HaJo Gurt - 2005-07-13
 #: Bug-Demo: On Windows, dash-patterns only work with width 1

 #########1#########2#########3#########4#########5#########6#########7#####

  package require Tk

  grid [canvas .c -width 300 -height 325]

  # Dash-patterns: {2 4}  {2 8}  {6 4}  {6 4 2 4}  {6 4 2 4 2 4}

  .c create oval  25  25  125 125  -width 1 -dash {2 4}  -fill grey60
  .c create oval 175  25  275 125  -width 2 -dash .  

  .c create line  20 150  130 150  -fill grey30  -width 1  -dash {6 4 2 4 2 4} 
  .c create line 170 150  280 150                -width 2  -dash {6 4 2 4} 

  for {set y 170} {$y<=180} {incr y} {   # crude workaround for thick dashed line:
    .c create line  20 $y  280 $y  -fill grey30  -width 1  -dash {2 4 6 4}  ;# -dash .-
  }

  .c create rect  25 200  125 300  -fill grey70  -width 1  -dash {6 4}
  .c create rect 175 200  275 300                -width 2  -dash -

The tcl-help text says "all values in the dash list will be multiplied by the line width before display. This assures that "." will always be displayed as a dot and "-" always as a dash regardless of the line width."

But on Windows, it looks like the dash-pattern is ignored when the width is 2 or more.


bch I am running into this same problem. I develop a map application on an X11 system (FreeBSD) and deploy it on Windows. As you say, the dashed lines are drawn as specified on a non-Windows platform, but Windows won't do it "right." Unfortunately, the end-users of my application won't be moving to a non-Windows platform, thus I'm stuck trying to figure out how to get around this problem.

I did some quick perusing of the Tk code, and I will summarize what I found below. (Note that I'm not a Tcl/Tk developer which means I could be missing some nuances and details.)

The Windows dash support can be found in the file tk/win/tkWinDraw.c [L1 ].

The code of interest is in the SetUpGraphicsPort function starting on line 1182. I couldn't see any reason why this function would cause the problems we are seeing.

Then I did some other searching and found this site [L2 ] (MSDN). It has this to say:

"CreatePen returns a pen with the specified width bit with the PS_SOLID style if you specify a width greater than one for the following styles: PS_DASH, PS_DOT, PS_DASHDOT, PS_DASHDOTDOT."

This is corroborated a little more clearly at this site [L3 ] where it says:

"This means that, if you specify the style as PS_DASH, PS_DOT, PS_DASHDOT, or PS_DASHDOTDOT but set a width higher than 1, the line would be drawn as PS_SOLID."

The bottom line appears to be this: This is a Windows-specific problem, and overcoming that using the current methodology is probably not an option. I suppose one could write their own line drawing routines, etc. (ouch)


HE 21.02.2007 All the following dashed items works like expected (8.4.7 and 8.4.14 on w2000):

 grid [canvas .c -width 1025 -height 345]
 .c create oval  25  25  125 125  -width 1 -dash .  -fill grey60 
 .c create oval 150  25  250 125  -width 2 -dash .  -fill grey60
 .c create oval 275  25  375 125  -width 1 -dash -  -fill grey60 
 .c create oval 400  25  500 125  -width 2 -dash -  -fill grey60
 .c create oval 525  25  625 125  -width 1 -dash ,  -fill grey60
 .c create oval 650  25  750 125  -width 2 -dash ,  -fill grey60
 .c create oval 775  25  875 125  -width 1 -dash _  -fill grey60
 .c create oval 900  25 1000 125  -width 2 -dash _  -fill grey60


 .c create rect 25  130  125 230  -width 1 -dash .  -fill grey60 
 .c create rect 150  130  250 230  -width 2 -dash .  -fill grey60
 .c create rect 275  130  375 230  -width 1 -dash -  -fill grey60 
 .c create rect 400  130  500 230  -width 2 -dash -  -fill grey60
 .c create rect 525 130  625 230  -width 1 -dash ,  -fill grey60
 .c create rect 650 130  750 230  -width 2 -dash ,  -fill grey60
 .c create rect 775  130  875 230  -width 1 -dash _  -fill grey60
 .c create rect 900  130  1000 230  -width 2 -dash _  -fill grey60


 .c create rect 25  235  125 335  -width 1 -dash .-  -fill grey60 
 .c create rect 150  235  250 335  -width 2 -dash .-  -fill grey60
 .c create rect 275  235  375 335  -width 1 -dash -.  -fill grey60 
 .c create rect 400  235  500 335  -width 2 -dash -.  -fill grey60

Category Example | Category GUI