• ベストアンサー

C++のMFCを使っています。

C++のMFCを使っています。 ダイアログベースにループを使って ピクチャボックスを複数作成したいです。 ボタンを押す ↓ ピクチャボックスを作成しながら画像ファイルを読み込む (繰り返しで複数作成する) ↓ 終了 そのピクチャボックスはドラッグ&ドロップで移動できるようにもしたいです。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.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);  外側(ダイアログ側)からどうにかしないといけません。  派生クラスを作成する意味は無いかもしれません。

noname#129137
質問者

お礼

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

その他の回答 (2)

回答No.2

 こんばんは。  取りあえずD&Dは後回しにして、画像を読み込みながらピクチャーボックスを並べて行く事を優先しましょう。  更にD&Dへ対応する為にCStaticの派生クラスを作成しておきます。  「MFCクラスの追加」  http://msdn.microsoft.com/ja-jp/library/1zb9t6z7(VS.80).aspx  大体こんな感じです。以下参考程度に。 //ヘッダに置く //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); } }

回答No.1

何を知りたいのか、質問の意味がよく分からないのですが…… ダイアログエディタでピクチャーボックスを貼り付けたウインドウを複数起動したいということでしょうか。 言うまでもなく、DoModalで呼び出すモーダルダイアログは作れません。(1個作ったら、それを閉じるまで次を作れないですからね) この場合、CreateWindowを使ってモードレスダイアログとして作ることになります。ま、あとはクラスで定義しておけば幾つ出すのもオブジェクトを作るだけですが。作ったオブジェクトは配列で管理するということも言うまでもないですね。 モードレスダイアログの場合は終了処理に気を付ける必要があります。 > そのピクチャボックスはドラッグ&ドロップで移動できるようにもしたいです。 これも意味が分からないのですが、モードレスダイアログの移動なら普通のウインドウと同じように移動出来ますけど。(それとも、中身の画像をドラッグ&ドロップで移し替えるってことなのかな?)

関連するQ&A