いつも参考にさせて頂いてます。
Windows2000 VC++6.0 MFC で開発しています。
コンボボックスのドロップダウンリストの横幅を、リストアイテムの横幅に合わせて
広げるために、以下のように作りました。
-----------------------------------------------------------------------
void CMyComboBox::OnDropdown()
{
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
CString szItem; // リストのアイテム文字列
CString szLongest; // 最も長い文字列
int nLen = 0; // 文字列の長さ
int nMaxLen = 0; // 文字列の長さの最長値
int nSize = GetCount(); // アイテムの数を取得
for( int i = 0; i < nSize; i++ ){
GetLBText( i, szItem );
nLen = szItem.GetLength();
if( nMaxLen < nLen ){
szLongest = szItem;
nMaxLen = nLen;
}
}
CDC* pDC = GetDC();
CSize size = pDC->GetTextExtent( szLongest );
CRect rect;
GetClientRect( &rect );
if( size.cx > rect.right ){ // コンボの横幅より大きい場合
SetDroppedWidth( size.cx ); // リストの横幅を広げる
}
ReleaseDC( pDC );
}
-----------------------------------------------------------------------
きちんと動いてはくれるのですが、アイテムの文字数が多ければ多いほど右側に
たくさんのスペースが空いてしまいます。どうすれば文字列の横幅と同じくらい
になるのでしょうか。ご教示ください。
また、ここが変だとか、こうした方がいいという所がありましたら合わせて
ご指摘頂けると有り難いです。
宜しくお願い致します。
> CDC* pDC = GetDC();
>
> CSize size = pDC->GetTextExtent( szLongest );
サイズを得るときにコンボボックスの描画に使われている
フォントを使っていなさそうなのが気になります。
dairygoods様、有難うございます。
>サイズを得るときにコンボボックスの描画に使われている
>フォントを使っていなさそうなのが気になります。
なるほどと思いまして、あれこれ調べて
CDC* pDC = GetDC(); の前に以下のように追加しました。
--------------------------------------------------------------------------------
・
・
・
NONCLIENTMETRICS metrics;
metrics.cbSize = sizeof( NONCLIENTMETRICS );
BOOL ret = SystemParametersInfo( SPI_GETNONCLIENTMETRICS, sizeof
(NONCLIENTMETRICS ), &metrics, 0 );
CDC* pDC = GetDC();
・
・
・
--------------------------------------------------------------------------------
metricsのメンバを見てみるとMS UI Gothicというのが入っていましたが、これがコンボで
使っているフォントということで合ってますでしょうか?
合っている場合、これをこのあとどうすればいいのか分かりません。
よろしければご教示下さい。
それとも見当違いなことしてますでしょうか・・・
コンボボックスのフォントは、GetFont()で取得できます。
なので、
CDC* pDC = GetDC();
CFont* pOldFont = pDC->SelectObject(GetFont());
CSize size = pDC->GetTextExtent( szLongest );
pDC->SelectObect(pOldFont); // 元に戻す
とします。
dairygoods様、有難うございます。
やっぱり間違えてましたか・・・(汗
教えて頂いたとおりにして、無事解決しました。
本当に有難うございました。
また何かありましたら宜しくお願い致します。