コンボボックスのドロップダウンリストについて – プログラミング – Home

コンボボックスのドロップダウンリストに...
 
通知
すべてクリア

[解決済] コンボボックスのドロップダウンリストについて


y.k
 y.k
(@y.k)
ゲスト
結合: 21年前
投稿: 3
Topic starter  

いつも参考にさせて頂いてます。

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

きちんと動いてはくれるのですが、アイテムの文字数が多ければ多いほど右側に
たくさんのスペースが空いてしまいます。どうすれば文字列の横幅と同じくらい
になるのでしょうか。ご教示ください。

また、ここが変だとか、こうした方がいいという所がありましたら合わせて
ご指摘頂けると有り難いです。

宜しくお願い致します。


引用未解決
トピックタグ
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

> CDC* pDC = GetDC();
>
> CSize size = pDC->GetTextExtent( szLongest );

サイズを得るときにコンボボックスの描画に使われている
フォントを使っていなさそうなのが気になります。


返信引用
y.k
 y.k
(@y.k)
ゲスト
結合: 21年前
投稿: 3
Topic starter  

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というのが入っていましたが、これがコンボで
使っているフォントということで合ってますでしょうか?

合っている場合、これをこのあとどうすればいいのか分かりません。
よろしければご教示下さい。

それとも見当違いなことしてますでしょうか・・・


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

コンボボックスのフォントは、GetFont()で取得できます。

なので、

CDC* pDC = GetDC();
CFont* pOldFont = pDC->SelectObject(GetFont());
CSize size = pDC->GetTextExtent( szLongest );
pDC->SelectObect(pOldFont); // 元に戻す

とします。


返信引用
y.k
 y.k
(@y.k)
ゲスト
結合: 21年前
投稿: 3
Topic starter  

dairygoods様、有難うございます。

やっぱり間違えてましたか・・・(汗

教えて頂いたとおりにして、無事解決しました。

本当に有難うございました。
また何かありましたら宜しくお願い致します。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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