2017-10-09 8 views
1

太字としてはCListBoxで個々の項目を設定:私はこの記事つまずいMFC

http://asg.unige.ch/Past/fuentes/Mfc/HowTo_44.html

だから、私は私のプロジェクトでクラスを再現:

// FontStyleListBox.cpp : implementation file 
// 

#include "stdafx.h" 
#include "Meeting Schedule Assistant.h" 
#include "FontStyleListBox.h" 


// CFontStyleListBox 

IMPLEMENT_DYNAMIC(CFontStyleListBox, CListBox) 

CFontStyleListBox::CFontStyleListBox() 
{ 

} 

CFontStyleListBox::~CFontStyleListBox() 
{ 
} 


BEGIN_MESSAGE_MAP(CFontStyleListBox, CListBox) 
    ON_WM_DRAWITEM_REFLECT() 
END_MESSAGE_MAP() 



// CFontStyleListBox message handlers 




void CFontStyleListBox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
{ 
    CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC); 
    CRect rect; 

    // Draw the colored rectangle portion 
    rect.CopyRect(&lpDrawItemStruct->rcItem); 

    pDC->SetBkMode(TRANSPARENT); 

    if (lpDrawItemStruct->itemState & ODS_SELECTED) 
    { 
     pDC->FillSolidRect(rect, GetSysColor(COLOR_HIGHLIGHT)); 
     pDC->SetTextColor(GetSysColor(COLOR_HIGHLIGHTTEXT)); 
    } 
    else 
    { 
     pDC->FillSolidRect(rect, GetSysColor(COLOR_WINDOW)); 
     pDC->SetTextColor(GetSysColor(COLOR_WINDOWTEXT)); 
    } 

    if ((int)(lpDrawItemStruct->itemID) >= 0) // Valid ID 
    { 
     CString sText; 
     int  nIndex; 

     CFont newFont; 
     CFont *pOldFont; 

     nIndex = lpDrawItemStruct->itemID; 
     GetText(nIndex, sText); 

     FONTSTYLE fontStyle = (FONTSTYLE)GetItemData(nIndex); 

     // To avoid unnecessary processing 
     if (fontStyle == NORMAL) { 
      pDC->DrawText(sText, rect, DT_LEFT | DT_VCENTER | DT_SINGLELINE); 
      return; 
     } 

     LOGFONT logFont; 
     CFont *pFont = GetFont(); 
     pFont->GetLogFont(&logFont); 

     switch (fontStyle) 
     { 
      //case NORMAL: logFont.lfWeight = FW_NORMAL; 
      //   break; 
     case BOLD: logFont.lfWeight = FW_BOLD; 
      break; 
     case ITALIC: logFont.lfItalic = TRUE; 
      break; 
     } 

     newFont.CreatePointFontIndirect(&logFont); 
     pOldFont = pDC->SelectObject(&newFont); 
     pDC->DrawText(sText, rect, DT_LEFT | DT_VCENTER | DT_SINGLELINE); 
     pDC->SelectObject(pOldFont); 
     newFont.DeleteObject(); 
    } 
} 


int CFontStyleListBox::GetFontStyle(int nIndex) 
{ 
    return (FONTSTYLE)GetItemData(nIndex); 
} 


void CFontStyleListBox::SetFontStyle(int nIndex, FONTSTYLE fontStyle) 
{ 
    SetItemData(nIndex, (DWORD)fontStyle); 
    Invalidate(); 
} 

私は、その後にそれを使用私のアプリケーション。私はOwnerDrawするなどのために正しくプロパティを設定しますが、ここでの結果である:

ListBox Output

太字のエントリが最後のものです。なぜ正しくレンダリングされないのですか?

これを修正するにはどうすればよいですか、これを行うための新しい方法がありますか?

答えて

3

あなたはただCFont::CreateFontIndirectを使用する必要があります。 CFont::CreatePointFontIndirectを使用すると、フォントポイントから物理ポイントに変換されます。あなたはそれを必要としません。

また、フォントを1回だけ作成します。必要に応じてDrawItemで作成することができます。サブクラス化されたCListBoxにメンバーを作成するだけです...

+0

ファンタスティック。それがトリックでした。質問 - 私の 'CListBox'ではどこにメンバ変数を作るべきですか? –

+2

CFontStyleListBoxクラスのメンバーvarとして。フォントを1回だけ作成する必要があります。フォントオブジェクトのハンドル値を確認することができます。 – xMRi

+0

'CFont'メンバ変数と' bool'変数を追加して、それが作成されているかどうかを追跡しました。次に、デクストラクタで、フォントの 'DeleteObject'を呼び出します。 –

関連する問題