2016-05-09 75 views
2

ユーザが入力したプロパティ編集ボックス(CMFCPropertyGridCtrl)の各文字を検証して更新しようとしました。MSDNを検索しましたPushChar()などの機能を見つけてください。しかし、それらの方法は私の問題を解決しませんでした。基本的に私はCMFCPropertyGridCtrl編集ボックスのCEdit::OnChar()機能を実装する必要があります。あなたは、プロパティのコンストラクタにlpszEditMaskまたはlpszEditTemplateまたはlpszValidCharsパラメータを提供する場合
enter image description hereMFCプロパティグリッドコントロール(CMFCPropertyGridCtrl)でユーザが入力した各文字をバリデートする方法

+1

PreTranslateMessageをオーバーライドしてWM_CHARのメッセージを処理することはできませんか?ドキュメントによると、それはPTMメソッドをサポートしています:https://msdn.microsoft.com/en-us/library/bb983759.aspx –

+0

'CEdit :: OnChar()'はあなたが探しているものでも、 'CMFCPropertyGridCtrl'に相当します。両方とも、キーボード以外のソースからの入力(例えば、マウスペースト操作)を説明することができない。変更通知に応答する必要があります。 – IInspectable

+0

@IInspectable:自分自身の 'CMFCPropertyGridCtrl :: PreTranslateMessage'によってオーバーライドされているので、キーボードから来てもOnCharではできないと思います。 – sergiol

答えて

0

これについてサンプルコードを提供します。 CustomProperties.hにおいて、クラスフォームCMFCPropertyGridProperty

class CMyEditProp : public CMFCPropertyGridProperty 
{ 
public: 
    CMyEditProp (const CString& strName, const CString& strValue, LPCTSTR lpszDescr = NULL, DWORD dwData = 0); 

protected: 
    virtual CWnd* CreateInPlaceEdit(CRect rectEdit, BOOL& bDefaultFormat); 
    virtual CString FormatProperty(); 
}; 

CEditからクラスを派生し、それにOnChar()方法を実装導出します。

class MyEdit:public CEdit 
{ 
public: 
     void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
     { 
      if(!IsCharAlpha(nChar)) 
      return; 

      CEdit::OnChar(nChar, nRepCnt, nFlags); 
     } 
    DECLARE_MESSAGE_MAP() 
}; 

CustomProperties.cppヘッダーファイルで宣言されたすべてのメソッドを実装します。

CMyEditProp ::CPasswordProp(const CString& strName, const CString& strValue, LPCTSTR lpszDescr, DWORD dwData) 
: CMFCPropertyGridProperty(strName, (LPCTSTR) strValue, lpszDescr, dwData) 
{ 
} 

CWnd* CMyEditProp ::CreateInPlaceEdit(CRect rectEdit, BOOL& bDefaultFormat) 
{ 
    MyEdit pWndEdit; 
    DWORD dwStyle = WS_VISIBLE | WS_CHILD | ES_AUTOHSCROLL ; 

    if (!m_bEnabled || !m_bAllowEdit) 
    { 
     dwStyle |= ES_READONLY; 
    } 

    pWndEdit.Create(dwStyle, rectEdit, m_pWndList, AFX_PROPLIST_ID_INPLACE); 


    bDefaultFormat = TRUE; 
    return &pWndEdit; 
} 

BEGIN_MESSAGE_MAP(MyEdit,CEdit) 
    ON_WM_CHAR() 
END_MESSAGE_MAP() 

これは編集コントロールと同じように機能し、ユーザーが入力したすべての文字を検証できます。

1

は、そのプロパティの編集コントロールではなく、通常のCEditCMFCMaskedEditになります。 CMFCPropertyGridProperty::CreateInPlaceEditの実装について私が言ったことを確認できます。私はあなたの場所にあった場合

だから、私は、入力にマスキングが、あなたがlpsz...引数を指定するとき、それがどのように動作するかを確認するためにCMFCPropertyGridProperty::CreateInPlaceEditにブレークポイントを置く方法を知っているCMFCMaskedEditドキュメントを読んでいましたし、その後にここに戻って来るだろう物事がどのようになったかを報告するページ。

+0

CMFCPropertyGridProperty :: CreateInPlaceEditが正常に動作しています –

+0

' CMFCPropertyGridProperty: :CreateInPlaceEdit'は仮想関数です。あなたが作成した派生クラスで上書きしましたか? – sergiol

関連する問題