ダイアログバーのエディットコントロールの操作

[戻る]
kazu 2003/12/18(木) 01:22:23
お世話になります。アドバイスを頂けないでしょうか。
CEditViewでエディタを作っています。
エディットボックスのついたダイアログバーを設置しました。
CMainFrame::OnCreateに以下のように記述(m_wndDlgBarはCDialogBar型のメンバ)
m_wndDlgBar.Create(this, IDD_DIALOGBAR1, WS_VISIBLE | CBRS_TOP,AFX_IDW_TOOLBAR))

以下の2つの事をしようとしました。

@エディットボックスに値をセット
(1)CMainFrameのメンバにCEdit型の変数(m_edit)を宣言しました。
DoDataExchangeでm_editとエディットボックスのIDを関連づけて、
m_edit.SetWindowTextでデータをセットしようとしましたが、データが
セットされませんでした。

(2)そこで、ただのグローバルのデータCEdit型のポインタ(pEdit)を宣言して、
以下のようにエディットボックスと関連付けました。
pEdit= (CEdit*)m_wndDlgBar.GetDlgItem(IDC_EDIT1);
そして、pEditCmp->GetWindowText(・・・)でデータのセットがうまくいきました。

Aエディットボックス(ReadOnly)の色を白色にしたい
(1)CMainFrameでON_WM_CTLCOLORメッセージを使用しましたが、うまくいきませんでし
た。
HBRUSH CMainFrame::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
 HBRUSH hbr = CFrameWnd::OnCtlColor(pDC, pWnd, nCtlColor);
 if( pWnd->GetDlgCtrlID() == IDC_EDIT_CMP){
  pDC->SetBkColor(GetSysColor(COLOR_WINDOW));
  return GetSysColorBrush(COLOR_WINDOW);
 }
 return hbr;
}
(2)そこで、以下のようにCMainFrame::OnCreateでサブクラス化しましたが、
ON_WM_CTLCOLORメッセージで処理することができませんでした。
m_wndDlgBar.SubclassDlgItem(IDC_EDIT1, this);

(3)そこで(2)を止めてCDialogBarを継承してCMyDlgBarを作成して、m_wndDlgBarを
CMyDlgBar型のメンバとしました。
CMyDlgBarの中で、ON_WM_CTLCOLORメッセージの処理を行ったところ、うまくいきまし
た。

@(2)、A(3)のやり方が正しくて、それ以外は間違っているのでしょうか?
また、一般的にはどうするものなのでしょうか?

開発環境はWinXp/MFC7.0です。
よろしくお願いいたします。

dairygoods 2003/12/18(木) 10:28:37
エディットボックスは、CFrameWndの直接の子ではないので、
CFrameWndでDDXやOnCtlColor、SubclassDlgItemを行うことができません。

kazu 2003/12/18(木) 23:29:53
回答ありがとうございます。
CDialogBarでDDXを使おうとしてもうまくいきませんでした。
エディットボックスはCDialogBarの直接の子でもないのでしょうか。
しかし、CMyDlgBarでON_WM_CTLCOLORメッセージでIDC_EDIT1を
認識して、白くできたのはなぜでしょうか?
どのやり方が一般的かわかりません。
よろしくお願いいたします。

はん 2003/12/19(金) 02:16:57
エディットボックスはCDialogBarの上に生成されていて、CFrameWnd上に生成されている
わけではありません。
つまり、エディットボックスは、CDialogBarの子ウィンドウで、CFrameWndの直接の子ウ
ィンドウではないので、
CDialogBar上でしたら DDXやOnCtlColor、SubclassDlgItemを行うことができますが、
CFrameWnd上でDDXやOnCtlColor、SubclassDlgItemを行うことができません。

kazu 2003/12/22(月) 00:38:55
[[解決]]
CDialogBar上でDDXを行うことができなかったため、
そのつど、GetDlgItemでエディットボックスのハンドル
を取得して処理することにしました。
親切に教えていただき、ありがとうございました。

はん 2003/12/22(月) 11:43:32
テクニカル ノート 26: DDX ルーチンおよび DDV ルーチン
ここらへん読みました?
DDXはCDialogBarからでも使用できます。
できないのは使い方が悪いから

はん 2003/12/22(月) 12:19:44
これが使い方


#pragma once

class CDDXDlgBar : public CDialogBar
{
    DECLARE_DYNAMIC(CDDXDlgBar)

    int m_nTest;

public:
    CDDXDlgBar();
    virtual ~CDDXDlgBar();

protected:
    virtual void DoDataExchange(CDataExchange* pDX);

    DECLARE_MESSAGE_MAP()
public:
    afx_msg void OnUpdateTestBtn(CCmdUI *pCmdUI);
    afx_msg void OnTestBtn();
};




#include "stdafx.h"
#include "ddxtest.h"
#include "DDXDlgBar.h"

IMPLEMENT_DYNAMIC(CDDXDlgBar, CDialogBar)
CDDXDlgBar::CDDXDlgBar()
{
    m_nTest= 0 ;
}

CDDXDlgBar::~CDDXDlgBar()
{
}

void CDDXDlgBar::DoDataExchange(CDataExchange* pDX)
{
    CDialogBar::DoDataExchange(pDX);
    DDX_Text(pDX, IDC_EDIT_TEST, m_nTest);
    DDV_MinMaxInt(pDX, m_nTest, 0, 255);
}

BEGIN_MESSAGE_MAP(CDDXDlgBar, CDialogBar)
    ON_UPDATE_COMMAND_UI(IDC_TEST_BTN, OnUpdateTestBtn)
    ON_COMMAND(IDC_TEST_BTN, OnTestBtn)
END_MESSAGE_MAP()

void CDDXDlgBar::OnUpdateTestBtn(CCmdUI *pCmdUI)
{
    pCmdUI->Enable(TRUE) ;
}

void CDDXDlgBar::OnTestBtn()
{
    UpdateData(TRUE) ;
    TRACE("%d", m_nTest) ;
}

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