ページ 11

DWORD型の作成(?)

Posted: 2014年5月15日(木) 00:20
by rozeo
こんばんは、rozeoです。

この前DIBSctionで質問させていただいたんですが、問題に気づきました。

自分はファイルから16進数値(00〜FF)読み込みそれをピクセル列に格納してたんですが、思ったら色
代入って 0x00ff0000 ←みたいな感じなのわすれてました

そこで質問なんですが。
ファイルから読み込んだRGB、3つの値から 0x〜の形式の値を作成するってことはできますか?

さらに追加で質問です。

コード:

for( int i = 0;i < 1000;i++ ){
    for( int k = 0;k < 1000;k++ ){
        bPixelBits[i + k*1000 ] = 0x00ff0000;//bPixelBitsはLPWORD型。CreateDIBSctionの時に領域確保
    }
}
で、ファイルから読み込まず、一定 値でデータを格納してるんですが、なぜかブレークポイントでみたときに格納される値が 0x00ff0000 ではなく 0x00ab0000という値になってしまってます。
これはバグでしょうか?正常でしょうか?

回答よろしくお願いします。

Re: DWORD型の作成(?)

Posted: 2014年5月15日(木) 04:53
by dic
http://www.alpha-net.ne.jp/users2/uk413/vc/VCT_DIB.html
リンク先の真ん中あたりの 各構造体の定義 というところを読んでみてはいかがでしょうか?

//追加
色の情報の型が LPWORD というのは、どこの情報を参考にされているのでしょうか?

RGBQUAD構造体をよく見てください。
構造体、マクロはわかりますか?

//補足
カラーパレットを使わない場合がありますね。失礼しました。

Re: DWORD型の作成(?)

Posted: 2014年5月15日(木) 05:28
by へにっくす
rozeo さんが書きました:3つの値から 0x〜の形式の値を作成するってことはできますか?
確か、RGBマクロが使えたような。
●Win32API(C言語)編 第13章 色の指定
rozeo さんが書きました:

コード:

for( int i = 0;i < 1000;i++ ){
    for( int k = 0;k < 1000;k++ ){
        bPixelBits[i + k*1000 ] = 0x00ff0000;//bPixelBitsはLPWORD型。CreateDIBSctionの時に領域確保
    }
}
0x00ff0000ってことは4byte、DWORDですね。LPWORDはWORD(=2byte)のポインタですよ。
DIBSectionを作る
上記のリンク先にもあるようにbPixelBitsはLPWORDでなく、LPDWORDですよ。bPixelBitsはLPDWORDですか?
0x00ff0000が0x00ab0000になってるってことはバグでしょう。
バグとは、思った通りの動きをしない、すべての現象のことをいいます。
その、0x00ab0000となっていた箇所は、どこで確認したのでしょうか?for文を抜けてすぐですか?
別の場所で確認したのであれば、その箇所を示してください(ソースが足りません)。

Re: DWORD型の作成(?)

Posted: 2014年5月15日(木) 06:24
by rozeo
LPWORDではなくてちゃんとLPDWORD型( DWORD * )でした。すいません。

ブレークポイントは内側forのかっこの部分です。

Re: DWORD型の作成(?)

Posted: 2014年5月15日(木) 06:33
by rozeo
へにっくす氏のページみましたが、COLORREF型ってtypedefされたDWORD型なんですね…初めて知りました。

なのでRGBマクロ使ってやってみたところ、うまく表示できました。
いままでうまく表示されていませんでしたが、やはり代入値がいけなかったようですね…

ありがとうございます。解決致しました。