by 淡幻星 » 2006年6月12日(月) 23:35
私の記憶が確かなら、N88BASICでは画像を伸縮できる命令はなかったような・・・。
(なお、プリントの仕方は分かりません。)
たしか、Point関数でドットの値を読み取って、Pset命令で描画する、
という方法を使って手動で伸縮する必要があったかと思います。
しかしそれでは面白くないのでAPIを使って挑戦してみました。
先に結論から言うと失敗でした・・・。
確かに伸縮はできるのですが、なぜか白黒になってしまいます。
(※すみませんが、コメントはかなり省いてます。
必要でしたら言ってください。時間があるときに追記しておきます
→追記しました@6/13)
テストコードはこちら。 [ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
#include <api_gdi.sbp>
#include <api_window.sbp>
Dim pBmp As Long
Dim hWnd As Long
Dim hDC As Long
Dim hdcDest As Long
Dim hdcSrc As Long
Dim pBmpCnvrt As Long
Dim lpBITMAP As BITMAP
Dim nWidth As Long
Dim nHeight As Long
Dim r As Long
Bload "画像のパス", pBmp
Put@( 0,0 ), pBmp, PSet
'以下、WinAPIを用いて挑戦!
'※ハンドル=識別子=区別するための名前みたいなもの。
hWnd = OwnerWnd() 'N88BASICの窓(プロンプト窓)のハンドルを得る。
hDC = GetDC( hWnd ) '窓のデバイスコンテキスト(=画用紙とか思って下さい。)を得る。
hdcSrc = CreateCompatibleDC( hDC ) 'メモリデバイスコンテキストを生成(=同じ大きさ紙質の画用紙とでも思ってください)。
hdcDest = CreateCompatibleDC( hDC ) 'もう一枚メモリデバイスコンテキスト生成。
GetObject( pBmp, Len(lpBITMAP), lpBITMAP ) 'ビットマップの情報をBITMAP構造体へ格納。
nWidth = lpBITMAP.bmWidth 'BITMAP構造体から画像の横幅を得る。
nHeight = lpBITMAP.bmHeight BITMAP構造体から画像の縦幅を得る。
pBmpCnvrt = CreateCompatibleBitmap( hdcDest, nWidth, nHeight ) '互換なビットマップを生成
SelectObject( hdcSrc, pBmp ) 'ビットマップとデバイスコンテキスト(以下DC)をくっつける。
SelectObject( hdcDest, pBmpCnvrt ) 'ビットマップとDCを結合(=DCに描画すると、それがビットマップに記録されることになる。)
r = StretchBlt( hdcDest, 0, 0, nWidth*0.5, nHeight*0.5, hdcSrc, 0, 0, nWidth, nHeight, SRCCOPY ) 'DCからDCへ画像を伸縮コピー(実質、ビットマップからビットマップへコピー)
DeleteDC( hdcSrc ) 'DCを破棄(自分で生成したものは自分で削除)。
ReleaseDC( hWnd, hDC ) 'DCを破棄(窓から直に得たものだけは、書式が違う)。
debug
'BitBlt( hDC, 0,nHeight+10, nWidth*0.5, nHeight*0.5, hdcDest, 0, 0, SRCCOPY ) '伸縮せずに画像をコピー。下記のPutと一緒の結果。
DeleteDC( hdcDest ) 'DCを破棄(コレをしないと、結合されているビットマップをPUT@など他の場所で使えない)。
Put@( 0,nHeight+10 ), pBmpCnvrt, PSet
debug
DeleteObject( pBmpCnvrt ) 'ビットマップを破棄。
'以下、普通にPoint+Psetで。
Dim x As Long
Dim y As Long
Dim c As Long
For y=0 To nHeight
For x=0 To nWidth
c = Point( x, y )
Pset( nWidth+10 + x*0.5, nHeight+10 + y*0.5 ), c
Next
Next
End
AB2.59で確認。
私の記憶が確かなら、N88BASICでは画像を伸縮できる命令はなかったような・・・。
(なお、プリントの仕方は分かりません。)
たしか、Point関数でドットの値を読み取って、Pset命令で描画する、
という方法を使って手動で伸縮する必要があったかと思います。
しかしそれでは面白くないのでAPIを使って挑戦してみました。
先に結論から言うと失敗でした・・・。
確かに伸縮はできるのですが、なぜか白黒になってしまいます。
(※すみませんが、コメントはかなり省いてます。
必要でしたら言ってください。時間があるときに追記しておきます
→追記しました@6/13)
[hide=テストコードはこちら。][code]#include <api_gdi.sbp>
#include <api_window.sbp>
Dim pBmp As Long
Dim hWnd As Long
Dim hDC As Long
Dim hdcDest As Long
Dim hdcSrc As Long
Dim pBmpCnvrt As Long
Dim lpBITMAP As BITMAP
Dim nWidth As Long
Dim nHeight As Long
Dim r As Long
Bload "画像のパス", pBmp
Put@( 0,0 ), pBmp, PSet
'以下、WinAPIを用いて挑戦!
'※ハンドル=識別子=区別するための名前みたいなもの。
hWnd = OwnerWnd() 'N88BASICの窓(プロンプト窓)のハンドルを得る。
hDC = GetDC( hWnd ) '窓のデバイスコンテキスト(=画用紙とか思って下さい。)を得る。
hdcSrc = CreateCompatibleDC( hDC ) 'メモリデバイスコンテキストを生成(=同じ大きさ紙質の画用紙とでも思ってください)。
hdcDest = CreateCompatibleDC( hDC ) 'もう一枚メモリデバイスコンテキスト生成。
GetObject( pBmp, Len(lpBITMAP), lpBITMAP ) 'ビットマップの情報をBITMAP構造体へ格納。
nWidth = lpBITMAP.bmWidth 'BITMAP構造体から画像の横幅を得る。
nHeight = lpBITMAP.bmHeight BITMAP構造体から画像の縦幅を得る。
pBmpCnvrt = CreateCompatibleBitmap( hdcDest, nWidth, nHeight ) '互換なビットマップを生成
SelectObject( hdcSrc, pBmp ) 'ビットマップとデバイスコンテキスト(以下DC)をくっつける。
SelectObject( hdcDest, pBmpCnvrt ) 'ビットマップとDCを結合(=DCに描画すると、それがビットマップに記録されることになる。)
r = StretchBlt( hdcDest, 0, 0, nWidth*0.5, nHeight*0.5, hdcSrc, 0, 0, nWidth, nHeight, SRCCOPY ) 'DCからDCへ画像を伸縮コピー(実質、ビットマップからビットマップへコピー)
DeleteDC( hdcSrc ) 'DCを破棄(自分で生成したものは自分で削除)。
ReleaseDC( hWnd, hDC ) 'DCを破棄(窓から直に得たものだけは、書式が違う)。
debug
'BitBlt( hDC, 0,nHeight+10, nWidth*0.5, nHeight*0.5, hdcDest, 0, 0, SRCCOPY ) '伸縮せずに画像をコピー。下記のPutと一緒の結果。
DeleteDC( hdcDest ) 'DCを破棄(コレをしないと、結合されているビットマップをPUT@など他の場所で使えない)。
Put@( 0,nHeight+10 ), pBmpCnvrt, PSet
debug
DeleteObject( pBmpCnvrt ) 'ビットマップを破棄。
'以下、普通にPoint+Psetで。
Dim x As Long
Dim y As Long
Dim c As Long
For y=0 To nHeight
For x=0 To nWidth
c = Point( x, y )
Pset( nWidth+10 + x*0.5, nHeight+10 + y*0.5 ), c
Next
Next
End[/code][/hide]
AB2.59で確認。