|
図形オブジェクトを配置するキャンバスウインドウを作成します。
キャンバスウインドウのバックグラウンド色は透明です。
従って、キャンバスがコントロールを覆ってもコントロールは使用可能です。
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種のいずれか(solid・dash・dot・doshdot・null)
■テキスト配置原点を予約語でセット/mode
次の9種のいずれか (LT・CT・RT・LC・CC・RC・LB・CB・RB)
■塗り潰しブラシを予約語でセット/ brush
次の10種のいずれか
(null・rightdown ・cross・cross45・leftdown・horizontal・vertical・
pattern・$handle
bmp・ $handle
フォントセット font
$name $type)
gdi Display Object $hwnd $obj $mode
$hwnd/キャンバスウインドウハンドル
$obj/オブジェクトハンドル(CreateObjectの戻り値)
$mode/表示モード 0:通常表示 1:XOR表示
あらかじめ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
########## サンプルプログラム終了 ##################
|