前提・実現したいこと
リストビューでどこかの行を選択している状態で、リストビュー内のデータが存在しない場所をクリックすると、選択が解除されてしまいます。
(下のプログラムの場合は1行目や2行目を選択した状態で3行目以降をクリックすると選択が解除される)
リストビュー作成時にLVS_SHOWSELALWAYSを追加すれば選択が解除されないようにできると思ったのですが、うまくいきませんでした(クリックした位置はリストビュー内なのでフォーカスが失われているわけではないようです)。
この時に選択が解除されないようにするにはどうすればいいですか?
該当のソースコード
c
1#include <windows.h> 2#include <CommCtrl.h> 3#pragma comment(lib,"comctl32.lib") 4 5LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); 6 7TCHAR szClassName[] = TEXT("myprog"); 8HINSTANCE hinst; 9 10int WINAPI WinMain(_In_ HINSTANCE hCurInst, _In_opt_ HINSTANCE hPrevInst, 11 _In_ LPSTR lpsCmdLine, _In_ int nCmdShow) 12{ 13 14 hinst = hCurInst; 15 16 MSG msg; 17 BOOL bRet; 18 WNDCLASSEX wc; 19 HWND hWnd; 20 ATOM atom; 21 22 wc.cbSize = sizeof(WNDCLASSEX); 23 wc.style = CS_HREDRAW | CS_VREDRAW; 24 wc.lpfnWndProc = WndProc; 25 wc.cbClsExtra = 0; 26 wc.cbWndExtra = 0; 27 wc.hInstance = hCurInst; 28 wc.hIcon = (HICON)LoadImage(NULL, 29 MAKEINTRESOURCE(IDI_APPLICATION), 30 IMAGE_ICON, 31 0, 32 0, 33 LR_DEFAULTSIZE | LR_SHARED); 34 wc.hCursor = (HCURSOR)LoadImage(NULL, 35 MAKEINTRESOURCE(IDC_ARROW), 36 IMAGE_CURSOR, 37 0, 38 0, 39 LR_DEFAULTSIZE | LR_SHARED); 40 wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); 41 wc.lpszMenuName = NULL; 42 wc.lpszClassName = szClassName; 43 wc.hIconSm = (HICON)LoadImage(NULL, 44 MAKEINTRESOURCE(IDI_APPLICATION), 45 IMAGE_ICON, 46 0, 47 0, 48 LR_DEFAULTSIZE | LR_SHARED); 49 50 if ((atom = RegisterClassEx(&wc)) == 0) 51 return FALSE; 52 53 hWnd = CreateWindow(MAKEINTATOM(atom), 54 TEXT("リストビューのテスト"), 55 WS_OVERLAPPEDWINDOW, 56 CW_USEDEFAULT, 57 CW_USEDEFAULT, 58 CW_USEDEFAULT, 59 CW_USEDEFAULT, 60 NULL, 61 NULL, 62 hCurInst, 63 NULL); 64 if (!hWnd) 65 return FALSE; 66 67 ShowWindow(hWnd, nCmdShow); 68 UpdateWindow(hWnd); 69 while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0) { 70 if (bRet == -1) { 71 break; 72 } else { 73 TranslateMessage(&msg); 74 DispatchMessage(&msg); 75 } 76 } 77 return (int)msg.wParam; 78} 79 80LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) 81{ 82 83 LVCOLUMN lvcol; 84 LVITEM item; 85 DWORD dwStyle; 86 static HWND hList; 87 88 switch (msg) { 89 case WM_CREATE: 90 InitCommonControls(); 91 hList = CreateWindowEx(0,WC_LISTVIEW,0, 92 WS_CHILD | WS_VISIBLE | LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS, 93 0, 0, 0, 0, 94 hWnd, (HMENU)100, hinst, NULL); 95 96 dwStyle = ListView_GetExtendedListViewStyle(hList); 97 dwStyle |= LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES; 98 ListView_SetExtendedListViewStyle(hList, dwStyle); 99 100 lvcol.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; 101 lvcol.fmt = LVCFMT_LEFT; 102 lvcol.cx = 300; 103 lvcol.pszText = TEXT("タイトル1"); 104 lvcol.iSubItem = 0; 105 ListView_InsertColumn(hList,0,&lvcol); 106 107 lvcol.pszText = TEXT("タイトル2"); 108 lvcol.iSubItem = 1; 109 ListView_InsertColumn(hList, 1, &lvcol); 110 111 item.mask = LVIF_TEXT; 112 item.pszText = TEXT("文字列"); 113 item.iItem = 0; 114 item.iSubItem = 0; 115 ListView_InsertItem(hList,&item); 116 117 item.pszText = TEXT("文字列"); 118 item.iItem = 1; 119 item.iSubItem = 0; 120 ListView_InsertItem(hList, &item); 121 122 item.pszText = TEXT("文字列"); 123 item.iItem = 0; 124 item.iSubItem = 1; 125 ListView_SetItem(hList, &item); 126 127 item.pszText = TEXT("文字列"); 128 item.iItem = 1; 129 item.iSubItem = 1; 130 ListView_SetItem(hList, &item); 131 132 break; 133 134 case WM_SIZE: 135 MoveWindow(hList, 0, 0, LOWORD(lp), HIWORD(lp), TRUE); 136 break; 137 138 case WM_DESTROY: 139 PostQuitMessage(0); 140 break; 141 default: 142 return (DefWindowProc(hWnd, msg, wp, lp)); 143 } 144 return 0; 145}
補足情報(FW/ツールのバージョンなど)
Microsoft Visual Studio Community 2019
Microsoft Visual C++ 2019 C言語
WIN32 ユニコードビルド Windows10
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/12/05 06:12