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

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

m-take0220の回答

回答No.1

太字というのはフォントの属性になるので、太字設定のフォントを用意して、DrawTextなどの文字描画命令の前にデバイスコンテキストに選択することになります。 CFont fontBold, *pfontOld; LOGFONT lf; pDC->GetCurrentFont()->GetLogFont(&lf); lf.lfWeight = FW_BOLD; fontBold.CreateFontIndirect(&lf); pfontOld = (CFont*)pDC->SelectObject(&fontBold); pDC->DrawText(...); pDC->SelectObject(pfontOld); こんな感じでしょうか。試していないので、エラーがあったらすいません。 フォントは、毎回作成するのではなく、メンバー変数として持って、ウィンドウ作成時にフォントを作成したほうがいいのですが。 リストコントロールの表示フォントをどのようにしているのかがわからなかったので、描画直前に作成しています。

psychang
質問者

お礼

 CFont font;  font.CreatePointFont(360, _T("Times New Roman"));  GetDlgItem(IDC_LIST)->SetFont(&font); これはうまく行きました。テストボタンを押した時に、実行します。 これで、行が指定できれば、良いのですが…。 もう少し、調べていきます。  CFont font;  font.CreatePointFont(360, _T("Times New Roman"));  GetDlgItem(IDC_LIST)->****[workRow,workColumn]->SetFont(&font); みたいに書きたいです。 onDraw() onPaint() は、分かりません・・・υ どこから追加するのですか? お礼の欄にすみません。

psychang
質問者

補足

さっそくの回答ありがとうございます。 ただ、pDCをどこから引っ張ってくるのかが、分かりません。 ========================================================================== 僕が見つけた先ほどのホームページで、 「 lpDrawItemStruct 」に何を入れなければならないか? も、分かっていませんでした。 リストはリストコントロールのみに保存されています。(何か変な日本語ですが・・・) Public に、LVITEM lvi; と書いて見ましたが、ユーザー関数の中にも定義していたり、いなかったりです。 ========================================================================== 「Owner Draw=固定」という項目もありませんでした。 オブジェクト名、ID、クラス名、空間名 、構造体 が、ごっちゃになっている気がしますυ ========================================================================== 一応、今の状態を・・・ エラー 2 error C2228: '.itemData' の左側はクラス、構造体、共用体でなければなりません。 ・・・というエラーが、 リストが張り付いているクラス名は、CFileListCreatorDlg です。 ========================================================================== void CFileListCreatorDlg::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct){  {  // TODO : ここにメッセージ ハンドラ コードを追加するか、既定の処理を呼び出します。   lpMeasureItemStruct->itemHeight = 10;/*1行の高さを設定*/;  }  void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct){// この関数はリストボックスに行を追加したり削除したりした際に行数の数だけ繰り返し呼び出される。 if(CFileListCreatorDlg::lvi.itemData == -1 || CFileListCreatorDlg::lvi.itemData == NULL) return;   CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);   pDC->FillSolidRect(&lpDrawItemStruct->rcItem, RGB(0,0,0)/*背景の色*/);   pDC->SetBkColor(RGB(0,0,0)/*文字の後ろの色(背景と一緒にしとくべき)*/);   pDC->SetTextColor(RGB(255,255,255)/*文字の色*/);   pDC->DrawText(_T("色の反転")/*lpDrawItemStruct->itemData*/,&lpDrawItemStruct->rcItem,DT_LEFT | DT_VCENTER | DT_SINGLELINE);  } } ========================================================================== 一応、宣言部も載せておきます。 int CFileListCreatorDlg::ListInit(void) { LVCOLUMN lvc; int i;   TCHAR  caption[][32] = {_T("重複No."), _T("No."), _T("ファイルパス"), _T("ファイル名"),_T("バイト"), _T("実バイト"),_T("修正日"),_T("修正時間"),_T("備考欄")}; const int clmNum = sizeof caption /sizeof caption[0]; int err = 0;  m_xcList.SetExtendedStyle(LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES); lvc.mask = LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; // 有効フラグ for (i = 0; i < clmNum; i++) { lvc.iSubItem = i; // サブアイテム番号 lvc.pszText = caption[i]; // 見出しテキスト   switch(i){    case 0:    case 1:     lvc.cx = 80; // 横幅     break;    case 2:     lvc.cx = 0; // 横幅     break;    case 3:     lvc.cx = 450; // 横幅     break;    case 4:     lvc.cx = 80; // 横幅     break;    case 5:     lvc.cx = 0; // 横幅     break;    case 6:     lvc.cx = 75; // 横幅     break;    case 7:     lvc.cx = 0; // 横幅     break;    case 8:     lvc.cx = 80; // 横幅     break;    default:     MessageBox(_T("不正な列です。"));     break;       } if (m_xcList.InsertColumn(i, &lvc) == -1) {err = 1; break;} }  CFileListCreatorDlg::ItemCount_Func(TRUE); return err; } ========================================================================== ちょっといじりましたが、お教え頂いた方法でする方が、楽にコーディングできますか? マイクロソフトのページのthisに何を入れればいいかも分かりませんυ一応、そのまま動きましたけどυ もうちょっと、頑張ってみます。ヒントをいただけるなら、よろしくお願いします。 【引用元】http://msdn.microsoft.com/ja-jp/library/chxkwcsd(v=VS.100).aspx // The code fragment shows how to create a font object, // select the font object into a DC (device context) for text // drawing, and finally delete the font object. CClientDC dc(this); CFont font; VERIFY(font.CreatePointFont(120, _T("Arial"), &dc)); // Do something with the font just created... CFont* def_font = dc.SelectObject(&font); dc.TextOut(5, 5, _T("Hello"), 5); dc.SelectObject(def_font); // Done with the font. Delete the font object. font.DeleteObject();

関連する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アプリを作成しています。 コンボボックスの項目を選択するときに、ドロップダウン表示された 各項目の背景色と文字色を変えたいのですがどのようにすれば できるのでしょうか? よろしくお願いいたします。

  • 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から始まるインデックスとは、どういうことを意味しているのでしょうか。 よろしくお願いします。

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

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

    • ベストアンサー
    • HTML
  • 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でした。 よろしくお願いします。