WedX - журнал о программировании и компьютерных науках

С++ элемент списка winapi выбран, но не выделен

вот dialogProc для моего диалогового окна, которое содержит список, диалог создается простой кнопкой из главного окна моего приложения. проблема в том, что ListView_SetItemState завершается успешно, но элемент не выделяется. также, когда я вручную нажимаю элемент (значок), выбирается (выделен) только значок, а не весь RECT элемента. Спасибо за вашу помощь.

   BOOL CALLBACK DialogProc(HWND ihDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
   {
   TCHAR pszfile[MAX_PATH];
   SIZE  size;
   int   selected_icon,wn_v;
   char  buffer[MAX_PATH];
   LVTILEVIEWINFO tileViewInfo;
   LVCOLUMN LvCol;
   size_t   i;
   switch(uMsg)
    {
      case WM_INITDIALOG: 

    EnableWindow(GetParent(ihDlg),false);

    hDLGedit     = CreateWindowEx(WS_EX_CLIENTEDGE,L"edit",L"",WS_HSCROLL|ES_AUTOHSCROLL|
                              WS_CHILD|WS_VISIBLE,5,25,250,25,ihDlg,(HMENU) DLG_edit_BX,0,0);
    hDLGb_browse = CreateWindowEx(WS_EX_CLIENTEDGE,L"BUTTON",L"Browse",
                              WS_CHILD|WS_VISIBLE,257,25,60,25,ihDlg,(HMENU) DLG_bt_BROWS,0,0);
    hDLGlistv    = CreateWindow(WC_LISTVIEW,L"",WS_HSCROLL|LVS_AUTOARRANGE|LVS_ICON|LVS_SINGLESEL|
                              WS_VISIBLE|WS_CHILD | LVS_REPORT | LVS_EDITLABELS,10,80,425,150,ihDlg,(HMENU) DLG_LIST_icons,0,0);
    size.cx=45;
    size.cy=45;
    tileViewInfo.cbSize   = sizeof(tileViewInfo);
    tileViewInfo.dwFlags  = LVTVIF_FIXEDSIZE;
    tileViewInfo.dwMask   = LVTVIM_COLUMNS | LVTVIM_TILESIZE;
    tileViewInfo.cLines   = 2;
    tileViewInfo.sizeTile = size;
    ListView_SetTileViewInfo(hDLGlistv, &tileViewInfo);     
    LvCol.mask=LVCF_IMAGE;    
    LvCol.fmt=LVCFMT_IMAGE;                                   
    LvCol.pszText=L"Item"; 
    ListView_InsertColumn(hDLGlistv,0,&LvCol);

    ShowScrollBar(hDLGedit,SB_HORZ,0);
    GetWindowsDirectory(pszfile,MAX_PATH);
    wcscat_s(pszfile,50,TEXT("\\system32\\SHELL32.dll"));
    SendMessage(hDLGedit,WM_SETTEXT,0,reinterpret_cast<LPARAM>(pszfile) );  
    iload_Icons(hDLGlistv,pszfile);//just a function that loads icons and fill up the listview
    ListView_SetView(hDLGlistv,LV_VIEW_TILE);
    ListView_SetItemState(hDLGlistv,0,LVIS_FOCUSED | LVIS_SELECTED,LVIS_FOCUSED | LVIS_SELECTED);
    break;
case WM_PAINT:    
    // some painting
     break;
case WM_COMMAND:
  switch(LOWORD(wParam))
     {
        case DLG_edit_BX:
            return TRUE;
        case DLG_bt_BROWS:
             Do_icon_open(ihDlg);// just filling the listview
             ListView_SetItemState(hDLGlistv,0,LVIS_FOCUSED | LVIS_SELECTED,LVIS_FOCUSED | LVIS_SELECTED );
            return TRUE;
        case IDOK:
             SendMessage(hDLGedit, WM_GETTEXT, 260, (LPARAM) pszfile);
             selected_icon= ListView_GetNextItem(hDLGlistv, -1, LVNI_SELECTED);              
    // some code related to the selection of an icon         
             EndDialog(ihDlg, wParam);
             hDlg=NULL;
             break;
        case IDCANCEL:
             EndDialog(ihDlg, wParam);
             hDlg=NULL; //golobal varialble (the dialog itself
             break;
     }
case WM_CLOSE:
     EndDialog(ihDlg, wParam);
     hDlg=NULL;
     break;
case WM_DESTROY:
     PostQuitMessage(0);
     break;
 }
 return 0;

}

22.12.2013

Ответы:


1

Используйте стиль окна LVS_SHOWSELALWAYS, если вы хотите, чтобы выбор отображался, даже если в списке нет фокуса.

Используйте расширенный стиль окна LVS_EX_FULLROWSELECT, если вы хотите, чтобы элемент И подэлемент выделялись при выборе.

Используйте CreateWindowEx или SetWindowLong с GWL_EXSTYLE, чтобы иметь возможность указать расширенный стиль.

22.12.2013
  • спасибо, мануэль, я использовал hDLGlistv = CreateWindowEx(LVS_EX_FULLROWSELECT,WC_LISTVIEW,L"",WS_HSCROLL|LVS_AUTOARRANGE|LVS_ICON|LVS_SINGLESEL|LVS_SHOWSELALWAYS| WS_VISIBLE|WS_CHILD | LVS_REPORT ,7,70,425,175,ihDlg,(HMENU) DLG_LIST_icons,0,0); теперь элемент выделяется (выбирается) при создании, но по-прежнему выделяется только значок, а не весь прямоугольник 22.12.2013
  • Извините моя ошибка. Вы не можете использовать L‌​VS_ICON и LVS_REPORT одновременно, а LVS_EX_FULLROWSELECT предназначен только для LVS_REPORT. Не могли бы вы добавить изображение к своему вопросу, показывающее, что не так с представлением списка? 23.12.2013
  • у меня всего 6 очков репутации, поэтому я не могу опубликовать картинку, но вот ссылка s25.postimg.org/su0x1mtwf /Без названия.jpg 23.12.2013
  • Проводник использует класс WC_LISTBOX, а не WC_LISTVIEW. syles включает LBS_OWNERDRAWFIXED и LBS_MULTICOLUMN 23.12.2013
  • так проблема не решается? 23.12.2013
  • Я не знаю. Если вы действительно хотите имитировать поведение проводника, вы должны использовать WC_LISTBOX с LBS_OWNERDRAWFIXED и LBS_MULTICOLUMN. 23.12.2013
  • Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]