環境は以下です。
WinXP
VC7(VisualStudio.NET2003)
MFC
CComboBoxExのエディットボックスの文字数は、
GetComboBoxCtrl()->LimitText(300);
で制限できます。
入力された文字列を、InsertItem(...)で設定すると、
リストボックスには259文字(MAX_PATH-1)分しか設定されないようです。
300文字を渡しても、InsertItem(...)したものを
SetCurSel()でエディット部に表示させると
259文字で切れてしまっています。
リストボックスの文字数を制限する方法をご存知でしたら
教えてください。
よろしくお願いします。
それって終端文字含めて300って話じゃないのかと思ったけど、MSDNには特に言
及されていなかった。
301を指定しても259文字で切れるの?
> 301を指定しても259文字で切れるの?
299じゃなくて259だしね…
ListViewにも260文字制限はあったはず。
> リストボックスの文字数を制限する方法
というか、制限を解除して300文字出す方法?
オーナードローならできるんじゃないかな。
ぬふやさん、返答ありがとうございます。
コンボボックスのエディット部にはLimitText()で設定した文字数-1が
表示されます。
LimitTest()に301を設定して300文字渡しても、
エディットには300文字が設定されますが、
その文字をそのままInsertItem()しても
259文字で切れてしまいます。
シャノンさん、返答ありがとうございます。
> ListViewにも260文字制限はあったはず。
初めて知りました。ありがとうございます。
調べてみると、確かにCListCtrlやCTreeCtrlも260文字制限という記事が
出てきますね。
> というか、制限を解除して300文字出す方法?
はい。リストボックスに設定できる文字数もエディットと
同じにしたいと考えています。
> オーナードローならできるんじゃないかな。
コンボボックスのリストボックスには、デフォルトですと
先頭の文字からコンボボックスの幅の分しか表示されません。
リストボックスに表示される文字数はそんなに多くありませんので、
オーナードローは考えておりません。
300文字をInsertItemした後で、その文字をドロップダウンで選択すると
259文字で切れてしまうことを解決したいと考えています。
表示上見えないだけで、なんかデータとしては持っているっぽいですよ?
CComboBox* pCombo = (CComboBox*)this->GetDlgItem(IDC_COMBO1);
pCombo->AddString(CString(_T('a'), MAX_PATH - 1) + _T(BBBBBBBBBBBB));
こんなコードを書いて、
>その文字をドロップダウンで選択
したあと、すべてを選択状態にして、テキストエディタに貼り付けてみたら
ちゃんとB~のところまで文字列がありました。
あ~すみません、CComboBoxExでしたね。。。orz
CComboBoxExクラスをサブクラス化して、
CBN_SELCHANGEあたりのイベントをハンドリングして対処するとか。
void CComboBoxExSp::OnSelchange()
{
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
CString text;
int index = this->GetCurSel();
COMBOBOXEXITEM citem = {0};
citem.iItem = index;
citem.mask = CBEIF_TEXT;
citem.pszText = text.GetBuffer(300);
citem.cchTextMax = 300;
this->GetItem(&citem);
text.ReleaseBuffer();
this->SetWindowText(text);
}
一応これで、
>>その文字をドロップダウンで選択
>したあと、すべてを選択状態にして、テキストエディタに貼り付けてみたら
>ちゃんとB~のところまで文字列がありました。
のような状態にはなります。
Blueさん、返答ありがとうございます。
教えていただきました方法で私がやりたいことは実現できました。
ありがとうございました。
GetLBText()やFindStringExact()も以下のように実装しました。
void CHogeComboBoxEx::GetLBTextEx(int nIndex, CString& rString)
{
COMBOBOXEXITEM tCBEI;
tCBEI.mask = CBEIF_TEXT;
tCBEI.iItem = nIndex;
tCBEI.pszText = rString.GetBuffer(300);
tCBEI.cchTextMax = 300;
GetItem(&tCBEI);
rString.ReleaseBuffer();
}
int CHogeComboBoxEx::FindStringExactEx(int nIndexStart, LPCTSTR lpszFind)
{
int nRet = CB_ERR;
if (nIndexStart == -1)
nIndexStart = 0;
CString csText;
for (int i = nIndexStart; i < GetCount(); i++) {
GetLBTextEx(i, csText);
if (csText.CompareNoCase(lpszFind) == 0) {
nRet = i;
break;
}
}
return nRet;
}