エディットBOXの入力制限 – プログラミング – Home

エディットBOXの入力制限
 
通知
すべてクリア

エディットBOXの入力制限


マーク
 マーク
(@マーク)
ゲスト
結合: 23年前
投稿: 2
Topic starter  

エディットBOXに文字(全角)しか記入できなくする為には、
どのような処理をすればよいのでしょうか?
また、文字制限もできれば行いたいのです。
どうかご指導よろしくお願いします。


引用解決済
トピックタグ
yas0302
 yas0302
(@yas0302)
ゲスト
結合: 23年前
投稿: 37
 

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 を、リンクしてください。


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

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();
}


返信引用
マーク
 マーク
(@マーク)
ゲスト
結合: 23年前
投稿: 2
Topic starter  

>WM_CHARにマルチバイト文字の先頭バイトが渡されるのを利用します。

プログラムそのまま引用したらこんなエラーが出ました。
同じじゃだめですか?(^^;

'CWnd::OnChar' : 静的でないメンバ関数の中で呼び出しが正しくありません。


返信引用
K.N
 K.N
(@K.N)
ゲスト
結合: 23年前
投稿: 14
 

>>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 C
Dlg : public CDialog
{
...
CMyEdit m_MyEdit; //←追加
...

Dlg.cppに
BOOL C
Dlg::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();
}


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました