TclGDI

TclGDIはtclウインドウに図形を描画する機能です。

@はじめにキャンバスウインドウを作成します。
A次に、そのキャンバスに図形オブジェクトを作成します。
図形オブジェクトはレイヤと図形タイプを与えて作成します。
B作成したオブジェクトにジオメトリを与えます。
TEXTオブジェクトの場合はラベルも与えます。
C表示スタイルはレイヤに対して与えます。
従って、表示スタイルが異なる図形オブジェクトはレイヤを分ける必要があります。

A−Bの繰り返しで作成された図形オブジェクトの再描画は自動的に行われます。
尚、サンプルプログラムでは、GDI名前空間にGDIコマンドをマクロ化したプロシージャが定義されており、それをmainで使用しています。

 


  ■キャンバスウインドウ作成
  ■図形オブジェクト作成
  ■ジオメトリのセット 
  ■ジオメトリの追加
  ■テキストオブジェクトのラベルセット
  ■レイヤの表示プロパティセット
  ■オブジェクト表示
  ■デバイスコンテキストを得る
  ■デバイスコンテキストの解放
  ■レイヤ削除
  ■サンプルプログラム
 

 

キャンバスウインドウ作成

図形オブジェクトを配置するキャンバスウインドウを作成します。
キャンバスウインドウのバックグラウンド色は透明です。
従って、キャンバスがコントロールを覆ってもコントロールは使用可能です。

gdi CreateCanvas $hwnd $x $y $w $h

$hwnd/Tclウインドウのウインドウハンドル
$x $y/キャンバスの左上ピクセル座標
$w $h/キャンバスの幅と高さ(ピクセル)
戻り値/キャンバスウインドウハンドル。失敗すると0が返される。


図形オブジェクト作成

gdi CreateObject $hwnd $layer $graphic_type

$hwnd/キャンバスウインドウハンドル
$layer/レイヤ番号
$graphic_type/図形タイプ
LINE:0 CIRCLE:1 STRING:2 POLYGON:3 TEXT:4 SYMBOL:5
戻り値/オブジェクトハンドル。失敗すると0が返される。


ジオメトリのセット

頂点は図形タイプに必要なだけ与えます。
足りないと表示され、多いと無視されます。
円の場合は $x2 が半径です。
ポリゴンの場合、始点と一致する終点座標は与えません。

gdi SetGeometry $obj $x1 $y1......$xn $yn

$obj/オブジェクトハンドル(CreateObjectの戻り値)
$x1 $y1/始点
$xn $yn/頂点
戻り値/頂点数


ジオメトリの追加

gdi AddGeometry $obj $x1 $y1.....

$obj/オブジェクトハンドル(CreateObjectの戻り値)
$x1 $y1/追加頂点座標
戻り値/追加後の頂点数


テキストオブジェクトのラベルセット

gdi SetName $obj $label

$obj/オブジェクトハンドル(CreateObjectの戻り値)
$lavel/テキストラベル


レイヤの表示プロパティセット

gdi SetLayerProperty $hwnd $layer $property1 $val....

$hwnd/キャンバスウインドウハンドル
$layer/レイヤ番号
$property1 $val/プロパティ種類とその値
■前景色をRGBでセット/ rgb $r $g $b
■背景色をRGBでセット/brgb $r $g $b
■ハッチング色をRGBでセット/hrgb $r $g $b
■背景塗りつぶしスイッチ/paint onまたはpaint off
(ハッチングされるポリゴン・円及び文字列背景に働く)
■線幅をピクセル値でセット/width $w
■線種を予約語でセット/ style
次の5種のいずれか(soliddashdotdoshdotnull)
■テキスト配置原点を予約語でセット/mode
次の9種のいずれか (LTCTRTLCCCRCLBCBRB)
■塗り潰しブラシを予約語でセット/ brush
次の10種のいずれか
(nullrightdown crosscross45leftdownhorizontalvertical
pattern$handle bmp$handle
フォントセット font $name $type)


オブジェクト表示

gdi Display Object $hwnd $obj $mode

$hwnd/キャンバスウインドウハンドル
$obj/オブジェクトハンドル(CreateObjectの戻り値)
$mode/表示モード 0:通常表示 1:XOR表示
memoあらかじめGetDCが実行されている必要がある。


デバイスコンテキストを得る

gdi OpenDC $hwnd

$hwnd/キャンバスウインドウハンドル
戻り値/デバイスコンテキストハンドル。
GDIでは直接は使用しないがDisplayObjectに先立ち実行される必要がある。


デバイスコンテキストの解放

gdi CloseDC $hwnd

$hwnd/キャンバスウインドウハンドル


レイヤ削除

レイヤをそれに含まれるオブジェクトとともに削除します。

gdi RemoveLayer $hwnd $layer

$hwnd/キャンバスウインドウハンドル
$Layer/レイヤ番号


サンプルプログラム

#=======================================================
# サンプルプログラム
#    SampleGDI.tcl
# 実行 tclWin.exe SampleGDI.tcl
#=======================================================
proc main {} {

  # ウインドウ作成
  gui window MAIN TestGDI 10 10 300 300
  gui button .B ここをクリック 5 240 7w 1.2h buttonProc

  # キャンバス作成
  set hcanvas [CreateCanvas MAIN x 0 y 0 w 250 h 250]

  # レイヤ作成
  CreateLayer $hcanvas layer

  # ラインオブジェクト作成
  set obj [gdi $layer(ライン).newobject]
  gdi $obj.xy 0 0 100 100
  set obj [gdi $layer(ライン).newobject]
  gdi $obj.xy 0 100 100 0

  # 円オブジェクトを5個作成(Layer=1)
  for {set x 100;set y 100} {$x <=200} {incr x 20; incr y 20} {
      set obj [gdi $layer(円).newobject]
      gdi $obj.xy $x $y
      gdi $obj.radius 50
  }

  # ポリゴンオブジェクト作成
  set obj [gdi $layer(ポリゴン).newobject]
  gdi $obj.xy 10 10 200 10 200 30 10 30

  # 文字オブジェクト作成(Layer=3)
  set obj [gdi $layer(文字).newobject]
  gdi $obj.xy 200 200
  gdi $obj.name 文字列

  gui display MAIN
}

proc buttonProc {bname} {
  if {[gui ok "このようにキャンバスに覆われてもコントロールは使えます\r
    さて、終了しますか?"]} {
    gui close MAIN
  }
}


# キャンバス作成(透過キャンバス)
proc CreateCanvas {parent args} {
  set hwnd [gui get $parent hwnd]
  foreach prm "x y w h" {
    set index [lsearch $args $prm]
    if {$index<0} {return 0}
    set $prm [lindex $args [expr $index+1]]
  }
  return [gdi CreateCanvas $hwnd $x $y $w $h]
}

# レイヤ作成(ライン,円,ポリゴン,文字)
proc CreateLayer {hcanvas *layer} {
  upvar ${*layer} layer
  array set type {
    road     1
    circle     2
    string    3
    line     3
    polygon    4
    text     5
    symbol    6
    symbolline  7
    symbolpolygon 8
    bmp      10
    areatext   11
    arc      12
    fan      13
    rectangle   15
    square    16
    view     17
  }

  set layer(ライン) [gdi $hcanvas.newlayer ライン $type(string)]
  gdi $layer(ライン).property \
            rgb 0 0 0 \
            style solid \
            width 1 \
            brgb 0 0 255 \
            brush solid

  set layer(ポリゴン) [gdi $hcanvas.newlayer ポリゴン $type(polygon)]
  gdi $layer(ポリゴン).property \
            rgb 0 0 0 \
            style solid \
            width 1 \
            paint on \
            brgb 255 255 255 \
            brush CROSS45 \
            hrgb 255 255 0
  set layer(円) [gdi $hcanvas.newlayer 円 $type(circle)]
  gdi $layer(円).property \
            style solid \
            rgb 255 0 0 \
            width 1 \
            paint on \
            brush solid \
            hrgb 255 255 0

  set layer(文字) [gdi $hcanvas.newlayer 文字 $type(text)]
  gdi $layer(文字).property \
            rgb 255 255 0 \
            mode RB \
            paint on \
            brgb 0 0 255 \
            font "MS 明朝" 標準 15
}

main

########## サンプルプログラム終了 ##################

 

(C)FreeSoftNet,Inc.