エディットBOXに文字(全角)しか記入できなくする為には、
どのような処理をすればよいのでしょうか?
また、文字制限もできれば行いたいのです。
どうかご指導よろしくお願いします。
Imm????? で、可能かもしれませんが、
とりあえず、こんな方法でも可能です。
#include <IMM.H>
BOOL CXXXDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: この位置に固有の処理を追加するか、または基本クラスを呼び出してください
if( pMsg->hwnd==m_edit1.m_hWnd )
{
if( pMsg->message==WM_IME_COMPOSITION )
{
HIMC hIMC = ImmGetContext(m_edit1.m_hWnd);
if( pMsg->lParam & GCS_RESULTSTR )
{
char str[256];
// IME の変換文字列を取得します。
int len = ImmGetCompositionString(hIMC, GCS_RESULTSTR, NULL, 0);
ImmGetCompositionString(hIMC, GCS_RESULTSTR, str, len);
ImmReleaseContext(m_edit1.m_hWnd,hIMC);
str[len]=0;
// ここで str[] の中身をチェックして、漢字なら
// EDIT BOX にセットし、そうでなければ、破棄します。
return 1;
}
ImmReleaseContext(m_edit1.m_hWnd,hIMC);
}
if( pMsg->message==WM_CHAR )
{
// これは、全て無視する場合
// BS とかも無視されてしまうのでまずいです。
// 必要な、文字は無視しないようにします。
return 1;
}
}
:
:
:
return CXXXDlg::PreTranslateMessage(pMsg);
}
IMM32.LIB を、リンクしてください。
CEditの派生クラスを作ります。
> エディットBOXに文字(全角)しか記入できなくする為には、
WM_CHARにマルチバイト文字の先頭バイトが渡されるのを利用します。
void CMyEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
if (iscntrl(nChar) || _ismbblead(nChar))
CEdit::OnChar(nChar, nRepCnt, nFlags);
}
> また、文字制限もできれば行いたいのです。
WM_IME_CHARを処理します。
ON_MESSAGE(WM_IME_CHAR, OnImeChar)
...
LRESULT CMyEdit::OnImeChar(WPARAM wParam, LPARAM lParam)
{
if (wParamが無視したい全角文字?)
return 0;
else
Default();
}
>WM_CHARにマルチバイト文字の先頭バイトが渡されるのを利用します。
プログラムそのまま引用したらこんなエラーが出ました。
同じじゃだめですか?(^^;
'CWnd::OnChar' : 静的でないメンバ関数の中で呼び出しが正しくありません。
>>WM_CHARにマルチバイト文字の先頭バイトが渡されるのを利用します。
>同じじゃだめですか?(^^;
dairygoods さんの方法でエラーはでませんよ。
#但しMFCのダイアログにエディトボックス(IDC_EDIT1)を貼り付けてテストしました。
メニューの挿入/クラスの新規追加で
CMyEditクラスを追加 (ベースクラスにCEdit)
CMyEdit Class に WM_CHAR のハンドラを追加。
void CMyEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
if (iscntrl(nChar) || _ismbblead(nChar))
CEdit::OnChar(nChar, nRepCnt, nFlags);
}
Dlg.hに
#include MyEdit.h //←追加
class CDlg : public CDialog
{
...
CMyEdit m_MyEdit; //←追加
...
Dlg.cppに
BOOL CDlg::OnInitDialog()
{
...
m_MyEdit.SubclassDlgItem(IDC_EDIT1, this); //←追加
...
WM_IME_CHAR
MyEdit.hに
protected:
//{{AFX_MSG(CMyEdit)
afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);
afx_msg LONG OnImeChar(WPARAM, LPARAM); //←追加
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
MyEdit.cppに
BEGIN_MESSAGE_MAP(CMyEdit, CEdit)
//{{AFX_MSG_MAP(CMyEdit)
ON_WM_CHAR()
ON_MESSAGE(WM_IME_CHAR, OnImeChar) //←追加
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
...
LRESULT CMyEdit::OnImeChar(WPARAM wParam, LPARAM lParam)
{
/*
if (wParamが無視したい全角文字?)
return 0;
else
Default();
*/
return Default();
}