home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 1999 February / VPR9902A.BIN / Vpr_data / Program / ce / LVtips / Main.c < prev    next >
C/C++ Source or Header  |  1998-11-25  |  16KB  |  568 lines

  1. //
  2. //    「LVtips」    Main.c
  3. //        Author    WindowsCE Users Group
  4. //
  5. #include    <windows.h>
  6. #include    <windowsx.h>
  7. #include    <commctrl.h>
  8. #include    <commdlg.h>
  9. #include    <shlobj.h>
  10. #include    "resource.h"
  11.  
  12. #define    IDC_LIST    20001
  13. #define IDC_DROP    20002
  14. #define    NUM_PVIEW_PROCFIELDS    6
  15.  
  16. TCHAR szAppName[] = TEXT("ListView Tips サンプル");
  17. #define        szTitle        szAppName
  18.  
  19. HINSTANCE    ghInstance;
  20. HWND    hwMain;
  21. HWND    hwCmdBar;
  22. HWND    hwndLV;
  23. HWND    hwCBMenu;
  24.  
  25. int        iView = 0;        // 表示方法:     0 = 詳細, 1 = リスト,
  26.                         // 2 = 小さなアイコン, 3 = 大きなアイコン
  27. int        Viewmode[] = {IDM_DETAILS, IDM_LIST, IDM_SMALLICONS, IDM_LARGEICONS};
  28.  
  29. LRESULT CALLBACK AboutProc(HWND ,UINT, WPARAM , LPARAM);
  30.  
  31. #define    CUSTCOLORS    16
  32. DWORD dwCustColors[CUSTCOLORS];
  33. DWORD dwColor = 0;
  34.  
  35. int    SortColumn  = 0;
  36. int SortMode    = 0;
  37. int ColumnOrder = 0;
  38.  
  39. BOOL    bExCHECKBOXES     = 0;
  40. BOOL    bExFULLROWSELECT  = 0;
  41. BOOL    bExGRIDLINES      = 0;
  42. BOOL    bExHEADERDRAGDROP = 0;
  43. BOOL    bExSUBITEMIMAGES  = 0;
  44.  
  45. //----------------------------------------------------------------------------
  46. //    カスタムカラーテーブルをイニシャル
  47. BOOL InitColor()
  48. //----------------------------------------------------------------------------
  49. {
  50.     memset(dwCustColors, 255, sizeof(dwCustColors));
  51.  
  52.     return    TRUE;
  53. }
  54.  
  55. //----------------------------------------------------------------------------
  56. BOOL ColorProc(
  57.        HWND    hwnd)
  58. //----------------------------------------------------------------------------
  59. {
  60.     CHOOSECOLOR    cc;
  61.  
  62.     memset(&cc, 0, sizeof(CHOOSECOLOR));
  63.     cc.lStructSize    = sizeof(CHOOSECOLOR);        // 構造体のサイズ
  64.     cc.hwndOwner    = hwnd;                        // ダイアログボックスを所有するウィンドウハンドル
  65.     cc.rgbResult    = dwColor;                    // 最初に選択される色
  66.     cc.lpCustColors    = dwCustColors;                // カスタム カラーの配列を指すポインタ
  67.     cc.Flags        = CC_RGBINIT | CC_FULLOPEN;    // 初期化フラグ
  68.  
  69.     if(ChooseColor(&cc))
  70.     {        // [OK]を選んだ場合
  71.         dwColor = cc.rgbResult;
  72.         return TRUE;
  73.     }
  74.  
  75.     return FALSE;
  76. }
  77.  
  78. //----------------------------------------------------------------------------
  79. LRESULT WINAPI Main_OnCommand(
  80.     HWND    hwnd,
  81.     int        id,
  82.     HWND    hwndCtl,
  83.     UINT    codeNotify)
  84. //----------------------------------------------------------------------------
  85. {
  86.     DWORD    dwExStyle;
  87.  
  88.     switch (id)
  89.     {
  90.     case IDM_DETAILS:        // 「詳細」
  91.     case IDM_LIST:            // 「リスト」
  92.     case IDM_SMALLICONS:    // 「小さなアイコン」
  93.     case IDM_LARGEICONS:    // 「大きなアイコン」
  94.         {
  95.             int        i;
  96.             DWORD    dwStyle;
  97.             DWORD    Styles[] = {LVS_REPORT, LVS_LIST, LVS_SMALLICON, LVS_ICON};
  98.  
  99.             iView = id - IDM_DETAILS;
  100.             CheckMenuRadioItem(hwCBMenu, Viewmode[0], Viewmode[3], Viewmode[iView], MF_BYCOMMAND);
  101.             for(i = 0; i < 4; i++)
  102.                 SendMessage(hwCmdBar, TB_PRESSBUTTON, Viewmode[i], (iView == i)? TRUE:FALSE);
  103.             dwStyle = GetWindowLong(hwndLV, GWL_STYLE);
  104.             for(i = 0; i < 4; i++)
  105.                 dwStyle &= ~(Styles[i]);
  106.             dwStyle = Styles[iView];
  107.             SetWindowLong(hwndLV, GWL_STYLE, dwStyle);
  108.             UpdateWindow(hwndLV);
  109.         }
  110.         return TRUE;
  111.  
  112.     case IDM_BGCOLOR:
  113.         if(ColorProc(hwnd) == TRUE)
  114.         {
  115.             ListView_SetBkColor(hwndLV, dwColor);
  116.             ListView_SetTextBkColor(hwndLV, dwColor);
  117.             ListView_SetTextColor(hwndLV, (dwColor)? RGB(0, 0, 0):RGB(255, 255, 255));
  118.             InvalidateRect(hwndLV, NULL, TRUE);
  119.             UpdateWindow(hwndLV);
  120.         }
  121.         break;
  122.  
  123.     case IDM_CHECKBOXES:
  124.         bExCHECKBOXES     = (bExCHECKBOXES)? 0:1;
  125.         CheckMenuItem(GetSubMenu(hwCBMenu,1), IDM_CHECKBOXES,
  126.             MF_BYCOMMAND | (bExCHECKBOXES)? MF_CHECKED:MF_UNCHECKED);
  127.         dwExStyle = ListView_GetExtendedListViewStyle(hwndLV);
  128.         if(bExCHECKBOXES)
  129.             dwExStyle |= LVS_EX_CHECKBOXES;
  130.         else
  131.             dwExStyle &= ~LVS_EX_CHECKBOXES;
  132.         ListView_SetExtendedListViewStyle(hwndLV, dwExStyle);
  133.         UpdateWindow(hwndLV);
  134.         break;
  135.     case IDM_FULLROWSELECT:
  136.         bExFULLROWSELECT  = (bExFULLROWSELECT)? 0:1;
  137.         CheckMenuItem(GetSubMenu(hwCBMenu,1), IDM_FULLROWSELECT,
  138.             MF_BYCOMMAND | (bExFULLROWSELECT)? MF_CHECKED:MF_UNCHECKED);
  139.         dwExStyle = ListView_GetExtendedListViewStyle(hwndLV);
  140.         if(bExFULLROWSELECT)
  141.             dwExStyle |= LVS_EX_FULLROWSELECT;
  142.         else
  143.             dwExStyle &= ~LVS_EX_FULLROWSELECT;
  144.         ListView_SetExtendedListViewStyle(hwndLV, dwExStyle);
  145.         UpdateWindow(hwndLV);
  146.         break;
  147.     case IDM_GRIDLINES:
  148.         bExGRIDLINES      = (bExGRIDLINES)? 0:1;
  149.         CheckMenuItem(GetSubMenu(hwCBMenu,1), IDM_GRIDLINES,
  150.             MF_BYCOMMAND | (bExGRIDLINES)? MF_CHECKED:MF_UNCHECKED);
  151.         dwExStyle = ListView_GetExtendedListViewStyle(hwndLV);
  152.         if(bExGRIDLINES)
  153.             dwExStyle |= LVS_EX_GRIDLINES;
  154.         else
  155.             dwExStyle &= ~LVS_EX_GRIDLINES;
  156.         ListView_SetExtendedListViewStyle(hwndLV, dwExStyle);
  157.         UpdateWindow(hwndLV);
  158.         break;
  159.     case IDM_HEADERDRAGDROP:
  160.         bExHEADERDRAGDROP = (bExHEADERDRAGDROP)? 0:1;
  161.         CheckMenuItem(GetSubMenu(hwCBMenu,1), IDM_HEADERDRAGDROP,
  162.             MF_BYCOMMAND | (bExHEADERDRAGDROP)? MF_CHECKED:MF_UNCHECKED);
  163.         dwExStyle = ListView_GetExtendedListViewStyle(hwndLV);
  164.         if(bExHEADERDRAGDROP)
  165.             dwExStyle |= LVS_EX_HEADERDRAGDROP;
  166.         else
  167.             dwExStyle &= ~LVS_EX_HEADERDRAGDROP;
  168.         ListView_SetExtendedListViewStyle(hwndLV, dwExStyle);
  169.         UpdateWindow(hwndLV);
  170.         break;
  171.     case IDM_SUBITEMIMAGES:
  172.         bExSUBITEMIMAGES  = (bExSUBITEMIMAGES)? 0:1;
  173.         CheckMenuItem(GetSubMenu(hwCBMenu,1), IDM_SUBITEMIMAGES,
  174.             MF_BYCOMMAND | (bExSUBITEMIMAGES)? MF_CHECKED:MF_UNCHECKED);
  175.         dwExStyle = ListView_GetExtendedListViewStyle(hwndLV);
  176.         if(bExSUBITEMIMAGES)
  177.             dwExStyle |= LVS_EX_SUBITEMIMAGES;
  178.         else
  179.             dwExStyle &= ~LVS_EX_SUBITEMIMAGES;
  180.         ListView_SetExtendedListViewStyle(hwndLV, dwExStyle);
  181.         {
  182.             int        item = -1;
  183.  
  184.             // 砂時計表示
  185.             SetCursor((HCURSOR) IDC_WAIT);
  186.             // 再描画を禁止にする
  187.             SendMessage(hwndLV, WM_SETREDRAW, FALSE, 0);
  188.  
  189.             while((item = ListView_GetNextItem(hwndLV, item, LVNI_ALL)) != -1)
  190.                 ListView_Update(hwndLV, item);
  191.             // 再描画を許可する
  192.             SendMessage(hwndLV, WM_SETREDRAW, TRUE, 0);
  193.             // 砂時計消去
  194.             SetCursor(NULL);
  195.         }
  196.         break;
  197.  
  198.     case IDM_SetColumnOrderArray:
  199.         {
  200.             int        iArray[2][NUM_PVIEW_PROCFIELDS] = {{0, 1, 2, 3, 4, 5}, {0, 2, 4, 1, 3, 5}};
  201.             ColumnOrder = (ColumnOrder + 1) & 0x1;
  202.             ListView_SetColumnOrderArray(hwndLV, NUM_PVIEW_PROCFIELDS, iArray[ColumnOrder]);
  203.         }
  204.         break;
  205.  
  206.     case IDM_ADDITEM:
  207.         {
  208.             int        iCol, iLine;
  209.             LVITEM    lvins;
  210.             TCHAR    szWork[80];
  211.  
  212.             // 砂時計表示
  213.             SetCursor((HCURSOR) IDC_WAIT);
  214.             // 再描画を禁止にする
  215.             SendMessage(hwndLV, WM_SETREDRAW, FALSE, 0);
  216.  
  217.             // 追加するアイテム数が分かっているので
  218.             ListView_SetItemCount(hwndLV, 10);    // 10個分確保
  219.  
  220.             // アイテムを10件分追加する
  221.             for (iLine = 0; iLine < 10; iLine++)
  222.             {
  223.                 wsprintf(szWork, TEXT("データ %02d%02d"), iLine, 0);
  224.                 memset(&lvins, 0, sizeof(LVITEM));
  225.                 lvins.mask   = LVIF_TEXT | LVIF_PARAM | LVIF_IMAGE;
  226.                 lvins.lParam = iLine;
  227.                 lvins.iItem  = iLine;
  228.                 lvins.pszText = szWork;
  229.                 lvins.cchTextMax  = sizeof(szWork);
  230.                 lvins.iImage  = 3;
  231.                 ListView_InsertItem(hwndLV, &lvins);
  232.  
  233.                 lvins.mask = LVIF_TEXT | LVIF_IMAGE;
  234.                 for (iCol = 1; iCol < NUM_PVIEW_PROCFIELDS; iCol++)
  235.                 {
  236.                     wsprintf(szWork, TEXT("%04d"), rand() % 10000);
  237.                     lvins.iSubItem = iCol;
  238.                     ListView_SetItem(hwndLV, &lvins);
  239.                 }
  240.             }
  241.             // 再描画を許可する
  242.             SendMessage(hwndLV, WM_SETREDRAW, TRUE, 0);
  243.             // 砂時計消去
  244.             SetCursor(NULL);
  245.         }
  246.         break;
  247.  
  248.     case IDM_FILECLOSE:        //「閉じる」を選択
  249.         SendMessage(hwnd, WM_CLOSE, 0, 0L);
  250.         break;
  251.  
  252.     case IDM_ABOUT:            //「バージョン情報」を選択
  253.         DialogBox(ghInstance, MAKEINTRESOURCE(IDD_ABOUT1), hwnd, (DLGPROC)AboutProc);
  254.         break;
  255.  
  256.     default:
  257.         return FALSE;
  258.  
  259.     }
  260.     return TRUE;
  261. }
  262.  
  263. //----------------------------------------------------------------------------
  264. BOOL WINAPI Main_OnCreate(
  265.     HWND            hwnd,
  266.     LPCREATESTRUCT    lpCreateStruct)
  267. //----------------------------------------------------------------------------
  268. {
  269.     // 小さいアイコンをタスクバーに登録
  270.     SendMessage(hwnd, WM_SETICON, FALSE,
  271.                 (LPARAM) LoadImage(ghInstance, MAKEINTRESOURCE(IDI_ICON1),
  272.                                    IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR));
  273.  
  274.     // カラーテーブルのイニシャル
  275.     InitColor();
  276.  
  277.     return TRUE;
  278. }
  279.  
  280. //----------------------------------------------------------------------------
  281. void WINAPI Main_OnDestroy(
  282.     HWND    hwnd)
  283. //----------------------------------------------------------------------------
  284. {
  285.     PostQuitMessage(0);
  286. }
  287.  
  288. //----------------------------------------------------------------------------
  289. // Function:    ListView Sorting
  290. int CALLBACK ListViewCompareFunc(
  291.         LPARAM    lparam1,        //
  292.         LPARAM    lparam2,        //
  293.         LPARAM    lparamSort)        //
  294. //----------------------------------------------------------------------------
  295. {
  296.     LV_FINDINFO    fi;
  297.     INT        nItem1, nItem2;
  298.     int        iResult;
  299.     TCHAR    szData1[40], szData2[40];
  300.     DWORD    Mode, Column;
  301.  
  302.     Mode   = (DWORD)(lparamSort & 0xffff);
  303.     Column = (DWORD)(lparamSort >> 16);
  304.  
  305.     fi.flags  = LVFI_PARAM;
  306.     fi.lParam = lparam1;
  307.     nItem1 = ListView_FindItem(hwndLV, -1, &fi);
  308.     ListView_GetItemText(hwndLV, nItem1, Column, szData1, sizeof(szData1)/sizeof(TCHAR));
  309.     fi.lParam = lparam2;
  310.     nItem2 = ListView_FindItem(hwndLV, -1, &fi);
  311.     ListView_GetItemText(hwndLV, nItem2, Column, szData2, sizeof(szData2)/sizeof(TCHAR));
  312.  
  313.     iResult = 0;
  314.     switch(Mode)
  315.     {
  316.     case 1:        // 昇順
  317.         if(Column)
  318.             iResult = wcslen(szData1) - wcslen(szData2);
  319.         if(! iResult)
  320.             iResult = wcsicmp(szData1, szData2);
  321.         break;
  322.     case 2:        // 降順
  323.         if(Column)
  324.             iResult = wcslen(szData2) - wcslen(szData1);
  325.         if(! iResult)
  326.             iResult = wcsicmp(szData2, szData1);
  327.         break;
  328.     default:    // 何もしない
  329.         iResult = lparam1 - lparam2;
  330.     }
  331.  
  332.     return iResult;
  333. }
  334.  
  335. //----------------------------------------------------------------------------
  336. LRESULT Main_OnNotify(
  337.     HWND    hwnd,
  338.     int        idCtl,
  339.     LPNMHDR    pnmh)
  340. //----------------------------------------------------------------------------
  341. {
  342.     NM_LISTVIEW *pnmlv = (NM_LISTVIEW *) pnmh;
  343.     LVCOLUMN    lvC;
  344.  
  345.     switch (pnmh->code)
  346.     {
  347.         case TBN_DROPDOWN:
  348.         {
  349.             int        i;
  350.             POINT    pt;
  351.             RECT    rc;
  352.             struct MENUITEM {
  353.                 UINT    uIDNewItem;
  354.                 LPCTSTR    lpNewItem;
  355.             } static MenuItem[] = {
  356.                 {IDM_LARGEICONS, TEXT("大きいアイコン")},
  357.                 {IDM_SMALLICONS, TEXT("小さいアイコン")},
  358.                 {IDM_LIST,       TEXT("リスト")},
  359.                 {IDM_DETAILS,    TEXT("詳細")},
  360.                 {0,        NULL}
  361.             };
  362.             HMENU hMenu = CreatePopupMenu();
  363.  
  364.             // Popupメニュー項目作成
  365.             for(i = 0; MenuItem[i].lpNewItem; i++)
  366.                 AppendMenu(hMenu, MF_STRING, MenuItem[i].uIDNewItem, MenuItem[i].lpNewItem);
  367.  
  368.             // Radioマーク付加
  369.             CheckMenuRadioItem(hMenu, 0, 3, 3-iView, MF_BYPOSITION);
  370.  
  371.             // Popupする場所を計算
  372.             GetClientRect(hwCmdBar, (LPRECT) &rc);
  373.             pt.x = rc.left;
  374.             pt.y = rc.bottom;
  375.             ClientToScreen(hwCmdBar, &pt);
  376.             TrackPopupMenu(hMenu, TPM_TOPALIGN | TPM_LEFTALIGN, pt.x, pt.y, 0, hwnd, NULL);
  377.  
  378.             DestroyMenu(hMenu);
  379.  
  380.             return TRUE;
  381.         }
  382.     }
  383.  
  384.     switch (pnmh->idFrom)
  385.     {
  386.     case IDC_LIST:
  387.         switch (pnmh->code)
  388.         {
  389.         case LVN_COLUMNCLICK:
  390.             if(pnmlv->iSubItem != SortColumn)
  391.             {
  392.                 lvC.mask = LVCF_IMAGE;
  393.                 lvC.iImage = 0;
  394.                 ListView_SetColumn(hwndLV, SortColumn, &lvC); 
  395.                 SortMode = 1;
  396.                 SortColumn = pnmlv->iSubItem;
  397.             }
  398.             else
  399.             {
  400.                 SortMode++;
  401.                 SortMode %= 3;
  402.             }
  403.             lvC.mask = LVCF_IMAGE;
  404.             lvC.iImage = SortMode;
  405.             ListView_SetColumn(hwndLV, SortColumn, &lvC); 
  406.  
  407.             // Sort
  408.             ListView_SortItems(hwndLV, ListViewCompareFunc,
  409.                                 (LPARAM) MAKELONG(SortMode, SortColumn));
  410.             return TRUE;
  411.         }
  412.     }
  413.  
  414.     return FALSE;
  415. }
  416.  
  417. //----------------------------------------------------------------------------
  418. LRESULT CALLBACK WndProc(
  419.     HWND    hwnd,
  420.     UINT    uMsg,
  421.     WPARAM    wParam,
  422.     LPARAM    lParam)
  423. //----------------------------------------------------------------------------
  424. {
  425.     switch(uMsg)
  426.     {
  427.     HANDLE_MSG(hwnd, WM_CREATE,        Main_OnCreate );
  428.     HANDLE_MSG(hwnd, WM_COMMAND,    Main_OnCommand);
  429.     HANDLE_MSG(hwnd, WM_NOTIFY,        Main_OnNotify );
  430.     HANDLE_MSG(hwnd, WM_DESTROY,    Main_OnDestroy);
  431.     default:
  432.         return DefWindowProc(hwnd, uMsg, wParam, lParam);
  433.     }
  434.  
  435.     return FALSE;
  436. }
  437.  
  438. //----------------------------------------------------------------------------
  439. BOOL InitApplication(
  440.     HINSTANCE    hInstance)
  441. //----------------------------------------------------------------------------
  442. {
  443.     WNDCLASS    wc;
  444.  
  445.     memset(&wc, 0, sizeof(WNDCLASS));
  446.     wc.style         = CS_HREDRAW | CS_VREDRAW ;
  447.     wc.lpszClassName = szAppName;
  448.     wc.lpfnWndProc   = (WNDPROC) WndProc;
  449.     wc.hInstance     = hInstance;
  450.     wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
  451.  
  452.     return RegisterClass(&wc);
  453. }
  454.  
  455. //----------------------------------------------------------------------------
  456. BOOL InitInstance(
  457.     HINSTANCE    hInstance,
  458.     int            CmdShow)
  459. //----------------------------------------------------------------------------
  460. {
  461.     RECT    rc;
  462.     int        iCol, i;
  463.     HIMAGELIST    himLage, himSmall;
  464.     LVCOLUMN    lvColumn;
  465.     TCHAR        szWork[80];
  466.  
  467.     static TBBUTTON tbORGButton[] = {
  468.         {0,             0,        TBSTATE_ENABLED, TBSTYLE_SEP,      0, 0, 0,  0},
  469.         {VIEW_DETAILS,    IDC_DROP, TBSTATE_ENABLED, TBSTYLE_DROPDOWN, 0, 0, 0L, -1},
  470.     };
  471.  
  472.     WORD iIcons[] = {IDI_ICON2, IDI_ICON3, IDI_ICON4, IDI_ICON1, 0};
  473.  
  474.     ghInstance = hInstance;
  475.     InitCommonControls();
  476.  
  477.     // create MainWindow
  478.     if((hwMain = CreateWindow(szAppName, szTitle, WS_VISIBLE,
  479.                               CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
  480.                               NULL, NULL, ghInstance, NULL)) == NULL)
  481.         return FALSE;
  482.  
  483.     // create Commandbar(menu)
  484.     hwCmdBar = CommandBar_Create(ghInstance, hwMain, 1);
  485.     CommandBar_InsertMenubar(hwCmdBar, ghInstance, IDR_MENU1, 0);
  486.     hwCBMenu  = CommandBar_GetMenu(hwCmdBar, 0);
  487.     CheckMenuRadioItem(hwCBMenu, Viewmode[0], Viewmode[3], Viewmode[iView], MF_BYCOMMAND);
  488.  
  489.     CommandBar_AddBitmap(hwCmdBar, HINST_COMMCTRL, IDB_VIEW_SMALL_COLOR, 0, 0, 0);
  490.     CommandBar_AddButtons(hwCmdBar, sizeof(tbORGButton)/sizeof(TBBUTTON), tbORGButton);
  491.     CommandBar_AddAdornments(hwCmdBar, 0, 0);
  492.  
  493.     GetClientRect(hwMain, &rc);
  494.     rc.top = CommandBar_Height(hwCmdBar);
  495.     rc.bottom -= rc.top;
  496.     rc.left    = 0;
  497.     rc.right  -= rc.left;
  498.  
  499.     // List View Window
  500.     if((hwndLV = CreateWindow(WC_LISTVIEW, TEXT(""), WS_VISIBLE | WS_CHILD | WS_BORDER | WS_TABSTOP |
  501.                               LVS_REPORT,
  502.                               rc.left, rc.top, rc.right, rc.bottom,
  503.                               hwMain, (HMENU) IDC_LIST, hInstance, NULL)) == NULL)
  504.         return FALSE;
  505.  
  506.     // 大きいアイコンのイメージリスト作成
  507.     himLage  = ImageList_Create(32, 32, ILC_COLOR | ILC_MASK, 0, 0);
  508.     for(i = 0; iIcons[i]; i++)
  509.         ImageList_AddIcon(himLage, LoadIcon(ghInstance, MAKEINTRESOURCE(iIcons[i])));
  510.     ListView_SetImageList(hwndLV, himLage, LVSIL_NORMAL);
  511.  
  512.     // 小さいアイコンのイメージリスト作成
  513.     himSmall = ImageList_Create(16, 16, ILC_COLOR | ILC_MASK, 0, 0);
  514.     for(i = 0; iIcons[i]; i++)
  515.         ImageList_AddIcon(himSmall, LoadImage(ghInstance, MAKEINTRESOURCE(iIcons[i]),
  516.                                            IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR));
  517.     ListView_SetImageList(hwndLV, himSmall, LVSIL_SMALL);
  518.  
  519.     memset(&lvColumn, 0, sizeof(lvColumn));
  520.     lvColumn.mask = (LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH | LVCF_IMAGE);
  521.     lvColumn.fmt  = (LVCFMT_LEFT | LVCFMT_BITMAP_ON_RIGHT | LVCFMT_IMAGE);
  522.     GetClientRect(hwndLV, &rc);
  523.     lvColumn.cx   = (rc.right - rc.left - GetSystemMetrics(SM_CXVSCROLL)) / NUM_PVIEW_PROCFIELDS;
  524.     for (iCol = 0; iCol < NUM_PVIEW_PROCFIELDS; iCol++)
  525.     {
  526.         wsprintf(szWork, TEXT("カラム %d"), iCol);
  527.         lvColumn.pszText = szWork;
  528.         lvColumn.iSubItem = iCol;
  529.         lvColumn.iImage  = 0;
  530.         ListView_InsertColumn(hwndLV, iCol, &lvColumn);
  531.     }
  532.  
  533.     ShowWindow(hwMain, CmdShow);
  534.     UpdateWindow(hwMain);
  535.  
  536.     return TRUE;
  537. }
  538.  
  539. //----------------------------------------------------------------------------
  540. int WINAPI WinMain(
  541.     HINSTANCE    hInstance,            // 
  542.     HINSTANCE    hPrevInstance,        // 
  543.     LPTSTR        lpCmdLine,            // 
  544.     int            nCmdShow)            // 
  545. //----------------------------------------------------------------------------
  546. {
  547.     MSG        msg;
  548.     HANDLE    hAccel;
  549.  
  550.     if(! hPrevInstance)
  551.         if(! InitApplication(hInstance))
  552.             return FALSE;
  553.  
  554.     if(! InitInstance(hInstance, nCmdShow))
  555.         return FALSE;
  556.  
  557.     hAccel = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDR_ACCELERATOR1));
  558.  
  559.     while(GetMessage(&msg, NULL, 0, 0))
  560.     {    // Message Loop
  561.         if (! TranslateAccelerator(hwMain, hAccel, &msg))
  562.             TranslateMessage(&msg);    // Translates virtual key codes
  563.         DispatchMessage(&msg);        // Dispatches message to window
  564.     }
  565.  
  566.     return msg.wParam;
  567. }
  568.