初日 最新 目次 MAIL HOME


*-- To Tell The Truth --*
Cruz
MAIL
HOME

My追加

2001年06月05日(火)
Multi Task Single User

とうとうかねてから悩みまくっていた
リストビューの行毎色変えを断念し、
リストボックスの行毎色変えまでも断念し、
リストビューでアイコン表示にしてみた。

紹介するまでもないが・・・一応(自分のために)覚え書。

===========

LRESULT CALLBACK MonitorProc(
 HWND hDlgWnd,
 UINT message,
 WPARAM wParam,
 LPARAM lParam)
{
 HWND hLV;
 DWORD dwStyle;
 HIMAGELIST hImage; //イメージリスト
 WORD lpwIcons[] = { IDI_NOICON , IDI_SAVE, IDI_WSCORE }; //イメージリストに載せるアイコン

 switch(message){
  case WM_INITDIALOG: // ウィンドウ初期設定
    // リストビューの初期設定
    hLV = GetDlgItem(hDlgWnd, IDC_MONI_LIST);
    dwStyle = ListView_GetExtendedListViewStyle(hLV);

    // リストビュー1行選択&カラム線
    dwStyle |= LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES;
    ListView_SetExtendedListViewStyle(hLV, dwStyle);

    // アイコン設定
    hImage = SetImageListOnListView(hLV, lpwIcons, 3);

    // リストビューのヘッダ&データ出力
    SetListHeader(hLV);
    SetListData(hLV);

    break;
  case WM_COMMAND: // コマンド操作時
    return (Mon_CommProc(hLV, hDlgWnd, HIWORD(wParam), LOWORD(wParam), lParam, hImage));
  default:
    return FALSE;
  }
  return TRUE;

}

HIMAGELIST SetImageListOnListView(
  HWND hLV,
  WORD *lpwIcons,
  UINT uIconNum)
{
 UINT i;
 HIMAGELIST hImage;
 HICON hicon;
 int iIconSize,iImageList;

 // スモールアイコンのみ
 iIconSize = 16;
 iImageList = LVSIL_SMALL;

 if((hImage = ImageList_Create(
        iIconSize,
        iIconSize,
        ILC_COLOR4,
        uIconNum,
        0)) == NULL)
  return NULL;

 ListView_SetImageList(hLV, hImage, iImageList);

 for(i = 0;i < uIconNum;i++){
  hicon = LoadIcon(
      (HINSTANCE)GetWindowLong(hLV, GWL_HINSTANCE),
      MAKEINTRESOURCE(lpwIcons[i]));
  if(ImageList_AddIcon(hImage, hicon) == -1){
    ImageList_Destroy(hImage);
    return NULL;
  }
 }
 return hImage;
}

アイコンの指定はLV_ITEM構造体のiImageへ定義する。

===========

この方法でダイアログ内のリストボックスでもアイコン指定ができる。
データをリストビューに引き渡すのと同じ時にアイコン指定もできるので、
データの値ごとにアイコンを切り替えることも簡単である。

意外と簡単にできてしまったため、
諦めきれずにリストボックスの行毎色変えに再挑戦を始める。
※本日の題名と内容は関係ない。昔こんなネーミングで売り出されたOSがあったなぁ・・・くらいの思い付きである。