リストビューの背景に画像を設定したい

アバター
Ciel
記事: 252
登録日時: 15年前

リストビューの背景に画像を設定したい

投稿記事 by Ciel » 14年前

1週間ぐらい前からリストビューの背景を画像に設定しようとしているが、上手くいかない。

リストビューを背景を画像にすること自体あまりないらしく、ググって見てもあまりサンプルがない。

下記のようにLVBKIMAGE構造体に値をセットし、ListVIew_SetBkImageマクロを使って、
設定するらしいのだが、FALSEが返ってきてしまいエラーになる。
下記のソースはビットマップのハンドルを使用して設定しているが、
直接ファイル名を指定して設定しようとしてもエラーが出てしまう。

ウィンドウハンドルやビットマップハンドルの値には問題がないことを確かめているのに
何故失敗するか分からない。
ListView_SetTextBkColorやTextColorの方はエラーが出ないんだけどなぁ。。

誰か分かる方、教えていただけると助かります。。。

CODE:

LVBKIMAGE lvbk;

HBITMAP hbmp=NULL;

hbmp=LoadBitmapA(hinst,"BACK2_BMP");

//リストビュー背景用構造体の初期化
memset(&lvbk,0,sizeof(lvbk));
lvbk.ulFlags=LVBKIF_SOURCE_HBITMAP | LVBKIF_STYLE_NORMAL;
lvbk.hbm=hbmp;
if(!ListView_SetBkImage(output_hwnd,&lvbk))
	MSG("背景画像設定みす");

ListView_SetTextColor(output_hwnd,RGB(255,255,255))
ListView_SetTextBkColor(output_hwnd,CLR_NONE);

アバター
bitter_fox
記事: 607
登録日時: 14年前

Re: リストビューの背景に画像を設定したい

投稿記事 by bitter_fox » 14年前

OSってWindowsXPですか??

もしXPだったら以下を参考にしてください。
[ListView_SetBkImage does not work on XP]
http://stackoverflow.com/questions/6496 ... work-on-xp

(質問に対する答え)
To make it work in both versions(XP and Vista), we used both the approaches.
もし、2つのバージョン(XPとVista)で動かすには、我々は、2つのアプローチを用います。
For XP, we are loading the image from file and for Vista we are loading it from resource.
XPには、ファイルから画像を読み込みます。また、Vistaには、リソースから画像を読み込みます。

For some reason, loading from file does not work in Vista and loading from resource handle does not work in XP.
ある理由で、ファイルから読み込んだ場合、Vistaでは動きません。またリソースから読み込んだ場合、XPでは動きません。

So the approach is to load it from file first and then if it fails, load from resource handle.
ですので、実務的には、まず、ファイルから読み込んでみます、もしそれがダメだったら、つぎはリソースから読み込んでやります。

見た感じリソースから、読み込んでますが、ファイルから読み込むように変えてみてはどうでしょうか?

ISLe
記事: 2650
登録日時: 15年前

Re: リストビューの背景に画像を設定したい

投稿記事 by ISLe » 14年前

Windows7で試したらリソースからの読み込みができないですね。
ファイルから読み込むときファイル名はドライブ名から始まるフルパスでないといけないようです。
あとListView_SetBkImageを呼ぶ前にCoInitializeまたはOleInitializeを呼ぶ必要があります。
プログラム開始時にCoInitialize(NULL)してプログラム終了時にCoUninitialize()すれば良いでしょう。

アバター
Ciel
記事: 252
登録日時: 15年前

Re: リストビューの背景に画像を設定したい

投稿記事 by Ciel » 14年前

bitter_foxさん、ISLeさん、ありがとうございました!

無事にリストビューの背景に画像を設定することが出来ました。

OSによって、読み込む方法が違うのはちょっと面倒ですねぇ。
さらにファイルから読み込むように設定した場合、ファイルパスが間違ってたりした場合でも
ListView_SetBkImageマクロはFALSEを何故か返してくれないようです。

事前にLoadBitmap関数などで読み込めるかチェックしてから設定することになりそうです。。。

とりあえず問題は解決したので良しとします。
1週間ぐらいずっと悩んでいたので、本当に助かりました!
本当にありがとうございました!

一応同じことで困る人が出てきた時のために、コードを貼っておきます。


     LVBKIMAGEA lvbk;
char buf[1500];
char dir[1500];
char drive[100];

memset(buf,0,sizeof(buf));
memset(drive,0,sizeof(drive));

GetModuleFileName(NULL,buf,sizeof(buf));

_splitpath(buf,drive,dir,NULL,NULL);
sprintf(buf,"%s%stest.bmp",drive,dir);

//リストビュー背景用構造体の初期化
//ウィンドウズ7ではリソースからの読み込みができない。
//ファイルパスを指定するときはフルパスでないとだめ。
memset(&lvbk,0,sizeof(lvbk));
lvbk.ulFlags=LVBKIF_SOURCE_URL | LVBKIF_STYLE_NORMAL;
lvbk.pszImage=buf;
lvbk.cchImageMax=strlen(buf)+1;

//背景に画像を設定するためにoleを初期化。
if(OleInitialize(NULL)){
MSG("OLEの初期化失敗");
return -1;
}
if(!ListView_SetBkImage(output_hwnd,&lvbk))
MSG("背景画像設定みす");
ListView_SetTextColor(output_hwnd,RGB(255,255,255));
ListView_SetTextBkColor(output_hwnd,CLR_NONE);
ListView_SetBkColor(output_hwnd,CLR_NONE);

ISLe
記事: 2650
登録日時: 15年前

Re: リストビューの背景に画像を設定したい

投稿記事 by ISLe » 14年前

bitter_fox さんの紹介された情報によるとLVBKIMAGEA構造体にファイル名(フルパス)をセットする方法はVistaでは動かないということなので、失敗したらもう一方を試す必要があるのでは?
LoadImage APIを使えばファイルからロードしてビットマップハンドルを取得できます。ファイル実在の確認にも使えるかと。

アバター
Ciel
記事: 252
登録日時: 15年前

Re: リストビューの背景に画像を設定したい

投稿記事 by Ciel » 14年前

ISLeさんありがとうございます!

その方法でいけそうですね。助かりました。