CListCtrlクラスのフォント情報の取得方法について

このQ&Aのポイント
  • CListCtrlクラスのDrawItem関数内でリストコントロールの一部のフォント情報を取得する方法を探しています。
  • 太文字や赤色の情報をリストコントロールの各行の最後のカラムを退避用フィールドとして使用する方法を検討していますが、スマートではありません。
  • 他の方法やキーワードを探していますが、困っています。
回答を見る
  • ベストアンサー

行き詰まりましたυ

再投稿ですみません。 CListCtrl クラス //m_xcList はCListCtrl型のDDX変数 リストコントロールの一部のフォント情報を取得したいです。 void CMylistCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct){~~~} DrawItem(↑)の中で、描画すると同時に、太文字・赤色情報を、 リストコンロールの各行の最後のカラムを退避用フィールド(セル)として使用し、 文字で「BOLD」「RED」「BOLD,RED」「」のように入れれば、何とか作れそうです。 全然スマートじゃないですよね。 この方法であれば、任意のタイミングでフォント情報を取ることはできそうですが… またはDrawItemを実行させるために、ダミーの行を1行挿入、その後削除して、 エクスポートする事も考えています。 (データに変更があった場合、必ず呼び出されるから、無意味かもしれないですけど) 処理速度は遅くなると思いますし、僕には、これしかできませんが、 もっと、方法があるはずですよね… それかlParamを割り振って、何とかするほうがいいですかね。 投稿してからずっと 「リストコントロールのフォント情報取得 VC++ MFC -VB -.Net "LogFont"」 「FW_BOLD FONT VC++ LOGFONT取得」「CFont::CreatePointFont」などで、 検索したのですが、キーワードさえつかめずに、困りました(/_;) 教えてGOOで参考になりそうなのが、3つ↓ ■リストの行ごとの設定変更について http://okwave.jp/qa/q4165655.html ■リストコントロール内の文字の大きさ(ポイント数を)別々にしたい。 http://okwave.jp/qa/q5746038.html ■リストボックスのフォントをサイズを変更したい http://qanda.rakuten.ne.jp/qa4479812.html?order=DESC&by=datetime    せめてキーワードかヒントだけでも…助けて下さい!

質問者が選んだベストアンサー

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

> 再投稿ですみません。 別にいいけど、これだけじゃ前回の質問がどんな内容だったのかわかりません。 前回の質問のリンクを書いておくとかしましょう。 DrawItemをオーバーライドして、アイテムを自分で描画している場合の話ですよね。 フォント情報が必要なのではなくて、各行がどんなフォント・色で描画されているかが知りたいんじゃないですか? そうであけば、DrawItemの中で ・どんなときに太字で描画しているのか ・どんなときに赤色で描画しているのか が分かれば、DrawItem以外の場所で情報を取得する方法があるでしょう。 どうしてもDrawItem内でないと判断できないのであれば、CListCtrl::SetItemDataでデータを設定すれば、他の処理内でもCListCtrl::GetItemDataでそのデータを取り出せるので、判断できるでしょう。

psychang
質問者

お礼

できました!!返信が遅くなってすみません。 さらに質問の仕方が分からなくてごめんなさいでした。 【前回の質問】リストコントロール特定行のフォント情報取得VC++ http://oshiete.goo.ne.jp/qa/6747822.html 【解決済みの質問】リストコンロールの一行だけを太文字に(VC++) http://oshiete.goo.ne.jp/qa/6734007.html ■今回、お教え頂いた部分 //CListCtrl::SetItemData(MSDN)↓ //http://msdn.microsoft.com/ja-jp/library/936147y4(v=VS.100).aspx  if( GetItem(&lvItem) == TRUE ){   if( nCnt == 0){ //アイテムの場合    SetItemData(nItem, lf.lfWeight);   }  } これだけで済むとは…、短すぎてソースを載せるのが恥ずかしくなります。 SetItemDataの第二引数は数値ですから、太文字と赤文字を判定するのも、自分で  1:通常のフォント  2:太い文字  3:赤い文字  4:太くて赤い文字 とでも、意味づけし、GetItemDataでも、それぞれに処理を分けてやればいいのですね。 定数を足すというのもありかもしれませんね(!?)  if( GetItem(&lvItem) == TRUE ){   if( nCnt == 0){ //アイテムの場合    SetItemData(nItem, lf.lfWeight + pDC->GetTextColor());   }  } テストボタン内で、試しに、 if(m_xcList.GetItemData(○行目)== (FW_BOLD + RGB(255,255,255))){ MessageBox(_T("白い太文字です")); } としても出来ました。  【参考元】http://dejibouzu.com/page/2/   相変わらず、参考にした大元のソース(↑)です。 じきに締め切らせていただきます。 本当にありがとうございましたm(_ _)m

関連するQ&A

  • リストの行ごとの設定変更について

    vc++ でアプリケーション開発をしております。 読み込んだログファイルを表示する Viewer 機能を作成しているのですが 別画面で設定することにより、 任意の行の文字色を変更したり、 背景色を変えたり、フォントを Bold 表示にしたりしたいのですが できません。 現時点では LISTBOX を使用してログ表示を行っているのですが コントロールを他のものに変えれば可能なのでしょうか? ご教授、宜しくお願いします。

  • VC2008にてフォントの変更がうまくいきません

    環境  WindowsXP  VC 2008 MFC   内容  上記の環境化で、ウインドウズアプリケーションを作成しており  以下のようなプログラムをOnInitDialogでCallすると  アサートが発生してしまいます  問題なのは、Unicodeでコンパイルして実行するとうまくいかず  マルチバイトでコンパイルするとうまく行きます。  ご教授願います。 エディットコントロールの派生クラスにて 以下の内容を実行しています LOGFONT m_logfont; ←コンストラクタでコントロールから取得済み CFont m_font;←コンストラクタで設定済み BOOL エディットコントロールの派生クラス::SetTextFont( int width, int height) {    ::_tcscpy_s(m_logfont.lfFaceName,sizeof(m_logfont.lfFaceName),_T("MS ゴシック"));   m_logfont.lfHeight = height; m_logfont.lfWidth = width; // m_font.DeleteObject(); // 現在のフォントの削除 // フォントを作成 m_font.DeleteObject(); if( m_font.CreateFontIndirect(&m_logfont) ){ SetFont(&m_font); } // ウィンドウを再描画 return RedrawWindow(); }

  • リストコントロール内の文字の大きさ(ポイント数を)別々にしたい。

    お世話になります。 MFC C++6.0で開発しております。 オーナードローを利用して、リストを書いているのですが、 (CListCtrlで) 1列目・1行目の文字は文字の大きさが12ポイント 1列目の2行目の文字は大きさが14ポイントなどのように変更したいのですが、これは、DrawTextで実現できるのでしょうか? お手数ですが何卒よろしくお願いします。

  • リストボックスのフォントをサイズを変更したい

    コンパイルはできるのですが、GetFontでCFontが取得できません。 これを最も早い段階で実行するには、どこに書けばいいんでしょうか? OnCreateで、リストボックスのCreate後すぐに書きました。 また、もっと簡単にサイズだけ変更する方法はありませんか? なぜ、GetFontが失敗するのか教えてください。お願いします。 MFCです。 LOGFONT logFont; CFont* pFont; pFont = m_OutputListBoxBuf.GetFont(); pFont->GetLogFont(&logFont); logFont.lfHeight = logFont.lfHeight * 0.4; logFont.lfWidth = logFont.lfWidth * 0.4;

  • CListCtrlで行の高さを指定したい。

    お世話になります。 MFC C++6.0 で開発しております。 CListCtrlでリストを作成しているのですが、 CreateFontで16ポイントの文字を指定した行の高さが10だとすると、 12ポイントの文字を指定した行の高さが自動で5になります。 12ポイントの文字を指定しても、文字の大きさは12ポイントのままで、 行の高さだけ、10にすることは可能なのでしょうか? お手数ですが、よろしくお願いします。

  • リストコンロールの一行だけを太文字に(VC++)

    http://okwave.jp/qa/q6729285.html で質問した者ですが、 DrawMenuBar(); を追加するだけで、メニューバーが通常表示されました。 コマンド名が全く分からずにすみません。 また、質問させていただきたいのですが、m_xcList という変数を割り当てたリストコンロール(IDC_LISTというID)のある特定の行だけを、太文字にしたいです。 ( http://www.g-ishihara.com/mfc_lc_01.htm を参考にしました) 後は、 http://www5d.biglobe.ne.jp/~yasukiyo/vc.html に辿りついて、 「◇ リストボックス(CListBox)の項目(行)毎に色を変更する」 はできそうのですが、 色ではなく、「太文字」にしたいです。 なぜかというと、(既にできている エクセル版では、)リストをHTML形式で書き出し、太文字のアイテムを一つのフォルダに抽出するという仕様の為です。赤色にしたアイテムは別の意味を持っています。あまり、沢山の色を使いたくないです。 どのコマンドを使えばいいのでしょうか?そもそもできないのでしょうか。。。? (もしできないのなら、なにか他のコントロールを使ったほうがいいですか?また、リストボックスとリストコントロールは別物ですか?) 今できそうなのは、さっきのホームページを参考にして、背景を黒に、文字を白にすることぐらいでしょうか? でも、できればエクセル版と形式をそろえたいです。 (VC++2010, MFC, ダイアログベースのファイルリスト作成ソフトを(VBAより)移植中です。) どうか、教えてください!

  • コントロールリスト(CListCtrl)非表示行

    C++でのFORM部品のコントロールリスト(CListCtrl)において、登録済みの複数アイテムのうち、特定アイテム(行)のみを、アイテムを削除せずに非表示に設定することは可能でしょうか? やりたいのは特定カラムの格納値でフィルタリング設定を行い、特定の値をもつ行のみを選択表示したいでのすが、アイテム削除や別リストでの表示ではなく、あくまでもひとつのコントロールリスト内のアイテム設定で行いたいです。 アイテム別の状態設定としては SetItemState 関数がありますが、非表示にする機能は見当たりませんでした。

  • C# listbox

    どうしても解らないのでご教授お願いたします. やりたいことは単純なのですが,リストボックスにドラックドロップしたときに表示する フォント(文字の色とサイズ)を変更したいのですが,下記のプログラムではドラッグドロップ するとリストが真っ白になってしまいます.いろいろ調べたのですが何が原因が解りません. 何卒よろしくお願いいたします. private void listBox1_DragDrop(object sender, System.Windows.Forms.DragEventArgs e) { listBox1.Items.Clear(); listBox1.DrawMode = DrawMode.OwnerDrawVariable; //コントロール内にドロップされたとき実行される //ドロップされたすべてのファイル名を取得する string[] fileName = (string[])e.Data.GetData(DataFormats.FileDrop, false); //ListBoxに追加する listBox1.Items.AddRange(fileName); listBox1.Sorted = true; } private void listBox1_DragEnter(object sender, System.Windows.Forms.DragEventArgs e) { //コントロール内にドラッグされたとき実行される if (e.Data.GetDataPresent(DataFormats.FileDrop)) { //ドラッグされたデータ形式を調べ、ファイルのときはコピーとする e.Effect = DragDropEffects.Copy; } else { //ファイル以外は受け付けない e.Effect = DragDropEffects.None; } } //DrawItemイベントハンドラ //項目を描画する private void ListBox1_DrawItem(object sender,System.Windows.Forms.DrawItemEventArgs e) { //背景を描画する Font cfont = new Font("MS P明朝", 9, FontStyle.Bold); //適切な色で背景を描画する。 e.DrawBackground(); Rectangle rec = e.Bounds; Graphics g = e.Graphics; Color col = Color.Black; Font deffont = e.Font; deffont = cfont; string txt = ((ListBox)sender).Items[e.Index].ToString(); TextRenderer.DrawText(g, txt, deffont, rec, col, TextFormatFlags.Default); }

  • リストビューのハンドルについて

    リストビューコントロールのハンドルについて疑問に思う事がありまして、ご教授よろしくおねがいします。 通常リストビューをCreateWindow()で作成した時に戻り値として受け取るウィンドウハンドルに対してSetWindowFont()を行うとリストビュー全体のフォントが変更されます。 リストビュー関数にはListView_GetHeader( リストビューハンドル );という関数が用意されていてリストビューのカラム部分のハンドルを取得できます。 このハンドルに対してSetWindowFont()を行うとカラム部分だけのフォントが変更されます。 という事はアイテム部分だけのハンドルを取得し、SetWindowFont()でフォントを変更する事はできるのでしょうか? ご教授よろしくお願いいたします。

  • VC++2005のeditコントロールについて

    仕事でVB6.0とFortran77を使っており、今後のためにVC++2005を独学で勉強し始めたのですが、 練習がてらVBでいうTextBoxを使って簡単な計算をしようと思っているんですがうまくいきません。 目標としては2つのeditコントロールに数値をそれぞれ入力し、その2つの数字を足し算するというもの作ろうと思っています。 今のところ、GetWindowText()ってのを使って文字列(CString)を取得することは出来たのですが、 数字(Intなど)を取得することが出来ず、また文字列を整数などに変換する方法もわからない状態です。 MSDNやネットでキーワード検索しても求める情報が見つからず困っております。 どうすればいいのでしょうか?

専門家に質問してみよう