度々お世話になっております。
早速質問ですが、
今,裏画面を使ってBITMAPの絵をいっぱい表示する(クリックするたびに)ようにしたのです
が、
貼り付けた絵の一つ一つにIDのような固有名を持たせたく、
また、1つ1つをピックアップできるように、オブジェクト化させたいのですが
どういう実現方法があるのかわかりません。
なにか、いいヒントがあれば教えてください。
開発環境:win98、VC++ver.6.0、SDI
一番簡単なのは、ビットマップの配列を用意することでしょうか。
この場合、添え字番号がIDになります。
HBITMAP bmps[BITMAP_MAX];
返事遅くなってすみません。
dairygoodsさん、レスありがとうございます。
BITMAP_MAXとありますが、やっぱり個数はある程度限って作った方がいいのでしょうか?
今は、クリックに反応させて何個でもボコボコ絵を表示しているのですが・・・
それと、ちょっと疑問なんですが、この方法では一つ一つを個々の情報を持たすことは可能でも
ピックアップするということはできなくはないですか?
どういうふうに利用すれば良いのかわからないので、
もう少し詳しいヒントをください。
お願いします。
モーモーさんの言うピックアップって、どうすることを指すのでしょうか。
>BITMAP_MAXとありますが、やっぱり個数はある程度限って作った方がいいのでしょう
か?
配列を定義してしまうならそういうことになります。
可変長にしたいなら std::vector や CArray をつかうといいと思います。
>それと、ちょっと疑問なんですが、この方法では一つ一つを個々の情報を持たす
>ことは可能でもピックアップするということはできなくはないですか?
意味がよくわかりません。どういう風に利用したいのでしょうか?
>sugarさん
リロードせずに書き込んだらかぶってしまいました。 すみません <(_ _)>
すみません。。。
えっと、ピックアップする⇒デスクトップにあるアイコンの選択時みたいに、
選択されてますよっていう反応をしたいのですが。。。
ピックアップ状態にあるビットマップの(配列やvectorやCArrayの)インデックス
を別の変数に保持しておいて、そのビットマップを描画する際には枠を付けて
描くなどすればいいのでは。
>えっと、ピックアップする⇒デスクトップにあるアイコンの選択時みたいに、
>選択されてますよっていう反応をしたいのですが。。。
つまり、各ビットマップに選択されている/いないの状態が必要ということですね。
複数の情報をまとめて扱いたい時は構造体を利用するのがよいでしょう。
struct BitmapInfo
{
HBITMAP hbmp;
BOOL selected;
};
BitmapInfo bmps[BITMAP_MAX];
クラスにしてみてもいいでしょうね。
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);
};
クラスにしてみてもいいでしょうね。
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);
};
またまたこのログを引っ張り出して、すみませんm(__)m
まだ一つひっかかっていることがあるので、もうすこしお付き合いください。
ItemクラスのDraw関数とSelect関数は大体わかったので
HitTest関数をもう少し具体的に教えていただきたいです。。。
どの絵にマウスがあるかないかをチェックする時というのは、
構造体の配列に溜めたrect内にマウスがあるか(m_rect.PtInRect(pt) == 0こんなの?)
でチェックすると思うんですけど、溜めた分だけfor分などでループさせるのでしょうか?
上のログにもあるように、何個の絵を描くかは決まってないので、
できれば、ループじゃなく一気にチェックしたいんですけど、可能でしょうか?
可能でしたら、どのような実現方法があるか教えてください。
よろしくお願いします。
> 構造体の配列に溜めた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 ) {
// 見つけた!
}
早速、レスを返していただきありがとうございます。
あのー、すごくトンチンカンな質問かもしれませんが、、、
std::find(******)っていうのは、MFC環境でも使えるのでしょうか?
MSDNで検索したところ、STLサンプルしか出てこなかったので・・・
>なにか不都合があるのかしら?
いえ、不都合っていうほどじゃないですが、
上の記述通り複数の絵があり、しかも何個かは決めてないので、
ループさせるとどんどん重くなるんじゃないかという心配をしているだけです。
> std::find(******)っていうのは、MFC環境でも使えるのでしょうか?
使えます。
> 上の記述通り複数の絵があり、しかも何個かは決めてないので、
> ループさせるとどんどん重くなるんじゃないかという心配をしているだけです。
'複数の絵'っていくつくらいでしょう?
高々数百程度ならばループを回したところでどうってことないのでは?