VC++6.0でリストビューのアイコンの色が白黒になってしまう問題

このQ&Aのポイント
  • VC++6.0でプログラミングしていると、リストビューのアイコンの色がインポートしたビットマップとは違って白黒になってしまう問題が発生します。
  • 問題の原因は、m_myIcon.Create(IDB_ICON, 32, 4, RGB(255, 255, 255))の部分で、アイコンの作成時に色情報を正しく指定していないことです。
  • 正しい色情報を指定するためには、RGB関数に適切な値を渡す必要があります。
回答を見る
  • ベストアンサー

リストビューのアイコンの色

VC++6.0でプログラミングしてるんですが、リストビューのアイコンの色がインポートしたビットマップを色とは違う、白黒になってしまいます。アイコンをつくるのには m_myIcon.Create(IDB_ICON, 32, 4, RGB(255, 255, 255)); m_listctrl.SetImageList(&m_myIcon, LVSIL_NORMAL); 以上のようにしてます。m_myIconはCImageListクラスのオブジェクトで、このリストビューがあるクラスのメンバ変数です。m_listctrlはリストビューのコントロール型の変数です。 ご存知の方、アイコンをビットマップ通りのカラーにする方法を教えてください。

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

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

Createでは、nFlagsの値を指定しないと16色のビットマップになってしまいます。 しかし、リソースIDを直接指定するときにはnFlagsの値を指定できませんので、 Createでは直接リソースIDを指定せずに、別途リソースからCBitmapにビットマップをロードし、そのオブジェクトをCImageList::Add()で追加するようにしてください。

mkmarimo
質問者

お礼

おっしゃるとおりやればできました。どうもありがとうございました。

関連するQ&A

  • リストビューに色はつかない?

    CreateWindowEx を使ったリストビュー(WC_LISTVIEW) についてなんですが、 マクロの、ListView_InsertItem (hList, &item) で、リストに追加しますよね。 その際、カラーはできないのでしょうか。 例えば、一行おきに色を変えるとか・・・ SetTextColor(hdc, RGB(0, 255, 0)) とか SendMessage(hList, WM_SETFONT, (WPARAM)hFont, 0) とかいろいろ 見たり試したりしたのですが、無理なんでしょうか。

  • リストビューの選択状態を取得するメッセージはありますか?

    リストビューが選択状態(1行が青色や灰色の背景になる状態)にあって、エディットボックスが空欄では無いときに、 あるボタンを有効にするという処理をしたいと思っています。 リストビューが選択されていることを教えてくれるメッセージがあれば、教えてください。よろしくお願いします。 環境:Win32 API, VC++6.0

  • CButtonのBMP・アイコンの表示を切替えたい

    今 WinXP VC++6.0 MFC のダイアログベースのソフトで ダイアログリソース上のボタンのプロパティで ビットマップが設定されている状態で ボタンにビットマップ表示→アイコン表示を切替えようと思って HICON CMyButton::SetIconID(UINT iconID) { //スタイル変更 UINT style=GetButtonStyle(); style&=~BS_BITMAP; style|=BS_ICON; SetButtonStyle(style); //ボタンに画像を貼付る HICON hIcon=AfxGetApp()->LoadIcon(iconID); hIcon=SetIcon(hIcon); } としたのですがアイコン表示されませんでした。 アイコンかビットマップかどっちかに すればいいのはわかってるのですが、 SetButtonStyleはCreate後にボタンスタイルを 替えられないんでしょうか?

  • VC++でのアイコン背景透過について

    VC++2013 MFC環境です。 プログラムで○や×などの記号のアイコンを描画し、PNG,GIF,JPEGの形式でファイルに保存したいです。その時、アイコンの背景を透過したいのですがうまくいきません。 CDCクラスとCImageクラスを使用しアイコンの出力をしています。 背景透過について調べていくつか使えそうな関数があり試したのが、TransparentBltという関数で、デバイスコンテキストを二つ用意して、片方に記号を描画し、透過したい色を指定してもう片方にコピーすると指定した色が透過になる?と解釈しプログラム組みましたが結果は真っ黒の画像でした。 ここで完全に手が止まってしまい、質問させていただきます。 以下ソース CImage Image, image2; Image.Create( 50, 50, 24 ); image2.Create( 50, 50, 24 ); CDC* pDC = CDC::FromHandle( Image.GetDC( ) ); CDC* pdc2 = CDC::FromHandle( image2.GetDC( ) ); CRect rect( 0, 0, 50, 50 ); CPen BlackPen( PS_SOLID, 3, RGB( 0, 0, 0 ) ); CBrush WhitBrush( RGB( 255, 255, 255 ) ); CBrush BlackBrush( RGB( 0, 0, 0 ) ); pDC->FillRect( &rect, &WhitBrush ); pDC->SelectObject( &BlackPen ); pDC->SelectObject( &WhitBrush ); pDC->Ellipse( 5, 5, 45, 45 ); COLORREF col = Image.GetPixel( 0, 0 ); pdc2->TransparentBlt( 0, 0, 50, 50, pDC, 0, 0, 50, 50, col ); Image.SetTransparentColor( col ); image2.Save( L"c:\\icon\\maru.png" ); Image.ReleaseDC( ); image2.ReleaseDC( ); 他にも実装例があれば教えてください。 C++や画像生成に関しては経験がありません。

  • VC6++のツリービューについて

    VC6++のツリービューについて質問させていただきます。 ツリービューで以下のようなリストを作成した場合、リストをクリックした時に文字色もくしは、文字の背景色を変更したいと考えております。何かよい方法があればお教え頂ければと思います。 よろしくお願いいたします。 【ツリービューのイメージ】 下のようなリストを作成後、”きゅうり”をクリックしたら、”きゅうり”の文字列の色が変わり、”みかん”をクリックしたら、”みかん”の文字列の色が変わるイメージです。 野菜  |   ― きゅうり  |     ― レタス 果物  |   ― みかん  |   ― ブドウ  

  • CreateWindowでSTATICコントロールを使ってBITMAP表示する。

    WIN32、VC++2005にて開発中です。 CreateWindowでSTATICコントロールを使ってBITMAPを表示する方法が分からなくて困ってます。 ウィンドウプロシージャのWM_CREATEで、 下記の様に書いてみたんですがダメでした。 CreateWindowW(L"Static", L"***", WS_VISIBLE|WS_CHILD|SS_BITMAP,120, 3, 100, 45, hWnd, HMENU(-1), NULL, NULL); ビットマップはIDB_BITMAP1という名前で追加してリソースビューで確認しました。 CreateWindowで表示させたいんですがいい方法ありますか? 初心者でアホなんでなるべく解り易くお願いします。

  • シェルアイコンがイメージリストに登録できない??

    Visual C++においての質問です。 APIで関連づけられたアイコンを取得したあと、イメージリストに登録しようとしてるのですが、 「不正な処理」とかで落ちてしまいます。なんか…マズい処理をやってるんでしょうか?? 大まかなソースは以下の通りです。 超初心者ですので、とんでもない間違いをしてるだけだと思うんですが…。どなたかご教授をお願いします。 CImageList IconList; CString FilePath = "C:\\test.txt"; SHFILEINFO FileInfo; IconList.Create(32,32,ILC_COLORDDB|ILC_MASK,1,1000); ::CoIntialise(NULL); SHGetFileInfo(FilePath,NULL,&FileInfo,sizeof(FileInfo),SHGFI_ICON|SHGFI_SMALLICON);

  • CBitmapか何かでbitmapの色を変更したい

    VisualStudio2008を使用しています。 例えば15x15の四角のビットマップ(■)を任意の色に変更させるプログラムを作ろうと思っていますが、 CBitmapを使えばできると思ったのですが、なかなかうまくいきません。 イメージとしてはGDI(0,0,0)をGDI(0,0.255)に変更するという関数があるのかなと思ったのですが、 MFCサイトを見てもなさそう?でした。(よくわかりませんでした) ↓こんな感じに書きましたが、うまく動きませんでした。 CBitmap iconBitmap; COLORREF cr_from = RGB(0,0,0); COLORREF cr_to = RGB(0,0,255); COLORMAP COLORMAP; COLORMAP.from = cr_from; COLORMAP.to = cr_to; iconBitmap.LoadMappedBitmap(IDB_CELLCOLOR,1,&COLORMAP,1); 最後の行で異常終了します。 簡単にできる方法はありませんでしょうか? ご教授お願いいたします。

  • リストビュー ⇔ 別ファイル構造体 の実現方法

    VC++6.0、Win32 APIを用いて作成しているダイアログボックスを表示するアプリについてです。 パターン(パターン1~3までの3種類)が格納される列と、文字列(最大256バイト)が 格納される列の2列からなるリストビューがあります。 そのリストビューに新しい情報(行)を追加するたびに、その該当行の情報を 別ファイル(設定ファイル)の構造体に格納し、リストビューの変更・削除があれば、 その都度構造体を更新し(?)反映させたいです。 メモリも無駄なく、効率的に使いたいです。 また次回以降そのアプリを起動させる際には、設定ファイルの内容を読み込んでリストビュー の表示に反映させたいです。 正直、構造体は苦手なため解らないことだらけなのですが、パターンを格納するint型の変数と 文字列を格納する固定長256byteのchar型配列の変数が必要なのではと思っています。 後は、レコード数を格納するヘッダーも必要なのでしょうか・・・ メモリの取得、開放、移動方法はいまいち分かりません。 現在は、ラジオボタン(パターン用)とエディットボックス(文字列用)を用いて、 リストビューに登録するところまでは出来ています。 変更や削除の機能も実装出来ています。 上記の処理を実現させるための詳細な流れを教えてください。 サンプルコードも載せて頂けると幸いです。 分かりにくい文章で申し訳ありませんが、よろしくお願い致します。

  • リストビューのカスタムドローについて

    Windows XP SP3 + Visual Studio 2008 C++ で、リストビューを使用したダイアログベースのソフトを作っています。 リストビューには、ファイル名、ファイルサイズ、最終更新日時を「詳細」で表示させています。(よくあるファイル一覧です。) エクスプローラと同じように、ファイル名等のテキストを NTFS の圧縮ファイルは青 暗号化ファイルは緑 で表示させようと思い、カスタムドローを使用しています。 また、圧縮でもなく暗号化でもないファイルに対しては、ChooseFont() で選択された色 ( CHOOSEFONT 構造体の rgbColors ) を設定しています。 ChooseFont() で選択した色のうち、濃紺以外の色は問題なく表示されているのですが、なぜか、ChooseFont で濃紺 ( 0x00800000 ) を選択した場合だけ、第一列 ( ファイル名 ) のみ濃紺になり、第二列目以降 ( ファイルサイズ、最終更新日時 ) が、システム設定値 ( 黒 ) となります。 しかも、リストビューのスタイルを拡張スタイルの LVS_EX_FULLROWSELECT ( 行選択モード? ) にすると、濃紺の場合でも、第二列目以降も正常に表示されます。 コーディングは、カスタムドローの部分だけを抜粋すると以下のような感じになっています。 LPNMLVCUSTOMDRAW pnmlvcd; LVITEM lvi; DWORD dwAttributes; switch( message ) { case NM_CUSTOMDRAW:   pnmlvcd = ( LPNMLVCUSTOMDRAW )lParam;   switch( pnmlvcd->nmcd.dwDrawStage ) {   case CDDS_PREPAINT:     SetWindowLong( hwndMain, DWL_MSGRESULT, ( LONG )CDRF_NOTIFYITEMDRAW );     return( TRUE );   case CDDS_ITEMPREPAINT:     lvi.mask = LVIF_PARAM;     lvi.iSubItem = 0;     lvi.iItem = pnmlvcd->nmcd.dwItemSpec; // 描画しようとしている行のインデックス     if( ListView_GetItem( hwndList, &lvi ) ) {       // 属性を取得       // lvi.lParam はファイルの情報を格納した構造体 FILEITEM へのポインタです。       dwAttributes = ( ( PFILEITEM )lvi.lParam )->dwAttributes;       if( 通常ファイルの場合 ) {  // dwAttributes を使用して属性を判定         // ChooseFont で選択した色を設定         pnmlvcd->clrText = cfList.rgbColors;         SetWindowLong( hwndMain, DWL_MSGRESULT, ( LONG )CDRF_DODEFAULT );         return( TRUE );       } else if( 圧縮ファイルの場合 ) {  // dwAttributes を使用して属性を判定         // 青         pnmlvcd->clrText = RGB( 0, 0, 0xff );         SetWindowLong( hwndMain, DWL_MSGRESULT, ( LONG )CDRF_DODEFAULT );         return( TRUE );       } else if( 暗号化ファイルの場合 ) {  // dwAttributes を使用して属性を判定         // 緑         pnmlvcd->clrText = RGB( 0, 0xff, 0 );         SetWindowLong( hwndMain, DWL_MSGRESULT, ( LONG )CDRF_DODEFAULT );         return( TRUE );       }     }   }   break; hwndMain はダイアログのウィンドウハンドル、hwndList はリストビューのウィンドウハンドルです。 (見やすくするため、スペースに全角スペースを使用しています。また、属性の判定部分は実際には dwAttributes との、&、| を使用しています。) コーディング的には、ChooseFont() で何色が選択されようが知ったこっちゃないという感じなのですが・・・。 試しに、ChooseFont() で選択した色ではなく、RGB( 0, 0, 0x80 ) を指定しても同様の現象でした。 濃紺の場合でも、LVS_EX_FULLROWSELECT でなくても第二列目以降が正しい色で表示されるようにする方法はないでしょうか。 このリストビューは Drag & Drop のソース側の機能も実装していまして、その影響で、LVS_EX_FULLROWSELECT だと、Drag 操作による複数行選択の操作が難しくなるので、LVS_EX_FULLROWSELECT は避けたいと考えています。 あるいは、上記のコーディングで、何かおかしいんじゃないかという部分がありましたら教えていただけませんでしょうか。 よろしくお願いします。

専門家に質問してみよう