|
FOR HSP2.61
+
| | 実線描画サンプル
|
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
|
-
|
|
|
|
|
|
|
|
|
|
|
|
!
-
|
|
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
!
|
!
-
|
|
|
|
|
|
|
|
|
|
|
|
!
|
buffer 31, 640, 480
screen 0, 640, 480
repeat
await
mx = mousex: my = mousey
stick key, 256
if (key&256!0) & (ls=0){
ds = mx, my
nde = mx, my
ls = 1
gsel 31
cs = mx, my
cr = 0, 0
gcopy 0, cs.1, cs.1, cr.0+1, cr.1+1
gsel 0
continue
}
if (key&256!0) & ls{
pde = nde.0, nde.1
nde = mx, my
if (pde.0!nde.0) | (pde.1!nde.1){
redraw 0
pos cs.0, cs.1
gcopy 31, 0, 0, cr.0+1, cr.1+1
if ds.0<nde.0: cs.0 = ds.0: else: cs.0 = nde.0
if ds.1<nde.1: cs.1 = ds.1: else: cs.1 = nde.1
cr = nde.0 - ds.0, nde.1 - ds.1
if cr.0<0: cr.0 = -1*cr.0
if cr.1<0: cr.1 = -1*cr.1
gsel 31
gcopy 0, cs.0, cs.1, cr.0+1, cr.1+1
gsel 0
pset ds.0, ds.1
line ds.0, ds.1, nde.0, nde.1
pset nde.0, nde.1
redraw 1
}
continue
}
if (key&256=0) & ls{
nde = mx, my
redraw 0
pos cs.0, cs.1
gcopy 31, 0, 0, cr.0+1, cr.1+1
pset ds.0, ds.1
line ds.0, ds.1, nde.0, nde.1
pset nde.0, nde.1
redraw 1
ls = 0
}
loop
|
|
実線を引く命令はHSPに既にlineという命令がありますが、問題は終点の確定していない直前の線をどう消すか。
背景色に合わせてlineを上書きと言う考えが最初に浮かびますが問題があります。
どういう問題なのか、それは是非一度やってみてください^^;
実際私も最初にそれをやって失敗したためにgcopyを用いる方法を考え付きましたから・・・。
でアルゴリズムとしてはフィルと同じで線を描画する前に選択範囲のイメージをバッファにコピーしてから線を引きます。
そして新たな選択範囲に線を引く前のバッファにコピーする前に以前コピーしたイメージを貼り付けて元通りにします。
それからコピー、それから線描画。これを繰り返します。
それから後処理としてlineはデバイス?の影響から始点か終点の1ピクセルだけ描画されないという問題があります。
その為に始点と終点にpsetで埋めています。
- サンプルというよりこれは解答になりそうなくらい上出来なんですが…特にこの選択範囲を保存するという考えが…自分で言うのもなんですが^^; -- kz3
![[hsp3]](./image/req/hsp3.png)
+
| | APIを使用した点線
|
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
|
|
#module
#deffunc myline int x1,int y1,int x2,int y2
#uselib "gdi32.dll"
#func CreatePen "CreatePen" int,int,int
#func DeleteObject "DeleteObject" int
#func SelectObject "SelectObject" int,int
#func MoveToEx "MoveToEx" int,int,int,sptr
#func LineTo "LineTo" int,int,int
#const PS_DOT 2
CreatePen PS_DOT,0,0
hpen = stat
if hpen = 0: end
SelectObject hdc, hpen
hobj = stat
if hobj = 0: DeleteObject hpen: end
MoveToEx hdc, x1, y1, 0
LineTo hdc, x2, y2
redraw 1
DeleteObject hpen
return
#global
myline 0,0,639,479
myline 639,0,0,479
stop
|
|
PS_DOT の数値を変えることにより、実践や波線が引けます。
MoveToEx? は、pos命令、LineTo?は、カレントポジションから指定座標まで線を引く命令。....Tnx kz3
- さっhirokiさん、「点線」ページ作ったのでどうぞ*゚ー゚)r且~ -- kz3
- 僕はhsp2.61で書いてみようかな・・・。 -- kz3
- 急に言われても.....(>_<) -- hiroki?
- 時間のある時に^^;先のこっちでテストしてからPaintEt?に適用するといいかもですよ〜矩形は直線を4回描画で出来ますし^^ -- kz3
- 将来性を考えて、mode 付けました。 -- hiroki?
- 問題は斜線ですねーーー。(/_;) -- hiroki?
- kz3さんのスクリプトを参考に、APIで上のサンプルをテストしてますが、線を引いてくれない。(;_;) -- hiroki?
- APIで上のサンプル??線を引くAPIはLineTo?()関数ですよ〜 -- kz3
- API使うならCreatePen?でペンのスタイルを破線にしてLineTo?かPolylineで線を引けばokだと思います。 -- GENKI?
- 知ったような口ぶりで書いちゃいましたが、888さんとこの受け売りです。てもとにサンプルが…。 -- GENKI?
- そう、line をLineTo?に変えたり試してみていたときにパソコンが永眠したの。 -- hiroki?
- 永眠ってフリーズですか??^^; -- kz3
- 今まで、CPU押さえたり、マザーボード叩いたりして復旧させてきたけど、とうとう通用しなくなりました。 スクリプトをいじるのは新品XP機を買ってからになりそうです。 とほほ -- hiroki?
- ぇ、まじですか;ロ;。lineをLineTo?に変えただけでダメだったんですか??そんなに危険だったのかな・・・汗 -- kz3
- いやいや そのせいじゃないですよ。 そろそろ買おうかと迷っていたところ。 -- hiroki?
- あっ寿命がきたってことなんですね^^;(いかん、雑談になってしまった) -- kz3
- そう、雑談ページに書いたとおりです。 -- hiroki?
- あまりにも恥ずかしいから消しました。 今HSPいじれないから、あとよろしくね。 -- hiroki?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
| #const PS_DOT 2
x1=10:y1=200:x2=120:y2=200
hbrush = GetStockObject(HOLLOW_BRUSH)
hpen = CreatePen(PS_DOT,0,0)
if hpen = 0: end
hobj = SelectObject(hdc, hpen)
hobj_ = SelectObject(hdc,hbrush)
if hobj = 0: DeleteObject hpen: end
MoveToEx hdc, x1, y1, 0
LineTo hdc, x2, y2
Rectangle hdc, 10,10,100,100
hobj = SelectObject(hdc,hobj)
DeleteObject hpen
|
- いまだにlineの勉強をしていますが、何故か線を引いてくれません。 どうしてでしょうか。 ちなみにAPIの宣言はしております。 -- hiroki?
- 下のGENKIさんのを参考に、Polylineで引いてくれたけど、絶対LineTo?で実現するぞーー。 -- hiroki?
- どんな風に書いたら引けなかったのかな?上のは部分的だからなぁ・・・(というか#func入れるの面倒orz) -- kz3
- LineTo?とMoveToEx?で点線引こうとしていますが、うまく引けません。 勉強不足です。 -- hiroki?
- MoveToEx?はhspのpos同様です。LineTo?は現在のカレントポジションから指定した座標に線を引いたあとにそこをカレントポジションにします。なので、□を書くときは最初の点だけMoveToEx?(あるいはposでも出来るかも)を使い、あとは4回LineTo?を呼べばOKだと思います。 -- kz3
- あ、□じゃなくて点線か・・・;; -- kz3
- 線が書けないんじゃ口も書けないと思い、線を...。 -- hiroki?
- 画面の描画のAPIは、仮想画面しか変わらないことが解り、redraw 1 とすることで解決し、また勉強になりました。お手数おかけしました。^^; -- hiroki?
- やっとアップできます。これを利用して、未完成のpaintを完成に近づけます。 -- hiroki?
![[hsp3]](./image/req/hsp3.png)
+
| | 破線描画サンプル
|
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
|
| #uselib "gdi32.dll"
#func CreatePen "CreatePen" int, int, int
#func SelectObject "SelectObject" int,int
#func Polyline "Polyline" int, var, int
#func DeleteObject "DeleteObject" int
#define ctype RGB(%1,%2,%3) ((%3*65536)+(%2*256)+%1)
CreatePen 1, 1, RGB(0,0,0)
hPen = stat : if stat=0 : dialog "ペン設定に失敗しました" : return
dim point,4
point = 10,10, 600,400
SelectObject hdc, hPen
hOldPen = stat
Polyline hdc, point, 2
if stat = 0 : dialog "描画に失敗しました"
DeleteObject hPen
SelectObject hdc, hOldPen
redraw 1
stop
|
|
- 888さんのサンプルを参考に作成しました。正直理解していません。_| ̄|○
HSP3はAPIが使いやすいですね。 -- GENKI
直線描画モジュールです。
破線描画や線の太さが変更できます。
ぶっちゃけ888さんのいろいろ線ひきモジュールをHSP3に移植したものです。
![[hsp3]](./image/req/hsp3.png)
+
| | 直線モジュール
|
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
|
|
#uselib "gdi32.dll"
#func global CreatePen "CreatePen" int, int, int
#func global SelectObject "SelectObject" int,int
#func global Polyline "Polyline" int, var, int
#func global DeleteObject "DeleteObject" int
#define global ctype RGB(%1,%2,%3) ((%3*65536)+(%2*256)+%1)
#define global PS_SOLID 0 #define global PS_DASH 1 #define global PS_DOT 2 #define global PS_DASHDOT 3 #define global PS_DASHDOTDOT 4 #define global PS_NULL 5 #define global PS_INSIDEFRAME 6
#module
#deffunc s_line int slx, int sly, int elx, int ely, int fnPenStyle, int nWidth
CreatePen fnPenStyle, nWidth, RGB(ginfo_r, ginfo_g, ginfo_b)
hPen = stat : if hPen=0 : dialog "ペン設定に失敗しました",1,"エラー" : return 1
SelectObject hdc, hPen
hOldPen = stat
point = slx, sly, elx, ely
Polyline hdc, point, 2
if stat = 0 : dialog "描画に失敗しました",1,"エラー" : return 1
DeleteObject hPen
SelectObject hdc, hOldPen
return
#global
#if 0
color 0,0,255
repeat 5
s_line 10,10+cnt*20, 600,10+cnt*20, cnt, 1
loop
repeat 10
s_line 10,130+cnt*20, 600,130+cnt*20, 0, cnt
loop
redraw 1
color 255,0,0
s_line 10,340,600,340,PS_SOLID
s_line 10,350,600,350,PS_DASH
s_line 10,360,600,360,PS_DOT
s_line 10,370,600,370,PS_DASHDOT
s_line 10,380,600,380,PS_DASHDOTDOT
redraw 1
#endif
#if 0
sdim l,10,5:l="実線","破線","点線","一点鎖線","二点鎖線"
color : boxf
repeat 5
color ,255
s_line 0,(cnt+1)*40, ginfo_winx,(cnt+1)*40,cnt
pos 20,cnt*40+20
mes l.cnt
loop
repeat 5
b=cnt+1<<1
s_line 0,(cnt+1)*40+200, ginfo_winx,(cnt+1)*40+200,,b
pos 20,cnt*40+20+200
mes ""+b+"ピクセルの線"
loop
redraw 1:stop
#endif
|
|
- 太い直線がひきたくなったので移植してみました。 -- GENKI?
|