ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2024年4月27日(土) 22:53

全ての表示時間は UTC+09:00 です




新しいトピックを投稿する  トピックへ返信する  [ 7 件の記事 ] 
作成者 メッセージ
投稿記事Posted: 2005年11月24日(木) 10:17 
 4.10台のバージョンからビットマップファイルを書き込むと
.bfOffBitsと.bfSizeが反転してしまいます。

下記コードを実行してファイルを確認すると
 .bfOffBits = 30360000 .... 00003036
 .bfSize = 00360000 .... 00000036
なので上下を入れ替えないとビットマップとして表示されません。

 突然ビットマップが作成できなくなったので半日悩みましたバグではない
かも知れませんが調査していただけると嬉しいです。
コード:
 Dim hFile as LONG
 Dim htDC  as HDC
 Dim htBmp as HBITMAP
 Dim Bmf   as BITMAPFILEHEADER
 Dim Bmi   as BITMAPINFO
 Dim Dsz   as DWORD
 Dim Dps   as BytePtr
 Dim Wtp   as LONG
     Bmi.bmiHeader.biSize           =  40
     Bmi.bmiHeader.biWidth          =  64
     Bmi.bmiHeader.biHeight         =  64
     Bmi.bmiHeader.biPlanes         =   1
     Bmi.bmiHeader.biBitCount       =  24
     Bmi.bmiHeader.biCompression    =  BI_RGB
     Bmi.bmiHeader.biSizeImage      =   0
     Bmi.bmiHeader.biXPelsPerMeter  =   0
     Bmi.bmiHeader.biYPelsPerMeter  =   0
     Bmi.bmiHeader.biClrUsed        =   0
     Bmi.bmiHeader.biClrImportant   =   0

     Dsz  =  ((24*Bmi.bmiHeader.biWidth+31)\32)*4*Abs(Bmi.bmiHeader.biHeight)

     Bmf.bfType       =  &H4D42
     Bmf.bfReserved1  =  0
     Bmf.bfReserved2  =  0
     Bmf.bfOffBits    = 54
     Bmf.bfSize       =  Dsz+Bmf.bfOffBits

     Dps   =  GlobalAlloc(GPTR, Dsz)
     htDC  =  CreateCompatibleDC(0)
     htBmp  = CreateCompatibleBitmap(htDC,64,64)
     SelectObject(htDC, Binfo[Cbuf].hmBmp)
     GetDIBits(htDC,htBmp,0,64,Dps,Bmi,DIB_RGB_COLORS)
     DeleteDC(htDC)

     hFile =  CreateFile(FN,GENERIC_WRITE,0,ByVal NULL,
                         CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL)
     WriteFile(hFile,VarPtr(Bmf),14,VarPtr(Wtp),ByVal NULL)
     WriteFile(hFile,VarPtr(Bmi),Bmf.bfOffBits-14,VarPtr(Wtp),ByVal NULL)
     WriteFile(hFile,Dps,Dsz,VarPtr(Wtp),ByVal NULL)
     CloseHandle(hFile)
     GlobalFree(Dps)


通報する
ページトップ
   
投稿記事Posted: 2005年11月24日(木) 10:24 
訂正です。
>  .bfOffBits = 30360000 .... 00003036
>  .bfSize = 00360000 .... 00000036

 .bfSize = 30360000 .... 00003036
.bfOffBits = 00360000 .... 00000036
すみません。


通報する
ページトップ
   
 記事の件名:
投稿記事Posted: 2005年11月24日(木) 11:18 
オフライン

登録日時: 2005年8月23日(火) 00:15
記事: 161
お住まい: 沖縄県
最新版(4.11.03)を使用して
include\api_gdi.sbpのBITMAPFILEHEADERを以下のように書き換えると
動作するでしょうか?
コード:
' Bitmap file header struct
'Type BITMAPFILEHEADER
Type Align(1) BITMAPFILEHEADER	'Alignを追加
	bfType As Integer
	bfSize As Long
	bfReserved1 As Integer
	bfReserved2 As Integer
	bfOffBits As Long
End Type


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2005年11月24日(木) 11:41 
> 最新版(4.11.03)を使用して
> include\api_gdi.sbpのBITMAPFILEHEADERを以下のように
> 書き換えると動作するでしょうか?

ありがとうございます。
動作しましたこれも「PRINTDLG」の時と同じ原因だったのですね
「BITMAPFILEHEADER」は使用頻度が高い気がしていたので修正されていると
思い込んでいました、他にもありそうなので次回から最初に
構造体を疑ってみます。:特にINTEGERを含むものを


通報する
ページトップ
   
 記事の件名:
投稿記事Posted: 2005年11月24日(木) 11:59 
オフライン
Site Admin

登録日時: 2005年5月30日(月) 15:08
記事: 535
ご報告ありがとうございます。次回のバージョンアップで修正します。

BITMAPFILEHEADERは、.bmpファイルの先頭に含まれる構造体なんですよね。これは、16ビット時代(Windows3.1時代)から使われていたものなんでしょうか??だとしたら、4バイト境界でアラインメントを作るわけにはいかないですな。

他にもこういう構造体を見つけた方がいらっしゃいましたら、ご一報いただけると助かります。


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2005年11月24日(木) 13:01 
オフライン

登録日時: 2005年8月23日(火) 00:15
記事: 161
お住まい: 沖縄県
山本さまの疑問にお答えします。(もう大昔の話なので、うる覚えですが・・・)

GDI系の構造体はOS/2 Ver1.?のPM(プレゼンテーションマネージャだったかな?、GUIを管理するシステム)までさかのぼります。
当時のOS/2がターゲットとしていたCPUは286ですので、必然的に構造体のアライメントは2バイト境界となります。

その後、MSとIBMがそれぞれの道を進む事になった際に、Win3.1とOS/2 Ver2へと別々の道を進んでいきます。
GUI系のAPI(名称は別として)は座標の原点が左上か左下の違いしかありませんでした。
Win9x系のディスプレイドライバでGDIを処理するコードは16ビットセグメントで実行します。(DirectX系は32Bitです)
また、WinNT系でもAPIはWin9x系と互換なので過去を引きずっています。(ディスプレイドライバーは32ビット化済みです。)

GDI系のAPIに関しては、こんな感じです。


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2005年11月24日(木) 14:02 
オフライン
Site Admin

登録日時: 2005年5月30日(月) 15:08
記事: 535
マティさん、情報ありがとうございます。入り込んだ話になってきましたので、「構造体のアラインメントについて」のトピックで議論をすすめましょう。

http://www.discoversoft.net/forum/viewtopic.php?t=477


通報する
ページトップ
期間内表示:  ソート  
新しいトピックを投稿する  トピックへ返信する  [ 7 件の記事 ] 

全ての表示時間は UTC+09:00 です


オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[10人]


トピック投稿:  可
返信投稿:  可
記事編集: 不可
記事削除: 不可
ファイル添付: 不可

検索:
ページ移動:  
Powered by phpBB® Forum Software © phpBB Limited
Japanese translation principally by ocean