ダイアログバー上のドラッグリストボックスでドラッグできません

[戻る]
R 2008/10/16(木) 16:43:52
はじめまして。
Rと申します。
環境はWindowsXP(SP2) VC++2003 MFC です。

MDIアプリケーションでメインフレームにダイアログバーを付け、ダイアログバー上でド
ラッグリストボックス(CDragListBox)を使用したいのですが、そのドラッグリストボッ
クスの内容がドラッグで動いてくれません。
どなたかよい方法をご存じの方がおられましたら、お教え下さい。

Kerry 2008/10/16(木) 17:50:13
VC++6.0とVC++2005でやってみましたが、普通にドラッグできましたよ。
どのようなコードを書かれていますか?

R 2008/10/17(金) 14:07:56
kerry様

レスありがとうございます。

リソースエディタでダイアログバー(IDD_DIALOGBAR)を生成し
その上にリストボックス(IDC_LIST1)を配置しました。

私は以下のコードを書いています。
*********************************************************************
CMainFrm.h
*********************************************************************
class CMainFrame : public CMDIFrameWnd
{
    DECLARE_DYNAMIC(CMainFrame)
public:
    CMainFrame();

// 属性
public:
    CDragListBox* m_DragListBox <----ドラッグリストへのポインタ

・
・
省略
・
・
protected:  // コントロール バー用メンバ
    CStatusBar  m_wndStatusBar;
    CToolBar    m_wndToolBar;

    CDialogBar m_wndDlgBar;   <----ダイアログバー
・
・
};


****************************************************************
MainFrm.cpp
****************************************************************
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
・
・
省略
・
・    
  m_wndDlgBar.Create(this,IDD_DIALOGBAR,CBRS_LEFT,IDD_DIALOGBAR); <---ダイア
ログバーをクリエイト
    
    
  m_DragListBox = (CDragListBox*) m_wndDlgBar.GetDlgItem(IDC_LIST1); <--ドラ
ッグリストのポインタ取得


  m_DragListBox->AddString("aaaaaa");
  m_DragListBox->AddString("bbbbbb");
  m_DragListBox->AddString("cccccc");

    return 0;
}

ドラッグリストにaaaaaa,bbbbbb,ccccccは表示できるのですが、ドラッグが出来ませ
ん。


kerryさんはどのように実装されたのでしょうか?
宜しくお願い致します。

Kerry 2008/10/17(金) 14:54:05
> m_DragListBox = (CDragListBox*) m_wndDlgBar.GetDlgItem(IDC_LIST1);

↑これは単にGetDlgItem()で返された一時的なCWndポインタを
CDragListBox*型にキャストしてるだけで、サブクラス化を行っている
わけではありません。
よって、ドラッグリストボックスの動作は行わず、単にリストボックス
としてしか動作しないでしょう。

以下のようにサブクラス化を行ってやれば良いかと思います。

class CMainFrame : public CMDIFrameWnd
{
    CDragListBox m_dragListBox;
};

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    m_wndDlgBar.Create(this, IDD_DIALOGBAR, CBRS_LEFT, AFX_IDW_DIALOGBAR);

    m_dragListBox.SubclassDlgItem(IDC_LIST1, &m_wndDlgBar);

    m_dragListBox.AddString("aaaaaa");
    m_dragListBox.AddString("bbbbbb");
    m_dragListBox.AddString("cccccc");

    return 0;
}

R 2008/10/17(金) 18:53:13
Kerry様

さっそくのレスありがとうございます。

教えて頂いた通りにコードを書き直したのですが、プログラムを実行をするとサブクラ
ス化を行っている以下のコードでエラーダイアログが出て落ちてしまいます。
>m_dragListBox.SubclassDlgItem(IDC_LIST1, &m_wndDlgBar);

調べてみたのですが、ダイアログバーはメッセージを受け取ることが出来ないみたいで
す。(ダイアログバーは親になれない??)
そこでメインフレームでサブクラス化しようと、以下のように書き換えてみました。
>m_dragListBox.SubclassDlgItem(IDC_LIST1, this);

書き換えて実行したところこの行は通過したのですが、次のm_dragListBox.AddString
("aaaaaa");でエラーダイアログが出て落ちてしまいました。

Kerry 2008/10/17(金) 20:08:12
> 調べてみたのですが、ダイアログバーはメッセージを受け取ることが
> 出来ないみたいです。(ダイアログバーは親になれない??)

?

何のメッセージが受け取れないのですか?
親になれない、とはどういう意味ですか?

状況をもう少し正確に伝えてください。
エラーダイアログというのは具体的にどんな内容ですか?
ASSERTであればMFCのコードのどの部分で引っかかってるのか示してください。


> そこでメインフレームでサブクラス化しようと、以下のように書き換えてみました。
> >m_dragListBox.SubclassDlgItem(IDC_LIST1, this);

リストボックスはメインウィンドウに貼り付いているわけではないので、
うまくいかないのは当然です。

古いスレッドには追加発言できません。