PLOT LINES文の不具合

 投稿者:山中和義  投稿日:2009年 4月15日(水)10時32分54秒
  SET WINDOW wx1,wx2,wy1,wy2
PLOT LINES: x1,y1; x2,y2

画面から大きく外れる線分を描く場合(y1またはy2がwy2との差が1e7以上)、
クリッピングされるはずの線分が、点(x1,wy2)として画面上端に表示される。

左端も点(wx1,y1)で同様。


サンプル1
SET WINDOW -1,1,-1,1
LET y=1e8
PLOT LINES: x,y; x+0.5,y !上端中央に点が見える
END


サンプル2
SET WINDOW -1,1,-1,1
LET y=1e8
FOR x=-1 TO 1 STEP 0.001 !実線が見える(0.1、0.01なら点々になる)
   PLOT LINES: x,y; x+0.5,y
NEXT x
END
 

Re: PLOT LINES文の不具合

 投稿者:白石 和夫  投稿日:2009年 4月16日(木)08時59分14秒
  > No.322[元記事へ]

line width を2以上にすると問題がでるようです。
調べた環境はWindows XPとVistaですが,
line widthを変えないときは線が描かれませんでした。

Windows NT系の場合,GDI(でよかったか?)は32ビットの座標空間をもつので,
-2^31~2^31-1でクリップした数値をWindowsに渡しています。

line style または Line Width を2以上にすると,
おかしなことが起こるようです。

テストプログラム
ビットマップのサイズを801×801にして実行

10 SET WINDOW 0,800,0,800
20 LET m=2^28
30 ! SET LINE WIDTH 2
31 SET LINE STYLE 2
40 FOR i=1 TO 400
50    PLOT LINES: 0,-m+i; 200,-m+i
60 NEXT i
70 END

20行はm=2^29,2^30でも同様

Win32APIの詳細な動作がわからないので,
ロジカルな問題ではないので,解決にはテストが必要です。
他の環境での動作テストの報告を歓迎します。
 

Re: PLOT LINES文の不具合

 投稿者:山中和義  投稿日:2009年 4月16日(木)12時21分59秒
  > No.323[元記事へ]

> 他の環境での動作テストの報告を歓迎します。

30,31行をコメントアウトしたプログラムで、
WindowsMeの場合、画面サイズで発生する、しないがあります。


発生する
 401×401、501×501、801×801、1001×1001(破線)、1601×1601(点線)

発生しない
 321×321、640×400、640×480、641×641、1281×1281、2001×2001


10 SET WINDOW 0,800,0,800
20 LET m=2^28
30 !SET LINE WIDTH 2
31 !SET LINE STYLE 2
40 FOR i=1 TO 400
50    PLOT LINES: 0,-m+i; 200,-m+i
60 NEXT i
70 END


30,31行を有効にしても動作は同じです。線幅は関係ないようです。

また、画面サイズによって、発生する場合のmの値が異なります。
たとえば、401×401なら、m=2^17以上。 501×501なら、m=2^19以上。 801×801なら、m=2^16以上。


補足
 前出のプログラムをPLOT POINTS文で実行する場合はOK(点、線は描かれない)です。

SET WINDOW -1,1,-1,1
LET y=2^13 !これ以上から
FOR x=-1 TO 1 STEP 0.001
   PLOT POINTS: x,y !OK
   !PLOT LINES: x,y; x,y !NG 中央に横実線が見える。 m=2^22以上なら画面上端へ
NEXT x
END
 

Re: PLOT LINES文の不具合

 投稿者:荒田浩二  投稿日:2009年 4月16日(木)19時31分56秒
  > No.323[元記事へ]

> 他の環境での動作テストの報告を歓迎します。

ビットマップサイズや線幅、描画位置を網羅的に調べました。
WindowsVistaでは、LINE WIDTH の設定が1のときにはエラーはありませんでした。
LINE WIDTH の設定が4,5のときは3と同じ挙動でした。
また、j>=32のときはj=32、j<=-32のときはj=-32と同じ挙動です(全てを調査したわけではないですが)。


結果の例(err=1となるjの値)
801×801の場合
  w=1 → ない
  w=2 → j<=-28,28<=j<=30 (j<=-32では画面上端に描画される)
  w=3,4,5 → ABS(j)>=28 (j<=-32では画面上端に描画される)
641×641の場合
  w=1 → ない
  w=2 → j<=-32 (画面上端に描画される)
  w=3,4,5 → ABS(j)>=32 (画面上端に描画される)


FOR bs=101 TO 1201 STEP 100
   PRINT "BITMAP SIZE "&STR$(bs)&"×"&STR$(bs)
   SET bitmap SIZE bs,bs
10    SET WINDOW 0,800,0,800
      SET TEXT HEIGHT 30
      FOR w=1 TO 3  ! w=4,5はw=3と同じ挙動
         PRINT "LINE WIDTH =";w
         FOR j=-32 TO -10
            CALL test
         NEXT j
         FOR j=10 TO 32
            CALL test
         NEXT j
         PRINT
      NEXT w
      PRINT
   NEXT bs
   SUB test
      CLEAR
      PLOT TEXT ,AT 300,560 : "BITMAP SIZE "&STR$(bs)&"×"&STR$(bs)
      PLOT TEXT ,AT 300,480 : "w = "&STR$(w)
      PLOT TEXT ,AT 300,400 : "j = "&STR$(j)
20    LET m=SGN(j)*2^ABS(j)
30    SET LINE WIDTH w
31    !SET LINE STYLE 2
40    FOR i=1 TO 400
50       PLOT LINES: 0,-m+i; 200,-m+i
60    NEXT i
      LET err=0
      FOR y=0 TO 800
         ASK PIXEL VALUE(1,y) col
         IF col=1 THEN LET err=1
      NEXT y
      IF err=1 THEN
         PRINT j;
         WAIT DELAY 0.3
      END IF
   END SUB
70 END


全結果
BITMAP SIZE 101×101
LINE WIDTH = 1

LINE WIDTH = 2
-32 -31  31  32
LINE WIDTH = 3
-32 -31  31  32

BITMAP SIZE 201×201
LINE WIDTH = 1

LINE WIDTH = 2
-32 -31 -30  30  31  32
LINE WIDTH = 3
-32 -31 -30  30  31  32

BITMAP SIZE 301×301
LINE WIDTH = 1

LINE WIDTH = 2
-32 -31  31  32
LINE WIDTH = 3
-32 -31  31  32

BITMAP SIZE 401×401
LINE WIDTH = 1

LINE WIDTH = 2
-32 -31 -30 -29  29  30  31
LINE WIDTH = 3
-32 -31 -30 -29  29  30  31  32

BITMAP SIZE 501×501
LINE WIDTH = 1

LINE WIDTH = 2
-32 -31  31
LINE WIDTH = 3
-32 -31  31  32

BITMAP SIZE 601×601
LINE WIDTH = 1

LINE WIDTH = 2
-32 -31 -30  30  31
LINE WIDTH = 3
-32 -31 -30  30  31  32

BITMAP SIZE 701×701
LINE WIDTH = 1

LINE WIDTH = 2
-32 -31  31
LINE WIDTH = 3
-32 -31  31  32

BITMAP SIZE 801×801
LINE WIDTH = 1

LINE WIDTH = 2
-32 -31 -30 -29 -28  28  29  30
LINE WIDTH = 3
-32 -31 -30 -29 -28  28  29  30  31  32

BITMAP SIZE 901×901
LINE WIDTH = 1

LINE WIDTH = 2
-32 -31
LINE WIDTH = 3
-32 -31  31  32

BITMAP SIZE 1001×1001
LINE WIDTH = 1

LINE WIDTH = 2
-32 -31 -30  30
LINE WIDTH = 3
-32 -31 -30  30  31  32

BITMAP SIZE 1101×1101
LINE WIDTH = 1

LINE WIDTH = 2
-32 -31
LINE WIDTH = 3
-32 -31  31  32

BITMAP SIZE 1201×1201
LINE WIDTH = 1

LINE WIDTH = 2
-32 -31 -30 -29  29  30
LINE WIDTH = 3
-32 -31 -30 -29  29  30  31  32
 

Re: PLOT LINES文の不具合

 投稿者:白石 和夫  投稿日:2009年 4月16日(木)20時53分47秒
  > No.324[元記事へ]

Windows Meの場合は,GDIの座標系が16ビットなので,
ピクセル座標系に変換した後,-2^15~2^15-1の範囲に
座標値を切り詰めた後に描画させています。
 

Re: PLOT LINES文の不具合

 投稿者:山中和義  投稿日:2009年 4月16日(木)22時10分58秒
  > No.326[元記事へ]

WindowsMeでの実行結果を報告します。

プログラムの修正
 画面左端
  ASK PIXEL VALUE(1,y) col
 を
  ASK PIXEL VALUE(0,y) col
 と変更


320×240はOKです!
GDI内でのクリッピングは、ビットマップ・サイズが16の倍数以外ではうまく計算できていないようです。

BITMAP SIZE 101×101
LINE WIDTH = 1
-32 -31 -30 -29 -28 -27 -26 -25 -24 -23 -22 -21 -20 -19  19  20  21  22  23  24  25  26  27  28  29  30  31  32
LINE WIDTH = 2
-32 -31 -30 -29 -28 -27 -26 -25 -24 -23 -22 -21 -20 -19  19  20  21  22  23  24  25  26  27  28  29  30  31  32
LINE WIDTH = 3
-32 -31 -30 -29 -28 -27 -26 -25 -24 -23 -22 -21 -20 -19  19  20  21  22  23  24  25  26  27  28  29  30  31  32

BITMAP SIZE 201×201
LINE WIDTH = 1
-32 -31 -30 -29 -28 -27 -26 -25 -24 -23 -22 -21 -20 -19 -18  18  19  20  21  22  23  24  25  26  27  28  29  30  31  32
LINE WIDTH = 2
-32 -31 -30 -29 -28 -27 -26 -25 -24 -23 -22 -21 -20 -19 -18  18  19  20  21  22  23  24  25  26  27  28  29  30  31  32
LINE WIDTH = 3
-32 -31 -30 -29 -28 -27 -26 -25 -24 -23 -22 -21 -20 -19 -18  18  19  20  21  22  23  24  25  26  27  28  29  30  31  32

BITMAP SIZE 301×301
LINE WIDTH = 1
-32 -31 -30 -29 -28 -27 -26 -25 -24 -23 -22 -21 -20 -19  19  20  21  22  23  24  25  26  27  28  29  30  31  32
LINE WIDTH = 2
-32 -31 -30 -29 -28 -27 -26 -25 -24 -23 -22 -21 -20 -19  19  20  21  22  23  24  25  26  27  28  29  30  31  32
LINE WIDTH = 3
-32 -31 -30 -29 -28 -27 -26 -25 -24 -23 -22 -21 -20 -19  19  20  21  22  23  24  25  26  27  28  29  30  31  32

BITMAP SIZE 401×401
LINE WIDTH = 1
-32 -31 -30 -29 -28 -27 -26 -25 -24 -23 -22 -21 -20 -19 -18 -17  17  18  19  20  21  22  23  24  25  26  27  28  29  30  31
LINE WIDTH = 2
-32 -31 -30 -29 -28 -27 -26 -25 -24 -23 -22 -21 -20 -19 -18 -17  17  18  19  20  21  22  23  24  25  26  27  28  29  30  31
LINE WIDTH = 3
-32 -31 -30 -29 -28 -27 -26 -25 -24 -23 -22 -21 -20 -19 -18 -17  17  18  19  20  21  22  23  24  25  26  27  28  29  30  31

BITMAP SIZE 501×501
LINE WIDTH = 1
-32 -31 -30 -29 -28 -27 -26 -25 -24 -23 -22 -21 -20 -19  19  20  21  22  23  24  25  26  27  28  29  30  31
LINE WIDTH = 2
-32 -31 -30 -29 -28 -27 -26 -25 -24 -23 -22 -21 -20 -19  19  20  21  22  23  24  25  26  27  28  29  30  31
LINE WIDTH = 3
-32 -31 -30 -29 -28 -27 -26 -25 -24 -23 -22 -21 -20 -19  19  20  21  22  23  24  25  26  27  28  29  30  31

BITMAP SIZE 601×601
LINE WIDTH = 1
-32 -31 -30 -29 -28 -27 -26 -25 -24 -23 -22 -21 -20 -19 -18  18  19  20  21  22  23  24  25  26  27  28  29  30  31
LINE WIDTH = 2
-32 -31 -30 -29 -28 -27 -26 -25 -24 -23 -22 -21 -20 -19 -18  18  19  20  21  22  23  24  25  26  27  28  29  30  31
LINE WIDTH = 3
-32 -31 -30 -29 -28 -27 -26 -25 -24 -23 -22 -21 -20 -19 -18  18  19  20  21  22  23  24  25  26  27  28  29  30  31

BITMAP SIZE 701×701
LINE WIDTH = 1
-32 -31 -30 -29 -28 -27 -26 -25 -24 -23 -22 -21 -20 -19  19  20  21  22  23  24  25  26  27  28  29  30  31
LINE WIDTH = 2
-32 -31 -30 -29 -28 -27 -26 -25 -24 -23 -22 -21 -20 -19  19  20  21  22  23  24  25  26  27  28  29  30  31
LINE WIDTH = 3
-32 -31 -30 -29 -28 -27 -26 -25 -24 -23 -22 -21 -20 -19  19  20  21  22  23  24  25  26  27  28  29  30  31

BITMAP SIZE 801×801
LINE WIDTH = 1
-32 -31 -30 -29 -28 -27 -26 -25 -24 -23 -22 -21 -20 -19 -18 -17 -16  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30
LINE WIDTH = 2
-32 -31 -30 -29 -28 -27 -26 -25 -24 -23 -22 -21 -20 -19 -18 -17 -16  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30
LINE WIDTH = 3
-32 -31 -30 -29 -28 -27 -26 -25 -24 -23 -22 -21 -20 -19 -18 -17 -16  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30

BITMAP SIZE 901×901
LINE WIDTH = 1
-32 -31 -30 -29 -28 -27 -26 -25 -24 -23 -22 -21 -20 -19  19  20  21  22  23  24  25  26  27  28  29  30
LINE WIDTH = 2
-32 -31 -30 -29 -28 -27 -26 -25 -24 -23 -22 -21 -20 -19  19  20  21  22  23  24  25  26  27  28  29  30
LINE WIDTH = 3
-32 -31 -30 -29 -28 -27 -26 -25 -24 -23 -22 -21 -20 -19  19  20  21  22  23  24  25  26  27  28  29  30

BITMAP SIZE 1001×1001
LINE WIDTH = 1
-32 -31 -30 -29 -28 -27 -26 -25 -24 -23 -22 -21 -20 -19 -18  18  19  20  21  22  23  24  25  26  27  28  29  30
LINE WIDTH = 2
-32 -31 -30 -29 -28 -27 -26 -25 -24 -23 -22 -21 -20 -19 -18  18  19  20  21  22  23  24  25  26  27  28  29  30
LINE WIDTH = 3
-32 -31 -30 -29 -28 -27 -26 -25 -24 -23 -22 -21 -20 -19 -18  18  19  20  21  22  23  24  25  26  27  28  29  30

BITMAP SIZE 1101×1101
LINE WIDTH = 1
-32 -31 -30 -29 -28 -27 -26 -25 -24 -23 -22 -21 -20 -19  19  20  21  22  23  24  25  26  27  28  29  30
LINE WIDTH = 2
-32 -31 -30 -29 -28 -27 -26 -25 -24 -23 -22 -21 -20 -19  19  20  21  22  23  24  25  26  27  28  29  30
LINE WIDTH = 3
-32 -31 -30 -29 -28 -27 -26 -25 -24 -23 -22 -21 -20 -19  19  20  21  22  23  24  25  26  27  28  29  30

BITMAP SIZE 1201×1201
LINE WIDTH = 1
-32 -31 -30 -29 -28 -27 -26 -25 -24 -23 -22 -21 -20 -19 -18 -17  17  18  19  20  21  22  23  24  25  26  27  28  29  30
LINE WIDTH = 2
-32 -31 -30 -29 -28 -27 -26 -25 -24 -23 -22 -21 -20 -19 -18 -17  17  18  19  20  21  22  23  24  25  26  27  28  29  30
LINE WIDTH = 3
-32 -31 -30 -29 -28 -27 -26 -25 -24 -23 -22 -21 -20 -19 -18 -17  17  18  19  20  21  22  23  24  25  26  27  28  29  30





BITMAP SIZE 320×240
LINE WIDTH = 1

LINE WIDTH = 2

LINE WIDTH = 3



BITMAP SIZE 640×400
LINE WIDTH = 1
-17  17  18
LINE WIDTH = 2
-17  17  18
LINE WIDTH = 3
-17  17  18


BITMAP SIZE 640×480
LINE WIDTH = 1
-32
LINE WIDTH = 2
-32
LINE WIDTH = 3
-32


BITMAP SIZE 1281×1281
LINE WIDTH = 1
-32 -31
LINE WIDTH = 2
-32 -31
LINE WIDTH = 3
-32 -31

 

Re: PLOT LINES文の不具合

 投稿者:白石 和夫  投稿日:2009年 4月17日(金)14時52分13秒
  > No.327[元記事へ]

SET WINDOWで定義される座標系をGDI座標系と一致させるために
ASK PIXEL SIZE (0,1;1,0) a,b
LET a=a-1
LET b=b-1
SET WINDOW 0,a,b,0
で座標系を定義してください。
Windowsでは,左上端座標が原点(0,0)で,右下方向に座標値が増加します。
 

Re: PLOT LINES文の不具合

 投稿者:白石 和夫  投稿日:2009年 4月17日(金)15時03分3秒
  > No.328[元記事へ]

Windows XPでの結果ですが,ビットマップサイズが16の倍数かどうかは関係ないみたいです。

LET s=512
SET bitmap SIZE s,s
SET WINDOW 0,s-1,s-1,0
SET LINE STYLE 2
LET m=2^27
FOR i=m TO m+1000
   PLOT LINES: 100,m+i; 200,m+i
NEXT i
END
 

Re: PLOT LINES文の不具合

 投稿者:山中和義  投稿日:2009年 4月17日(金)18時01分49秒
  > No.328[元記事へ]

> SET WINDOWで定義される座標系をGDI座標系と一致させるために

規則性が見えてきました。上下左右端すべてこの状態になります。
BITMAP SIZE 101×101
LINE WIDTH = 1
-32 -31 -30 -29 -28 -27 -26 -25 -24 -23 -22 -21 -20 -19 -18 -17 -16  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30
LINE WIDTH = 2
-32 -31 -30 -29 -28 -27 -26 -25 -24 -23 -22 -21 -20 -19 -18 -17 -16  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30
LINE WIDTH = 3
-32 -31 -30 -29 -28 -27 -26 -25 -24 -23 -22 -21 -20 -19 -18 -17 -16  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30
FOR bs=101 TO 1201 STEP 100
   PRINT "BITMAP SIZE "&STR$(bs)&"×"&STR$(bs)
   SET bitmap SIZE bs,bs
   !SET bitmap SIZE 640,480
   ASK PIXEL SIZE (0,1;1,0) a,b
   LET a=a-1
   LET b=b-1
   SET WINDOW 0,a,b,0
   !!!10    SET WINDOW 0,800,0,800
   SET TEXT HEIGHT 30
   FOR w=1 TO 3  ! w=4,5はw=3と同じ挙動
      PRINT "LINE WIDTH =";w
      FOR j=-32 TO -10
         CALL test
      NEXT j
      FOR j=10 TO 32
         CALL test
      NEXT j
      PRINT
   NEXT w
   PRINT
NEXT bs
SUB test
   CLEAR
   PLOT TEXT ,AT 300,560 : "BITMAP SIZE "&STR$(bs)&"×"&STR$(bs)
   PLOT TEXT ,AT 300,480 : "w = "&STR$(w)
   PLOT TEXT ,AT 300,400 : "j = "&STR$(j)
20    LET m=SGN(j)*2^ABS(j)
30    SET LINE WIDTH w
31    !!!SET LINE STYLE 2
40    FOR i=1 TO 400
50       PLOT LINES: 0,m+i; 200,m+i !左端に発生<---------- ※
         !52       PLOT LINES: m+i,0; m+i,200 !上端<---------- ※
60    NEXT i
      LET err=0
      FOR y=0 TO 800
         ASK PIXEL VALUE(0,y) col !左端<---------- ※
         !ASK PIXEL VALUE(y,0) col !上端<---------- ※
         IF col=1 THEN LET err=1
      NEXT y
      IF err=1 THEN
         PRINT j;
         WAIT DELAY 0.3
      END IF
   END SUB
70 END
 

Re: PLOT LINES文の不具合

 投稿者:山中和義  投稿日:2009年 4月17日(金)20時41分56秒
  > No.328[元記事へ]

白石 和夫さんへのお返事です。

古い情報ですが
 座標が極端に大きい場合に GDI 呼び出しが失敗する


「この問題は Microsoft Windows XP では解決されています。」と書いてありますが、、、

線幅が1、線種が実線以外では、まだ一部発生する と言うことでしょうか。

(クリッピングなどがGDI依存のままでは)本件は、制限事項になってしまいますね。
 

Re: PLOT LINES文の不具合

 投稿者:白石 和夫  投稿日:2009年 4月18日(土)09時39分46秒
  > No.333[元記事へ]

Windows XPで観察される現象は,GDIに渡した座標値の上位,何ビットかを無視して処理されていることです。その範囲が明確になれば対応は可能です。
現状は,-2^31より小さければ-2^31に書き換え,2^31-1より大きければ2^31-1に書き換えています。SDKの記述が間違っているとのことなので,これを-2^26~2^26-1の範囲に変えればいいのだろうと思います。

Windows Meでも同様なのだろうと思いますが,上位の何ビットが無視されるのかが問題です。
 

Re: PLOT LINES文の不具合

 投稿者:山中和義  投稿日:2009年 4月18日(土)14時14分37秒
  > No.334[元記事へ]

白石 和夫さんへのお返事です。

> Windows Meでも同様なのだろうと思いますが,上位の何ビットが無視されるのかが問題です。

プログラムとしては、ちょっと強引ですが、、、

BASICのグラフィックス画面(タイトルバー、メニューバーを含むウインドウ)をhDCとして確認してみました。

結果は、-2^15~2^15の範囲のようです。(32ビット指定だが、上位16ビットは無効となる)


>> Windows Meの場合は,GDIの座標系が16ビットなので,
>> ピクセル座標系に変換した後,-2^15~2^15-1の範囲に
>> 座標値を切り詰めた後に描画させています

これならちゃんと描画するのでは?

OPTION CHARACTER byte

LET w=320
LET h=240

SET BITMAP SIZE w,h !画面サイズ
SET WINDOW 0,w-1,0,h-1 !左下が原点。横がX、縦Y


LET hWnd=FndWnd("TPaintForm","") !ウインドウハンドルを取得する

LET Rect$=REPEAT$(" ",4*4)
LET n=ClientRect(hWnd, Rect$)
PRINT int32(Rect$,0);int32(Rect$,4);int32(Rect$,8);int32(Rect$,12)

LET n=GetWndRect(hWnd, Rect$)
PRINT int32(Rect$,0);int32(Rect$,4);int32(Rect$,8);int32(Rect$,12)



IF hWnd>0 THEN
   LET hDC=GetWndDC(hWnd) !デバイスコンテキストを取得する

   IF hDC>0 THEN
   !LET n=SetForeWnd(hWnd)

      LET n=Ellipse(hDC,20,20,100,200)

      LET m=-2^16 !<-------------------- -2^15~2^15はOK
      LET n=MoveTo(hDC,0,m,0) !
      LET n=LineTo(hDC,200,m) !

      WAIT DELAY 2

      LET n=ReleaseDC(hWnd, hDC) !デバイスコンテキストを開放する
   END IF
END IF

END



!--------------------------------------------------
!
EXTERNAL FUNCTION DWORD$(n)
OPTION CHARACTER byte
LET r=MOD(n,2^8)
LET s$=CHR$(r)
LET n=(n-r)/2^8
LET r=MOD(n,2^8)
LET s$=s$ & CHR$(r)
LET n=(n-r)/2^8
LET r=MOD(n,2^8)
LET s$=s$ & CHR$(r)
LET n=(n-r)/2^8
LET r=MOD(n,2^8)
LET DWORD$=s$ & CHR$(r)
END FUNCTION

EXTERNAL FUNCTION WORD$(n)
OPTION CHARACTER byte
LET r=MOD(n,2^8)
LET s$=CHR$(r)
LET n=(n-r)/2^8
LET r=MOD(n,2^8)
LET WORD$=s$ & CHR$(r)
END FUNCTION

EXTERNAL FUNCTION int32(s$,p)
OPTION CHARACTER byte
LET n=0
FOR i=1 TO 4
   LET n=n+256^(i-1)*ORD(s$(p+i:p+i))
NEXT i
IF n<2^31 THEN LET int32=n ELSE LET int32=n-2^32
END FUNCTION

EXTERNAL FUNCTION int16(s$,p)
OPTION CHARACTER byte
LET n=0
FOR i=1 TO 2
   LET n=n+256^(i-1)*ORD(s$(p+i:p+i))
NEXT i
IF n<2^15 THEN LET int16=n ELSE LET int16=n-2^16
END FUNCTION


!user32.dll
EXTERNAL FUNCTION CloseWnd(hWnd)
ASSIGN "user32.dll","CloseWindow"
END FUNCTION

EXTERNAL FUNCTION CopyRect(lpDstRect$, lpSrcRect$)
ASSIGN "user32.dll","CopyRect"
END FUNCTION

EXTERNAL FUNCTION FndWnd(lpClassName$, lpWindowName$)
ASSIGN "user32.dll","FindWindowA"
END FUNCTION

EXTERNAL FUNCTION FillRect(hDC, lpRect$, hbr)
ASSIGN "user32.dll","FillRect"
END FUNCTION

EXTERNAL FUNCTION GetActWnd
ASSIGN "user32.dll","GetActiveWindow"
END FUNCTION

EXTERNAL FUNCTION ClientRect(hWnd, lpRect$)
ASSIGN "user32.dll","GetClientRect"
END FUNCTION

EXTERNAL FUNCTION GetForeWnd
ASSIGN "user32.dll","GetForegroundWindow"
END FUNCTION

EXTERNAL FUNCTION GetWndDC(hWnd)
ASSIGN "user32.dll","GetWindowDC"
END FUNCTION

EXTERNAL FUNCTION GetWndRect(hWnd, lpRect$)
ASSIGN "user32.dll","GetWindowRect"
END FUNCTION

EXTERNAL FUNCTION IsWndVisible(hWnd)
ASSIGN "user32.dll","IsWindowVisible"
END FUNCTION

EXTERNAL FUNCTION MoveWnd(hWnd, x, y, cx, cy)
ASSIGN "user32.dll","MoveWindow"
END FUNCTION

EXTERNAL FUNCTION OffsetRect(lpRect$, dx, dy)
ASSIGN "user32.dll","OffsetRect"
END FUNCTION

EXTERNAL FUNCTION ReleaseDC(hWnd, hDC)
ASSIGN "user32.dll","ReleaseDC"
END FUNCTION

EXTERNAL FUNCTION SetActWnd(hWnd)
ASSIGN "user32.dll","SetActiveWindow"
END FUNCTION

EXTERNAL FUNCTION SetForeWnd(hWnd)
ASSIGN "user32.dll","SetForegroundWindow"
END FUNCTION

EXTERNAL FUNCTION SetRect(lpRect$, xLeftRect, yTopRect, xRightRect, yBottomRect)
ASSIGN "user32.dll","SetRect"
END FUNCTION

EXTERNAL FUNCTION SetWndPos(hWnd, hWndInsertAfter, x, y, cx, cy, uFlag)
ASSIGN "user32.dll","SetWindowPos"
END FUNCTION

EXTERNAL FUNCTION SetWndText(hWnd, lpString$)
ASSIGN "user32.dll","SetWindowTextA"
END FUNCTION

EXTERNAL FUNCTION ShowWnd(hWnd, nCmdShow)
ASSIGN "user32.dll","ShowWindow"
END FUNCTION


!gdi32.dll
EXTERNAL FUNCTION SolidBrush(crColor)
ASSIGN "gdi32.dll","CreateSolidBrush"
END FUNCTION

EXTERNAL FUNCTION Ellipse(hDC, nLeftRect, nTopRect, nRightRect, nBottomRect)
ASSIGN "gdi32.dll","Ellipse"
END FUNCTION

EXTERNAL FUNCTION LineTo(hDC, x, y)
ASSIGN "gdi32.dll","LineTo"
END FUNCTION

EXTERNAL FUNCTION MoveTo(hDC, x, y, lpPoint)
ASSIGN "gdi32.dll","MoveToEx"
END FUNCTION

EXTERNAL FUNCTION Rectangle(hDC, nLeftRect, nTopRect, nRightRect, nBottomRect)
ASSIGN "gdi32.dll","Rectangle"
END FUNCTION
 

Re: PLOT LINES文の不具合

 投稿者:白石 和夫メール  投稿日:2009年 4月19日(日)15時09分7秒
  > No.334[元記事へ]

完全かどうか定かではありませんが,修正版を作成しました。(Ver. 3.7.1)
問題が残るようであればお知らせください。
 

戻る