Editの選択範囲の制限

[戻る]
まひ 2002/09/13(金) 16:08:50
いつもお世話になっております。

VC6.0、MFCを使用して、ダイアログベースのアプリを作成しています。
その中のEditBoxにテキストを表示した際に、選択できる文字数を1文字に制限したいのですが
どの様にすれば実現できるでしょうか?

よろしくお願いします。

tib 2002/09/13(金) 21:25:05
ベタだなぁ、と思いつつこんなの試してみました。

CEditを派生させてCMyEditを作る。
CMyEditのメッセージマップに「WM_LBUTTONDOWN, WM_LBUTTONUP, WM_MOUSEMOVE」を加える。
CMyEditのメンバ変数に「bool m_bIsSelecting」を加える。
CMyEdit::CMyEdit()でm_bIsSelectingをfalseに初期化。
CMyEdit::OnLButtonDown()でbIsSelectingにtrueにセット。
CMyEdit::OnLButtonUp()でbIsSelectingにfalseにセット。
CMyEdit::OnMouseMove()でCEdit::OnMouseMove()を呼んだ後に、
 m_bIsSelectingがtrueなら
  CEdit::GetSel()で選択範囲を取得。
  CEdit::GetLine()でエディットボックスの内容を取得。
  選択開始位置にある文字が全角か半角かを判断して、
   半角→選択終了位置に選択開始位置+1をセット。
   全角→選択終了位置に選択開始位置+2をセット。
  CEdit::SetSel()で選択範囲を設定。

エディットコントロールにCMyEdit型変数をマップする。

まひ 2002/09/17(火) 14:35:00
tibさんお返事ありがとうございます。

早速やってみようと思ってのですが、私の勉強不足で
>エディットコントロールにCMyEdit型変数をマップする。
というところがわかりません。
ヘッダーに
 CMyEdit m_MyEdit;
を追加して、
 void CxxxDlg::DoDataExchange(CDataExchange* pDX)
 {
  Dialog::DoDataExchange(pDX);
  //{{AFX_DATA_MAP(CxxxDlg)
  DDX_Control(pDX, IDC_MYEDIT, m_MyEdit); ←これを追加
  //}}AFX_DATA_MAP
 }
ってことでいいのでしょうか?

あと、もしこれで合っているとしたら、CEdit::SetSel()がうまく機能しないのです。
使用するに当たってこれ忘れてるんじゃない?っていう事はありますか?

よろしくお願いします。

tib 2002/09/18(水) 16:27:54
>>エディットコントロールにCMyEdit型変数をマップする。
>というところがわかりません。
私がやった手順は、
・Class Wozard > メンバ変数
・「コントロールID」リストから、エディットコントロールのリソースIDを選択して「変
数の追加」をクリック。
・「メンバ変数の追加」ダイアログで以下の通り入力。
 カテゴリ:コントロール
 変数のタイプ:CMyEdit
 変数名:適当に

です。多分まひさんのおっしゃるのと同じ結果になってます。

>使用するに当たってこれ忘れてるんじゃない?っていう事はありますか?
思い当たるところがあるとすれば「CMyEdit::OnMouseMove()でCEdit::OnMouseMove()を呼
んだ後に」行うべき処理を、呼ぶ前に書いてないか? ということくらいですが...。

あとはSetSel()の引数に望み通りの値が入っているかどうか、でしょうか。

まひ 2002/09/20(金) 09:35:31
[[解決]]
tibさん出来ました!!
アドバイス本当にありがとうございました。

返事が遅れてすいませんでした。

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