- PR -

C++/CLIでStretchDIBits

1
投稿者投稿内容
STEPS
会議室デビュー日: 2006/11/09
投稿数: 6
投稿日時: 2006-11-09 17:53
XP VC2005 C++/CLIで開発しています。

グレー画像を読込み、二値化やエッジ検出等を行いたいため、DIBでデータを操作し
StretchDIBitsでそのデータをpictureBox領域に描画したいと考えています。

そこでですが、StretchDIBitsの第1引数への指定方法につきまして
ご教授していただければと思い投稿いたしました。

pictureBox->CreateGraphics()->GetHdc()
を指定すると、
'System::IntPtr' から 'HDC' に変換できません。
というエラーが出ます。

C++/CLI環境でStretchDIBitsを使うということが誤りなのでしょうか?

以上よろしくお願いいたします。
Blue
大ベテラン
会議室デビュー日: 2005/09/12
投稿数: 230
お住まい・勤務地: 知っている人は知っている
投稿日時: 2006-11-09 18:01
IntPtr型からネイティブなハンドル型に変換するときはToPointerメソッドを使って
void*型にしてからキャストすることになります。

つまり
コード:

HDC hDC = static_cast<HDC>(pictureBox->CreateGraphics()->GetHdc().ToPointer());




[ メッセージ編集済み 編集者: Blue 編集日時 2006-11-09 18:03 ]
STEPS
会議室デビュー日: 2006/11/09
投稿数: 6
投稿日時: 2006-11-09 19:42
ご返事を頂きありがとうございました。

うまくキャストを行うことができました。
もうひとつ質問項目が出てきたのですがStretchDIBitsを呼び出すと
error LNK2028: 未解決のトークン
というエラーが発生します。

ヘルプには
ネイティブ関数を純粋なイメージにインポートしようとするときは、ネイティブ コンパイルと純粋なコンパイルで暗黙の呼び出し規約が異なることに注意してください。
ということが書かれていますが、具体的な記述方法がわかりません。

大変恐縮ですが、ご教授いただければ幸いです。
Blue
大ベテラン
会議室デビュー日: 2005/09/12
投稿数: 230
お住まい・勤務地: 知っている人は知っている
投稿日時: 2006-11-09 20:33
ちゃんと必要なヘッダ、ライブラリファイルをそれぞれインクルード、リンクしていますか?

コード:

#include <windows.h> // wingdi.hもこれでインクルードされるはず。



を記述して、

プロジェクトのプロパティ



+構成プロパティ
+リンカ
+入力

の追加の依存ファイルにgdi32.libが含まれているか?
(親またはプロジェクトの規定値から継承にチェックが入っていればOK)
STEPS
会議室デビュー日: 2006/11/09
投稿数: 6
投稿日時: 2006-11-09 21:14
ご返事ありがとうございます。

結果としましては、動きました。

windows.hのインクルードは行っていて、
追加の依存ファイルに関してですが
gdi32.libは含まれていたのですが、
親またはプロジェクトの規定値から継承にチェックが入っ
ていなかったのでチェック入れた状態にしました。

再度コンパイルをかけると動きました。
親またはプロジェクトの規定値から継承にチェックを
入れていなかったのが問題であったようです。

ご回答ありがとうございました。


1

スキルアップ/キャリアアップ(JOB@IT)