• ベストアンサー

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

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

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

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

 こんにちは。まず、参考程度である事を前提といたします。  フォントオブジェクトを生成しなければいけません。  CreateFont()及びCreateFontIndirect()で行います。  Bold表示とはフォントの太さを高めた物です。  調査・検討してみてください。  作成したフォントハンドルはデバイスコンテキストに指定します。  以下はディフォルトフォントを元に太いフォント(Bold)を作成する例です。 static HFONT CreateMyFont(int nBold) {  //ディフォルトフォントをゲットする HFONT hFontDef = (HFONT)GetStockObject(DEFAULT_GUI_FONT);  //フォントの詳細を受け取る構造体バッファ LOGFONT lf;  //フォントハンドルから詳細を受け取る GetObject(hFontDef, sizeof(lf), &lf); //このメンバにフォントの太さを設定する lf.lfWeight = nBold; //フォントの作成 return CreateFontIndirect(&lf); } //何処かに前もって太いフォントハンドルを作成しておく static HFONT s_hFontBold = CreateMyFont(FW_BOLD); --------------------------------------------------------------- //以下はWM_DRAWITEMの中です DRAWITEMSTRUCT* p = (DRAWITEMSTRUCT*)lParam; //ListBox, ComboBoxの場合、itemIDのメンバは現在のアイテム行を示しています(ゼロベースです)。 //この処理は3行目のアイテムであった時 if(p->itemID == 2) { //オーナードロー用のデバイスコンテキストにフォントハンドルを設定 します(これで太い文字が反映される) HFONT hFontOld = (HFONT)SelectObject(p->hDC, s_hFontBold); //DrawText()などを使ってテキストを描写します //終わったら以前のフォントに戻します SelectObject(p->hDC, hFontOld); } ---------------------------------------------------------------

Zepetto
質問者

お礼

ありがとうございました! 参考にさせていただき、 希望の動作が可能となりました!

その他の回答 (1)

回答No.1

 こんにちは。参考程度と言う事で。 以下は、リストボックスの特定の行の高さを変更します。 WPARAM wParam = index; //設定変更したい行 LPARAM lParam = MAKELPARAM(cyItem, 0); // アイテムの高さを指定する //これを呼ぶ ::SendMessage(hwndListBox, LB_SETITEMHEIGHT, wParam, lParam); 関数からの操作では上記位しか出来ないようです。 特定行の色彩を変えたり、フォントスタイルを孤立させたい場合、オーナードローを処理するしかなさそうです。 結論はリストボックスでも可能なはずです。 WM_MEASUREITEM並びにWM_DRAWITEMのメッセージ処理を検索・検討して見てください。

Zepetto
質問者

お礼

ありがとうございます。 質問をした後も調査を続け、 オーナードローで描画をするところまではできました。 背景色の変更、 テキスト色の変更はできたのですが Bold 表示の設定の仕方が分かりません。 もしお分かりでしたら教えてください。 宜しくお願いします。

関連するQ&A

  • リストコントロールの使用法について

    現在、VC++6.0を使用してアプリケーションの開発を行っていますが、リストコントロールで作成されるスクロールバーのイベントの取得方法が分からず困っております。 よろしくお願いします。

  • 行き詰まりましたυ

    再投稿ですみません。 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    せめてキーワードかヒントだけでも…助けて下さい!

  • DataGridで特定行に対する背景色の設定

    お世話になります。 vb6で開発中なのですが、DataGridの行単位での背景色設定について質問させて下さい。 DataGridにはOracleで生成したViewをレコードソースに設定し、それを表示しているのですが、あるカラムの値が指定文字列を含む場合は、その行の背景色を変更して表示したいと考えております。 こういった事は可能でしょうか? 可能であれば、どのような方法が取れるかご教授願いたいです。 よろしくお願いいたします。

  • リストボックスについてです。

    リストボックスについてです。 B列をダブルクリックするとリストボックスが立ち上がり、データを選択してB列に表示できるように設定されていますが、困った現象が起こっています。 例えば、sheet1のB10にダブルクリックでリストボックスを表示し、そこから「あいうえお」という名前を表示させて、sheer1編集が終わったとします。 次のsheet2でB1をダブルクリックしているのに、sheet2のB10に勝手に「あいうえお」と表示されてしまいます。 コードは以下になってます。 VBA初心者なのでエクセルのサイト等からコピペ等して作ったコードです。 どこかおかしな箇所があると思うのですが、何処がおかしいのかがわかりません。 お分かりになる方、教えていただければ助かります。 ' ◆Worksheetのコード◆ '---------------------------------------------------- '選択範囲を変更したときに実行される Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) UserForm1.ListBox1.RowSource = "データ!A1:A100"  '表示するデータ範囲 UserForm1.ListBox1.Font.Size = 12    'フォントサイズ If Target.Column = 2 Then 'B列なら 行 = Target.Row '行番号を取得する UserForm1.Show 'ユーザーフォームを表示する End If End Sub '=================================================================================== ' ◆UserForm1のコード◆ '-------------------------------------------------------------------------- Private Sub ListBox1_Click() 'クリックされたときに実行される If 行 <> 1 Then '1行目でなければ Cells(行, 2) = ListBox1.Value 'リストボックスの値をセルにセットする End If UserForm1.Hide 'ユーザーフォームを非表示にする End Sub Private Sub UserForm_Deactivate() '非アクティブになったときに実行される Unload Me 'ユーザーフォームをメモリから削除する End Sub '========================================================================================= '============================== ' ◆標準モジュールのコード◆ Option Explicit Public 行 As Variant '行番号 Sub auto_open() Load UserForm1 'ユーザーフォームをメモリに読み込む End Sub '==============================

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

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

  • リストボックスから複数行を選択し、その複数のデータをセルに入力したい

    Excel2003でマクロをつくっています。シートのB列を右クリックすると、リストボックスが表示され 任意1行を選択するとシートのB列、C列、D列のセルにデーターが入力されます。 Private Sub ListBox2_Click() With ListBox2 If .ListIndex = -1 Then MsgBox "項目を選択してくだい" Else ’シートが保護されていたら保護を解除 If ActiveSheet.ProtectContents = True Then ActiveSheet.Unprotect End If ActiveCell.Value = ListBox2.List(ListBox2.ListIndex, 0) ActiveCell.Offset(0, 1).Value = ListBox2.List(ListBox2.ListIndex, 1) ActiveCell.Offset(0, 2).Value = ListBox2.List(ListBox2.ListIndex, 2) ActiveSheet.Protect End If End With Unload UserForm3 End Sub このリストボックスから複数の行を選択し、シートのB列、C列、D列のセルにデーターを入力したいのですが、Multiselectプロパティを変更しても、一行のみしか入力できません。 上のコードをどうかえたらよろしいでしょうか。

  • リストコントロールのスクロールバーを操作無効にするには

    お世話になります、fujicafeと申します。 現在、VC++でMFCのダイアログベースのアプリケーションを作成し、そこでリストコントロールを配置させています。 リストコントロールは自動的に垂直方向のスクロールバーを表示させるようにしています。 そこで質問なのですが、現在、リストコントロールの垂直方向のスクロールをスクロールバーの操作ではなく、キー操作によって行おうと思っているのですがどのようにすればスクロールバーの操作を無効にできますでしょうか? ポイントとしては ・リストコントロールの自動的に表示させる垂直スクロールバーはそのまま表示させたい(スクロールバーは全体行での現在の行の位置を示すだけ) ・リストコントロールの垂直方向の移動はキー操作でしたい。 これを実現するには、やはりリストコントロールのスクロールバー表示を無しにし、別でスクロールバーを設置させるしか方法はないでしょうか? 現状で、キー操作でのリストコントロールのスクロールバーの操作は実現できていますので、出来ればリストコントロールのスクロールバーの操作の無効のみが出来ればいいなと思っております。 ご意見がありましたら、よろしくお願いいたします。 尚、開発環境は Windows CE 6.0 Visual Studio 2005 です。

  • 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); }

  • IEで表示中のwebサイトの背景色を一時的に変更したいのです

    IEでwebサイトを表示している際、文字色と背景色の組み合わせのせいで、恐ろしく見づらいページがあったりしますが、そういったページの背景色を一時的に任意のカラーに変更する方法はないでしょうか。 そういった機能のあるアプリケーションでもかまいません。 情報をお持ちの方、是非お教え下さい。

  • リストビューにフォーカスを設定するには

    開発環境はVC++6.0、SDK、Windows2000です。 CreateWindowEx( 0, WC_LISTVIEW, "", WS_CHILD | WS_VISIBLE | WS_TABSTOP | LVS_REPORT | LVS_SINGLESEL, 10, 10, 515, 271, hdwnd, (HMENU)100, hInstance, NULL); 上記APIでリストビューを表示しているのですが、表示直後には先頭ラインにフォーカスが設定されません。 当然表示された後にマウス操作にてラインをクリックするとフォーカスがあたるのですが、 表示された直後に指定行にフォーカスをあてたい場合にはどうすればよいでしょうか? ご存知の方ご教授お願いします。

専門家に質問してみよう