首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

MFC ToolBar 上 ComboBox 尺寸異常:計算字元寬高與 Create 參數修正

     編輯:程式設計綜合問答

問題分析

原碼中 `rc_item.bottom = rc_item.top + (char_h * 16);` 設定下拉列表高度,但 `char_h` 計算可能不含外部行距,且 `SetButtonInfo` 寬度用 `char_w * 32` 可能過大/過小。

修正步驟

  1. 獲取正確字體度量**:
    CClientDC dc(this);
    CFont* pOld = dc.SelectObject(&font);
    TEXTMETRIC tm; dc.GetTextMetrics(&tm);
    int charW = tm.tmAveCharWidth;
    int charH = tm.tmHeight + tm.tmExternalLeading; // 含行距
    dc.SelectObject(pOld);
    
  2. 按鈕寬度按實際字元數**:
    SetButtonInfo(8, IDC_FONTNAME_LIST, TBBS_SEPARATOR, charW * 20); // 顯示 ~20 字元
    
  3. ComboBox 矩形高度 = 按鈕高 + 下拉列表項高 * 可見項數**:
    
    CRect rcBtn;
    GetItemRect(8, &rcBtn); // 取得按鈕矩形
    CRect rcCombo = rcBtn;
    rcCombo.bottom = rcBtn.top + charH * 12; // 下拉顯示 12 項
    if (!font_name_list.Create(WS_CHILD|WS_VISIBLE|WS_VSCROLL|CBS_DROPDOWNLIST|CBS_SORT,
                               rcCombo, this, IDC_FONTNAME_LIST)) return -1;
    
  4. 創建後微調**:
    
    font_name_list.SetFont(&font);
    font_name_list.MoveWindow(rcCombo); // 確保尺寸生效
    

關鍵點

  • `GetItemRect` 取得的是 **按鈕** 區域,ComboBox 需向下擴展容納下拉列表。
  • `CBS_DROPDOWNLIST` 模式下用戶不可編輯,僅選擇。
  • 若仍異常,可在 `OnSize` 中動態 `MoveWindow` 適應 ToolBar 高度變化。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved