• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:リストコンロールの一行だけを太文字に(VC++))

VC++でリストコントロールの特定の行だけを太文字にする方法

m-take0220の回答

  • ベストアンサー
回答No.4

太字でない通常のフォントの場合指定するのはFW_NORMALですが、その場合はフォントを作成しなくても、元々選択されているフォントで描画すればいいはずです。定数については、LOGFONTの解説に書かれています。 http://msdn.microsoft.com/ja-jp/library/dd145037.aspx アイテムが選択されているかどうかは、lpDrawItemStruct->itemActionにODA_SELECTが含まれているかを調べるようです。 if (lpDrawItemStruct->itemAction|ODA_SELECT) { // 選択されている場合の描画 } else { // 選択されていない場合の描画 } といった感じでしょうか。

psychang
質問者

お礼

ありがとうございます!! 一から付き合っていただいて…、思ってた通りの動作が確認できました! 以下、最終的なコードです =================================================================================== void CMylistCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct){  //▼ http://dejibouzu.com/page/2/ ベースとなるコード ▼  CDC*  pDC = CDC::FromHandle(lpDrawItemStruct->hDC);  CRect  rect;  rect = ( CRect)lpDrawItemStruct->rcItem;  int   nItem = lpDrawItemStruct->itemID;  TCHAR  szBuff[MAX_PATH];  CRect  nRect;  int   nCnt = 0;  int   nIndentPix;  CHeaderCtrl *Head = GetHeaderCtrl();  int   nMax = Head->GetItemCount();  while( nMax > nCnt )  {   nIndentPix = 0;   //アイテム取得のための設定   LVITEM lvItem;   lvItem.mask   = LVIF_TEXT | LVIF_IMAGE | LVIF_STATE | LVIF_INDENT ;//追加しても意味がなかった2011.05.14 | LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES;   lvItem.iItem  = nItem;   lvItem.iSubItem  = nCnt;   lvItem.pszText  = szBuff;   lvItem.cchTextMax = sizeof(szBuff);   lvItem.stateMask = LVIS_SELECTED;//-1を LVIS_SELECTEDに変更2011.05.14   //m_xcList.SetExtendedStyle(LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);   if( GetItem(&lvItem) == TRUE ){    if( nCnt == 0){     //アイテムの場合     GetItemRect( nItem, &nRect, LVIR_BOUNDS);    }else{     //サブアイテムの場合     GetSubItemRect( nItem, nCnt, LVIR_BOUNDS, nRect);    }    //if ( m_phbrBkColor ){     //カラーテーブルにブラシが作成されているなら背景を描画     //if ( m_phbrBkColor[ nCnt * GetItemCount() + nItem] )     //{      //アイテムの場合 描画箇所をアイテム部分のみに修正      if( nCnt == 0 ){       nRect.right = GetColumnWidth( 0 );      }      //FillRect( pDC->m_hDC, &nRect, m_phbrBkColor[ nCnt * GetItemCount() + nItem ] );     //}    //} //http://www.crimson-systems.com/tips/t003.htm //http://oshiete.goo.ne.jp/qa/6645218.html //http://www.tcn.zaq.ne.jp/zxcvbnm/projectc/vcpp/colortextcombo.htm //=======================▼教えて頂いた部分+α▼======================= CFont fontBold, *pfontOld; LOGFONT lf; pDC->GetCurrentFont()->GetLogFont(&lf); // 描画動作が全体の再描画もしくは、 // 選択状態が変化した場合 if( lpDrawItemStruct->itemAction & ( ODA_DRAWENTIRE | ODA_SELECT )) { // コントロールの状態が選択された状態の場合 if( lpDrawItemStruct->itemState & ODS_SELECTED ){     // 選択されている場合の描画    lf.lfWeight = FW_BOLD;     //【×】pDC->FillSolidRect(&lpDrawItemStruct->rcItem,RGB(0,0,255));/*文字の後ろの色(背景と一緒にしとくべき)*/    //【×】pDC->SetBkMode(TRANSPARENT);    pDC->SetBkMode(OPAQUE);//【○】これがないと背景が描画されない。    pDC->SetBkColor(RGB(0,0,255));/*背景の色*/    pDC->SetTextColor(RGB(255,255,255));/*文字の色*/   }else{//←条件追加    lf.lfWeight = FW_NORMAL;    //【×】pDC->FillSolidRect(&lpDrawItemStruct->rcItem,RGB(255,255,255));/*文字の後ろの色(背景と一緒にしとくべき)*/    //【×】pDC->SetBkMode(TRANSPARENT);    pDC->SetBkMode(OPAQUE);//【○】これがないと背景が描画されない。    pDC->SetBkColor(RGB(255,255,255));/*背景の色*/    pDC->SetTextColor(RGB(0,0,0));/*文字の色*/   } } else{ // 選択されていない場合の描画   lf.lfWeight = FW_NORMAL;   pDC->SetBkMode(OPAQUE);//【○】   pDC->SetBkColor(RGB(255,255,255));/*背景の色*/   pDC->SetTextColor(RGB(0,0,0));/*文字の色*/ } fontBold.CreateFontIndirect(&lf); pfontOld = (CFont*)pDC->SelectObject(&fontBold); //pDC->SelectObject(pfontOld); //=======================▲教えて頂いた部分+α▲=======================    //テキスト描画    CString outText = lvItem.pszText;    //pDC->TextOut( nRect.left + 10, nRect.top + 2, outText );        nRect.left += 10;//変更2011.05.14    nRect.top +=2;//変更2011.05.14    pDC->DrawText(outText, &nRect, DT_VCENTER | DT_LEFT );    UpdateData(FALSE);   }   ++nCnt;  }  //▲ http://dejibouzu.com/page/2/ ▲  //  //pDC->DrawText(CListCtrl::GetItemText(workRow,workColumn),/*lpDrawItemStruct->itemData*//*CListCl::GetSubItemRect&lpDrawItemStruct->rcItem*/,/&lpDrawItemStruct->rcItem,DT_LEFT | DT_VCENTER | DT_SINGLELINE);  //  //MessageBox(CListCtrl::GetItemText(lpDrawItemStruct->itemID-1,workColumn));  // }  //}  //http://msdn.microsoft.com/ja-jp/library/Cc428474 //int DrawText( // HDC hDC, // デバイスコンテキストのハンドル // LPCTSTR lpString, // 描画するテキスト // int nCount, // テキストの長さ // LPRECT lpRect, // テキストを描画する長方形領域 // UINT uFormat // テキスト描画オプション //); }

関連するQ&A

  • VC + + 2013

    VC++2013でメニューバーを2行にして、 その上にボタンやリストボックスなどのコントロールを置きたいのですが、方法はありますでしょうか?

  • VC++でツリーコントロールの文字色変更

    VC++.NETを使い始めたばかりの初心者です。 ツリーコントロールで登録した文字列を 行ごとに文字色の変更をしたいのですが やり方がわからなく困っています。 WM_NOTIFYメッセージを横取りして clrTextメンバに色を設定をしてみたのですが、 アイテムのダブルクリックやマウス右クリック メニューが使えなくなってしまいました。 ほかのやり方でもかまいませんので ご存知の方は、ご教授をよろしくお願いします。

  • リストコントロール特定行のフォント情報取得VC++

    この前の http://okwave.jp/qa/q6734007.html の続きです。 (ちょっとだけ↑の訂正します。 XPにEXEを持っていった所、低スペックが関係しているのか、 色の反転の部分が不安定でした。僕が追加したほうの条件を残し、その直後のElse の条件内は削除してください。) それはおいておいて、(本題)度々、質問すみません。 リストコントール特定行のフォント情報取得の方法が分かりません。 http://www.g-ishihara.com/mfc_dc_02.htm の部分の this の代わりに入れるものが分かりません。 CClientDC cdc(this); のところです。 ClientDC cdc(CFileListCreatorDlg::m_xcList.GetItem(workRow)); とでもしたいのですが。。。 フォント情報を取得したいタイミングは、リストを書き出すときです。行単位しか指定できなくてもかまいません。 GetCurrentFont()で取得できるとは、思いますが、オブジェクト名をどうやって指定するのかが分かりません。 MSDN http://msdn.microsoft.com/ja-jp/library/zdff988k.aspx も見ましたが、良く分かりませんでした。何か調べ方にコツがあるのでしょうか。。。。 リストの変数名はm_xcListです。 どうすればいいか、教えてくださると うれしいです。

  • VC++2010 ボタンなどのレイアウト大きさ変更

    VC++2010のMFCで現在開発しているんですが、 ボタン、スタティックテキスト、エディットボックスの文字の大きさを変更したいんですが どのようにすればいいかわかりません。よろしくお願いします。 またステータスバーに色を付けたいんですがどのようにすれば色を付けることができますか? よろしくお願いします。

  • VC# コンボボックスの大文字・小文字を区別する

    VC# 2005で、以下のようなコードを書くと、大文字・小文字の区別がなく、 1行目で追加したアイテムが選択された状態になってしまいます。 comboBox1.Items.Add("a"); comboBox1.Text = "A"; 大文字・小文字を別として扱うことはできますでしょうか?

  • MFC コンボボックスを複数扱う

    環境:VC++2008 MFC 同じリストの内容を持つコンボボックスを16個作りたい。(IDC_COMBO1~16) 16個のDDX変数を用意し、16回値を格納するのは綺麗じゃないので1個のDDX変数でなんとかしたいです。 ソースは以下の物で練習しています。 http://www.g-ishihara.com/mfc_cb_01.htm どのようにすれば簡潔にかけるでしょうか?

  • VC++のコンボボックスの各項目の背景色と文字色を変える方法

    こんにちは。 VC++6.0でMFCアプリを作成しています。 コンボボックスの項目を選択するときに、ドロップダウン表示された 各項目の背景色と文字色を変えたいのですがどのようにすれば できるのでしょうか? よろしくお願いいたします。

  • テキストボックスへの文字の表示について(文字は可変である)

    リストボックスと関連付けさせて、テキストボックスに文字を表示させたいです。 表示のさせ方としては、例えば、リストボックスに5つ(5行)の文字列があります。 実現させたい事は、常にそのページが開いた時はリストボックスの1行目をテキストボックスに表示させたいです。簡単な具体例をあげると、 リストボックスに 1行目に「あ」、 2行目に「い」、 3行目に「う」、 4行目に「え」、 5行目に「お」 とあれば、 テキストボックスに、「あ」と表示。 2行目を選択したら「い」と表示。など・・・。 しかし、リストボックスの文字列の順番は場合により並びが同じではないので、スクリプト言語(VBScript?)を用いないといけないとは思いますが・・・ この例をいうと、ページが開いた時、 1行目に「お」、 2行目に「え」、 3行目に「う」、 4行目に「い」、 5行目に「あ」 とあれば、 テキストボックスに、「お」と表示してほしい。 この説明でご理解いただければ幸いです。 よろしくお願い致します。

    • ベストアンサー
    • HTML
  • MFCのリストボックスについて

    MFCをVC6.0で作成しています。現在、ダイアログボックスを作成しているのですが、ダイアログボックスの中のリストボックスについて、教えてください。 void CFileReadeDlg::GetIndex() { UpdateData(TRUE); m_nCount = m_xcList.GetCurSel(); if(m_nCount==LB_ERR) { AfxMessageBox("選択してください"); } } の関数で、リストボックス内に存在するカーソルの位置を割り出したいのですが、 この関数は、 void CFileReadeDlg::OnSelchangeDatatable() { // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください GetIndex(); } のようにリストボックスの中のセルを変更した際に稼動する関数内で呼び出しています。 ですが、実際、このm_nCountには、0しか入りません。 これは、単にOnSelchangeDatatable()の関数を何処かの関数内にも呼び出していないからでしょうか。 そもそも、呼び出す必要はないかと思っていたのですが。 又、VCのヘルプに『単一選択リスト ボックスで、現在選択されている項目があれば、その項目の 0 から始まるインデックスを取得します』 とありましたが、0から始まるインデックスとは、どういうことを意味しているのでしょうか。 よろしくお願いします。

  • VC++ V6.0 MFC Win98環境にて

    VC++ V6.0 MFC Win98環境にて VC++ V6.0 MFC Win98環境にて リストボックスにファイルリストを作ろうとしています。 リストボックスに m_file を割り当て、以下のようにしました。 m_file.ResetContent(); m_file.Dir( DDL_READWRITE | DDL_READONLY, "C:\\*.*" ); m_file.SetCurSel( 0 ); これでリストさせると8.3ファイル名表示となってしまいます。 どうしたらWin98環境でロングファイル名で表示させることができますか? FindFile で自分探し AddString するとか・・・!? ちなみにWin2000ではOKでした。 よろしくお願いします。