描画したBITMAPをオブジェクトとして持つには・・・ – プログラミング – Home

描画したBITMAPをオブジェクトとし...
 
通知
すべてクリア

[解決済] 描画したBITMAPをオブジェクトとして持つには・・・

固定ページ 1 / 2

モーモー
 モーモー
(@モーモー)
ゲスト
結合: 22年前
投稿: 49
Topic starter  

度々お世話になっております。

早速質問ですが、
今,裏画面を使ってBITMAPの絵をいっぱい表示する(クリックするたびに)ようにしたのです
が、
貼り付けた絵の一つ一つにIDのような固有名を持たせたく、
また、1つ1つをピックアップできるように、オブジェクト化させたいのですが
どういう実現方法があるのかわかりません。

なにか、いいヒントがあれば教えてください。

開発環境:win98、VC++ver.6.0、SDI


引用未解決
トピックタグ
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

一番簡単なのは、ビットマップの配列を用意することでしょうか。
この場合、添え字番号がIDになります。

HBITMAP bmps[BITMAP_MAX];


返信引用
モーモー
 モーモー
(@モーモー)
ゲスト
結合: 22年前
投稿: 49
Topic starter  

返事遅くなってすみません。

dairygoodsさん、レスありがとうございます。

BITMAP_MAXとありますが、やっぱり個数はある程度限って作った方がいいのでしょうか?
今は、クリックに反応させて何個でもボコボコ絵を表示しているのですが・・・

それと、ちょっと疑問なんですが、この方法では一つ一つを個々の情報を持たすことは可能でも
ピックアップするということはできなくはないですか?

どういうふうに利用すれば良いのかわからないので、
もう少し詳しいヒントをください。
お願いします。


返信引用
sugar
 sugar
(@sugar)
ゲスト
結合: 24年前
投稿: 448
 

モーモーさんの言うピックアップって、どうすることを指すのでしょうか。


返信引用
らふ
 らふ
(@らふ)
ゲスト
結合: 22年前
投稿: 18
 

>BITMAP_MAXとありますが、やっぱり個数はある程度限って作った方がいいのでしょう
か?
配列を定義してしまうならそういうことになります。
可変長にしたいなら std::vector や CArray をつかうといいと思います。

>それと、ちょっと疑問なんですが、この方法では一つ一つを個々の情報を持たす
>ことは可能でもピックアップするということはできなくはないですか?
意味がよくわかりません。どういう風に利用したいのでしょうか?


返信引用
らふ
 らふ
(@らふ)
ゲスト
結合: 22年前
投稿: 18
 

>sugarさん
リロードせずに書き込んだらかぶってしまいました。 すみません <(_ _)>


返信引用
モーモー
 モーモー
(@モーモー)
ゲスト
結合: 22年前
投稿: 49
Topic starter  

すみません。。。

えっと、ピックアップする⇒デスクトップにあるアイコンの選択時みたいに、
選択されてますよっていう反応をしたいのですが。。。


返信引用
n
 n
(@n)
ゲスト
結合: 23年前
投稿: 159
 

ピックアップ状態にあるビットマップの(配列やvectorやCArrayの)インデックス
を別の変数に保持しておいて、そのビットマップを描画する際には枠を付けて
描くなどすればいいのでは。


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

>えっと、ピックアップする⇒デスクトップにあるアイコンの選択時みたいに、
>選択されてますよっていう反応をしたいのですが。。。

つまり、各ビットマップに選択されている/いないの状態が必要ということですね。
複数の情報をまとめて扱いたい時は構造体を利用するのがよいでしょう。

struct BitmapInfo
{
HBITMAP hbmp;
BOOL selected;
};
BitmapInfo bmps[BITMAP_MAX];


返信引用
kazuma
 kazuma
(@kazuma)
ゲスト
結合: 24年前
投稿: 217
 

クラスにしてみてもいいでしょうね。
class CItem
{
private:
HBITMAP m_hBmp;
bool m_fSelected;
CRect m_rect; // 描画位置
public:
void Draw(CDC *pDC); // 描画
bool HitTest(CPoint pt);
void Select(bool fSelect);
};


返信引用
kazuma
 kazuma
(@kazuma)
ゲスト
結合: 24年前
投稿: 217
 

クラスにしてみてもいいでしょうね。
class CItem
{
private:
HBITMAP m_hBmp;
bool m_fSelected;
CRect m_rect; // 描画位置
public:
void Draw(CDC *pDC); // 描画
bool HitTest(CPoint pt);
void Select(bool fSelect);
};


返信引用
モーモー
 モーモー
(@モーモー)
ゲスト
結合: 22年前
投稿: 49
Topic starter  

またまたこのログを引っ張り出して、すみませんm(__)m

まだ一つひっかかっていることがあるので、もうすこしお付き合いください。
ItemクラスのDraw関数とSelect関数は大体わかったので
HitTest関数をもう少し具体的に教えていただきたいです。。。

どの絵にマウスがあるかないかをチェックする時というのは、
構造体の配列に溜めたrect内にマウスがあるか(m_rect.PtInRect(pt) == 0こんなの?)
でチェックすると思うんですけど、溜めた分だけfor分などでループさせるのでしょうか?
上のログにもあるように、何個の絵を描くかは決まってないので、
できれば、ループじゃなく一気にチェックしたいんですけど、可能でしょうか?
可能でしたら、どのような実現方法があるか教えてください。

よろしくお願いします。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

> 構造体の配列に溜めたrect内にマウスがあるか(m_rect.PtInRect(pt) == 0こんなの?)
> でチェックすると思うんですけど、溜めた分だけfor分などでループさせるのでしょうか?

なにか不都合があるのかしら?

class in_rect {
CPoint pt_;
in_rect(CPoint p) : pt_(p) {}
bool operator()(const CItem& item) const {
return item.HitTest(pt_);
}
};

CItem pictures[N];
int pics; // picturesに格納されたビットマップ数
CPoint mouse_position; // マウスの位置
CItem* found = std::find(pictures, pictures+pics, in_rect(mouse_position));
if ( found != pictures+pics ) {
// 見つけた!
}


返信引用
モーモー
 モーモー
(@モーモー)
ゲスト
結合: 22年前
投稿: 49
Topic starter  

早速、レスを返していただきありがとうございます。

あのー、すごくトンチンカンな質問かもしれませんが、、、
std::find(******)っていうのは、MFC環境でも使えるのでしょうか?
MSDNで検索したところ、STLサンプルしか出てこなかったので・・・

>なにか不都合があるのかしら?
いえ、不都合っていうほどじゃないですが、
上の記述通り複数の絵があり、しかも何個かは決めてないので、
ループさせるとどんどん重くなるんじゃないかという心配をしているだけです。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

> std::find(******)っていうのは、MFC環境でも使えるのでしょうか?

使えます。

> 上の記述通り複数の絵があり、しかも何個かは決めてないので、
> ループさせるとどんどん重くなるんじゃないかという心配をしているだけです。

'複数の絵'っていくつくらいでしょう?
高々数百程度ならばループを回したところでどうってことないのでは?


返信引用
固定ページ 1 / 2

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました