dポイントプレゼントキャンペーン実施中!

C++のMFCを使っています。
ダイアログベースにループを使って
ピクチャボックスを複数作成したいです。

ボタンを押す

ピクチャボックスを作成しながら画像ファイルを読み込む
(繰り返しで複数作成する)

終了

そのピクチャボックスはドラッグ&ドロップで移動できるようにもしたいです。

A 回答 (3件)

 こんばんは。



 すんません、迂闊でした。スタティックコントロールはマウスメッセージを受け取らないので、

 http://ray.sakura.ne.jp/tips/staticmes.html

 取りあえずSS_NOTIFYのフラグを追加して、

 p->Create(TEXT("test"), WS_CHILD | WS_VISIBLE | SS_NOTIFY | SS_BITMAP | SS_CENTERIMAGE, CRect(pt.x, pt.y, pt.x + WIDTH, pt.y + WIDTH), this);

 外側(ダイアログ側)からどうにかしないといけません。
 派生クラスを作成する意味は無いかもしれません。
    • good
    • 0
この回答へのお礼

詳しく教えていただき有難うございました。
とりあえず教えていただいたことを参考にしてプログラミングしていこうと思います。

お礼日時:2010/04/26 18:41

 こんばんは。


 取りあえずD&Dは後回しにして、画像を読み込みながらピクチャーボックスを並べて行く事を優先しましょう。
 更にD&Dへ対応する為にCStaticの派生クラスを作成しておきます。

 「MFCクラスの追加」
 http://msdn.microsoft.com/ja-jp/library/1zb9t6z7 …

 大体こんな感じです。以下参考程度に。

//ヘッダに置く
//CStaticから派生したCPictureのヘッダ
#include"picture.h"

//typedefで型の修正を容易にしておく
typedef CMap<CPicture*, CPicture*, CPicture*, CPicture*> Map;
Map m_map;

//自前のメンバ関数
CPicture* CMFCDlg::LoadPicture(const CString& sFileName)
{
HBITMAP hBitmap = (HBITMAP)::LoadImage(NULL, sFileName.GetString(), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
if(hBitmap == NULL)return NULL;
//64x64,5個毎に改行
const int WIDTH = 64;
const int COLUMN = 5;
const POINT pt = {(m_map.GetCount() % COLUMN) * WIDTH, (m_map.GetCount() / COLUMN) * WIDTH};
CPicture* p = new CPicture();
p->Create(TEXT("test"), WS_CHILD | WS_VISIBLE | SS_BITMAP | SS_CENTERIMAGE, CRect(pt.x, pt.y, pt.x + WIDTH, pt.y + WIDTH), this);
p->SetBitmap(hBitmap);
m_map[p] = p;
return p;
}

//始末
void CMFCDlg::OnDestroy()
{
CDialog::OnDestroy();
// TODO: ここにメッセージ ハンドラ コードを追加します。
POSITION pos = m_map.GetStartPosition();
CPicture* value, *key;
while(pos != NULL)
{
m_map.GetNextAssoc(pos, key, value);
HBITMAP hBitmap = value->SetBitmap(NULL);
if(hBitmap)
::DeleteObject(hBitmap);
delete value;
}
m_map.RemoveAll();
}

//ボタン
void CMFCDlg::OnBnClickedButton1()
{
// TODO: ここにコントロール通知ハンドラ コードを追加します。
CStringArray sFiles;
sFiles.Add(TEXT("test1.bmp"));
sFiles.Add(TEXT("test2.bmp"));
sFiles.Add(TEXT("test3.bmp"));
for(int i = 0; i < sFiles.GetCount(); ++i)
{
CPicture* p = this->LoadPicture(sFiles[i]);
_ASSERT(p);
}
}
    • good
    • 0

何を知りたいのか、質問の意味がよく分からないのですが……


ダイアログエディタでピクチャーボックスを貼り付けたウインドウを複数起動したいということでしょうか。

言うまでもなく、DoModalで呼び出すモーダルダイアログは作れません。(1個作ったら、それを閉じるまで次を作れないですからね)
この場合、CreateWindowを使ってモードレスダイアログとして作ることになります。ま、あとはクラスで定義しておけば幾つ出すのもオブジェクトを作るだけですが。作ったオブジェクトは配列で管理するということも言うまでもないですね。

モードレスダイアログの場合は終了処理に気を付ける必要があります。


> そのピクチャボックスはドラッグ&ドロップで移動できるようにもしたいです。

これも意味が分からないのですが、モードレスダイアログの移動なら普通のウインドウと同じように移動出来ますけど。(それとも、中身の画像をドラッグ&ドロップで移し替えるってことなのかな?)
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!