CComboBoxExのリストボックスの文字数について – プログラミング – Home

CComboBoxExのリストボックス...
 
通知
すべてクリア

[解決済] CComboBoxExのリストボックスの文字数について


シュウ
 シュウ
(@シュウ)
ゲスト
結合: 22年前
投稿: 43
Topic starter  

環境は以下です。
WinXP
VC7(VisualStudio.NET2003)
MFC

CComboBoxExのエディットボックスの文字数は、
GetComboBoxCtrl()->LimitText(300);
で制限できます。

入力された文字列を、InsertItem(...)で設定すると、
リストボックスには259文字(MAX_PATH-1)分しか設定されないようです。
300文字を渡しても、InsertItem(...)したものを
SetCurSel()でエディット部に表示させると
259文字で切れてしまっています。

リストボックスの文字数を制限する方法をご存知でしたら
教えてください。

よろしくお願いします。


引用未解決
トピックタグ
ぬふや
 ぬふや
(@ぬふや)
ゲスト
結合: 18年前
投稿: 34
 

それって終端文字含めて300って話じゃないのかと思ったけど、MSDNには特に言
及されていなかった。
301を指定しても259文字で切れるの?


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

> 301を指定しても259文字で切れるの?
299じゃなくて259だしね…

ListViewにも260文字制限はあったはず。

> リストボックスの文字数を制限する方法
というか、制限を解除して300文字出す方法?
オーナードローならできるんじゃないかな。


返信引用
シュウ
 シュウ
(@シュウ)
ゲスト
結合: 22年前
投稿: 43
Topic starter  

ぬふやさん、返答ありがとうございます。

コンボボックスのエディット部にはLimitText()で設定した文字数-1が
表示されます。
LimitTest()に301を設定して300文字渡しても、
エディットには300文字が設定されますが、
その文字をそのままInsertItem()しても
259文字で切れてしまいます。

シャノンさん、返答ありがとうございます。

> ListViewにも260文字制限はあったはず。
初めて知りました。ありがとうございます。
調べてみると、確かにCListCtrlやCTreeCtrlも260文字制限という記事が
出てきますね。

> というか、制限を解除して300文字出す方法?
はい。リストボックスに設定できる文字数もエディットと
同じにしたいと考えています。

> オーナードローならできるんじゃないかな。
コンボボックスのリストボックスには、デフォルトですと
先頭の文字からコンボボックスの幅の分しか表示されません。
リストボックスに表示される文字数はそんなに多くありませんので、
オーナードローは考えておりません。

300文字をInsertItemした後で、その文字をドロップダウンで選択すると
259文字で切れてしまうことを解決したいと考えています。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

表示上見えないだけで、なんかデータとしては持っているっぽいですよ?

CComboBox* pCombo = (CComboBox*)this->GetDlgItem(IDC_COMBO1);
pCombo->AddString(CString(_T('a'), MAX_PATH - 1) + _T(BBBBBBBBBBBB));

こんなコードを書いて、
>その文字をドロップダウンで選択
したあと、すべてを選択状態にして、テキストエディタに貼り付けてみたら
ちゃんとB~のところまで文字列がありました。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

あ~すみません、CComboBoxExでしたね。。。orz


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

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~のところまで文字列がありました。
のような状態にはなります。


返信引用
シュウ
 シュウ
(@シュウ)
ゲスト
結合: 22年前
投稿: 43
Topic starter  

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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