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

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

m-take0220の回答

回答No.3

表示する文字列は、CListCtrl::GetItemTextで取得できます。アイテムのインデックスは、lpDrawItemStruct->itemIDに入っている値だと思います。 lpDrawItemStruct->rcItemは、アイテム全体の矩形じゃないかと思います。サブアイテムを考慮した描画矩形を取得するには、CListCtrl::GetItemRect/GetSubItemRectを使うと取得できるでしょう。

psychang
質問者

補足

だいぶ進みました。ありがとうございます。 残った疑問は、FW_BOLDの逆の意味の定数は○○? と、後は致命的なことに、アイテムを選択状態にできないことです。その他は大変満足しています。 参考になりそうなのが↓なんですが。。。 http://oshiete.goo.ne.jp/qa/4785511.html 例えば、リストのアイテムすべてを選択するというユーザー関数がうまく行きません。 クリックしても選択できません。 ================================================================ void CFileListCreatorDlg::SelectALL_Func(){  int i = 0;  while(i<=m_xcList.GetItemCount() -1){   m_xcList.SetItemState(i, // フォーカス&選択状態にしたいアイテムのインデックス   LVIS_FOCUSED | LVIS_SELECTED, // 状態   LVIS_FOCUSED | LVIS_SELECTED); // マスク   i++;   //ListView_Update(m_xcList, i);//追加しても意味がなかった2011.05.14  } } ================================================================ 後は、参照元のURLとソースコードをのせますね。 void CMylistCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct){  // TODO: 指定された項目を描画するためのコードを追加してください。  //コメントアウト:2011.05.14  ////////if(lpDrawItemStruct->itemData == -1 || lpDrawItemStruct->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));/*文字の色*/;    //▼ 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(); // CBrush brsh; // rect.left += this->GetColumnWidth( 0 ) ; // brsh.CreateSolidBrush( RGB( 0, 255, 0 ) ); // pDC->FillRect( &rect, &brsh ); // brsh.DeleteObject();  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 ] );     //}    //} //===============教えて頂いた部分======================= CFont fontBold, *pfontOld; LOGFONT lf; pDC->GetCurrentFont()->GetLogFont(&lf); lf.lfWeight = FW_BOLD; //FW_BOLDの逆は?教えてください。-1にしたらできましたが、正確な定数名を教えてください。 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 );   }   ++nCnt;  }  //▲ http://dejibouzu.com/page/2/ ▲  //http://www9.plala.or.jp/sayox/vc/vc14.html   //http://msdn.microsoft.com/ja-jp/library/1w31a26y(v=VS.100).aspx  //http://msdn.microsoft.com/ja-jp/library/Cc428474  //int DrawText(  // HDC hDC, // デバイスコンテキストのハンドル  // LPCTSTR lpString, // 描画するテキスト  // int nCount, // テキストの長さ  // LPRECT lpRect, // テキストを描画する長方形領域  // UINT uFormat // テキスト描画オプション  //); //★ http://oshiete.goo.ne.jp/qa/4165655.html //★ http://bingobingobingo.blog49.fc2.com/category4-1.html

関連する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でした。 よろしくお願いします。