前提・実現したいこと
下のプログラムでリストビューの項目選択後にボタンを押すと、選択している行の背景色がグレーになってしまいます。
フォーカスを失った時に変更される色を設定する関数があればいいと思い、探してみましたが見つかりませんでした。
また、カスタムドローという方法で出来るかもと思い、いろいろ試してみましたがうまくいきませんでした。
行を選択後にリストビューがフォーカスを失っても選択行の色が変わらないようにするにはどうすればいいですか?
該当のソースコード
c
1 2#include <windows.h> 3#include <CommCtrl.h> 4#pragma comment(lib,"comctl32.lib") 5 6LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); 7 8TCHAR szClassName[] = TEXT("myprog"); 9HINSTANCE hinst; 10HWND hList=NULL; 11 12 13int WINAPI WinMain(_In_ HINSTANCE hCurInst, _In_opt_ HINSTANCE hPrevInst, 14 _In_ LPSTR lpsCmdLine, _In_ int nCmdShow) 15{ 16 17 hinst = hCurInst; 18 19 MSG msg; 20 BOOL bRet; 21 WNDCLASSEX wc; 22 HWND hWnd; 23 ATOM atom; 24 25 wc.cbSize = sizeof(WNDCLASSEX); 26 wc.style = CS_HREDRAW | CS_VREDRAW; 27 wc.lpfnWndProc = WndProc; 28 wc.cbClsExtra = 0; 29 wc.cbWndExtra = 0; 30 wc.hInstance = hCurInst; 31 wc.hIcon = (HICON)LoadImage(NULL, 32 MAKEINTRESOURCE(IDI_APPLICATION), 33 IMAGE_ICON, 34 0, 35 0, 36 LR_DEFAULTSIZE | LR_SHARED); 37 wc.hCursor = (HCURSOR)LoadImage(NULL, 38 MAKEINTRESOURCE(IDC_ARROW), 39 IMAGE_CURSOR, 40 0, 41 0, 42 LR_DEFAULTSIZE | LR_SHARED); 43 wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); 44 wc.lpszMenuName = NULL; 45 wc.lpszClassName = szClassName; 46 wc.hIconSm = (HICON)LoadImage(NULL, 47 MAKEINTRESOURCE(IDI_APPLICATION), 48 IMAGE_ICON, 49 0, 50 0, 51 LR_DEFAULTSIZE | LR_SHARED); 52 53 if ((atom = RegisterClassEx(&wc)) == 0) 54 return FALSE; 55 56 hWnd = CreateWindow(MAKEINTATOM(atom), 57 TEXT("リストビューのテスト"), 58 WS_OVERLAPPEDWINDOW, 59 0, 60 0, 61 616, 62 400, 63 NULL, 64 NULL, 65 hCurInst, 66 NULL); 67 if (!hWnd) 68 return FALSE; 69 70 ShowWindow(hWnd, nCmdShow); 71 UpdateWindow(hWnd); 72 while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0) { 73 if (bRet == -1) { 74 break; 75 } else { 76 TranslateMessage(&msg); 77 DispatchMessage(&msg); 78 } 79 } 80 return (int)msg.wParam; 81} 82 83 84LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) 85{ 86 87 LVCOLUMN lvcol; 88 LVITEM item; 89 DWORD dwStyle; 90 static HWND hbutton; 91 LPNMHDR lpnmhdr; 92 LPNMLVCUSTOMDRAW lplvcd; 93 switch (msg) { 94 case WM_CREATE: 95 InitCommonControls(); 96 97 hbutton = CreateWindow(TEXT("BUTTON"), TEXT("ボタン"), WS_CHILD | WS_VISIBLE, 0, 0, 0, 0, hWnd, (HMENU)200, hinst, NULL); 98 99 hList = CreateWindowEx(0,WC_LISTVIEW,0, 100 WS_CHILD | WS_VISIBLE | LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS, 101 0, 0, 0, 0, 102 hWnd, (HMENU)100, hinst, NULL); 103 104 dwStyle = ListView_GetExtendedListViewStyle(hList); 105 dwStyle |= LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES; 106 ListView_SetExtendedListViewStyle(hList, dwStyle); 107 108 lvcol.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; 109 lvcol.fmt = LVCFMT_LEFT; 110 lvcol.cx = 300; 111 lvcol.pszText = TEXT("タイトル1"); 112 lvcol.iSubItem = 0; 113 ListView_InsertColumn(hList,0,&lvcol); 114 115 lvcol.pszText = TEXT("タイトル2"); 116 lvcol.iSubItem = 1; 117 ListView_InsertColumn(hList, 1, &lvcol); 118 119 item.mask = LVIF_TEXT; 120 item.pszText = TEXT("文字列"); 121 item.iItem = 0; 122 item.iSubItem = 0; 123 ListView_InsertItem(hList,&item); 124 125 item.pszText = TEXT("文字列"); 126 item.iItem = 1; 127 item.iSubItem = 0; 128 ListView_InsertItem(hList, &item); 129 130 item.pszText = TEXT("文字列"); 131 item.iItem = 0; 132 item.iSubItem = 1; 133 ListView_SetItem(hList, &item); 134 135 item.pszText = TEXT("文字列"); 136 item.iItem = 1; 137 item.iSubItem = 1; 138 ListView_SetItem(hList, &item); 139 140 break; 141 case WM_NOTIFY: 142 143 lpnmhdr = (LPNMHDR)lp; 144 if (lpnmhdr->code == NM_CUSTOMDRAW) { 145 lplvcd = (LPNMLVCUSTOMDRAW)lp; 146 switch (lplvcd->nmcd.dwDrawStage) { 147 case CDDS_PREPAINT: 148 return CDRF_NOTIFYITEMDRAW; 149 case CDDS_ITEMPREPAINT: 150 151 //CDIS_GRAYED以外のCDIS_SELECTEDやCDIS_DISABLEDと比較してもうまくいかなかった 152 if (lplvcd->nmcd.uItemState == CDIS_GRAYED) { 153 lplvcd->clrText = RGB(255, 255, 255); 154 lplvcd->clrTextBk = RGB(0, 0, 255);//行選択時の背景色が分からないので適当 155 } 156 break; 157 } 158 159 } 160 break; 161 case WM_SIZE: 162 MoveWindow(hList, 0, 0, LOWORD(lp), HIWORD(lp)/2, TRUE); 163 MoveWindow(hbutton, 0, HIWORD(lp) / 2, LOWORD(lp), HIWORD(lp) / 2+1, TRUE); 164 break; 165 166 case WM_DESTROY: 167 PostQuitMessage(0); 168 break; 169 default: 170 return (DefWindowProc(hWnd, msg, wp, lp)); 171 } 172 return 0; 173} 174 175
補足情報(FW/ツールのバージョンなど)
Microsoft Visual Studio Community 2019
Microsoft Visual C++ 2019 C言語
WIN32 ユニコードビルド Windows10
回答2件
あなたの回答
tips
プレビュー