Nick Dong
Nick Dong

Reputation: 3736

how to select a line in listview using win32API

I am programing using C and WIN32API. I want to create a list and then select a line with single click. I have programmed follow the link. My program can get click message, but the line did not get focus. I am using WM_NOTIFY to get message, and I define a function to deploy more operation. I dont want to use MFC. What should I do next?

ENV:

WIN7 VC6.0 C WINAPI

CODES:

int SearchMember_OnNotify(HWND hwnd, int id, LPNMHDR lParam);

|

HANDLE_MSG(hWnd, WM_NOTIFY, SearchMember_OnNotify);

|

int SearchMember_OnNotify(HWND hwnd, int id, LPNMHDR lParam)
{
    switch(id)
    {
        case IDC_LIST_MEMBER: 
        {

            if(lParam->code == NM_DBLCLK)
            {
                MessageBox(hwnd,TEXT("CHANGE"),TEXT(""),MB_OK);

                char Text[255]={0};  
                char Temp[255]={0};
                char Temp1[255]={0};
                int iSlected=0;
                int j=0;

                iSlected=SendMessage(hList,LVM_GETNEXTITEM,-1,LVNI_FOCUSED);

                if(iSlected==-1)
                {
                    MessageBox(hwnd,"No Items in ListView","Error",MB_OK|MB_ICONINFORMATION);
                    break;
                }

                memset(&LvItem,0,sizeof(LvItem));
                LvItem.mask=LVIF_TEXT;
                LvItem.iSubItem=5;
                LvItem.pszText=Text;
                LvItem.cchTextMax=256;
                LvItem.iItem=iSlected;

                SendMessage(hList,LVM_GETITEMTEXT, iSlected, (LPARAM)&LvItem);

                sprintf(Temp1,Text);

                for(j=1;j<=5;j++)
                {
                    LvItem.iSubItem=j;
                    SendMessage(hList,LVM_GETITEMTEXT, iSlected, (LPARAM)&LvItem);
                    sprintf(Temp," %s",Text);
                    lstrcat(Temp1,Temp);
                }

                MessageBox(hwnd,Temp1,"test",MB_OK);

            }

            if(lParam->code == NM_CLICK)
            {
                iSelect=SendMessage(hList,LVM_GETNEXTITEM,-1,LVNI_FOCUSED);

                if(iSelect==-1)
                {                      
                    break;
                }
                index=iSelect;
                flag=1;

                MessageBox(hwnd,TEXT("CLICK"),TEXT("CLICKONCE"),MB_OK);
            }


        }
        break;

        default:
        break;
    }
    return id;
}

EXPECTED

enter image description here

The line should get focus after click.

Edit

I have used ListView_SetItemState. But it not works.

        if(lParam->code == NM_CLICK)
        {

        //  iSelect=SendMessage(hList,LVM_GETNEXTITEM,-1,LVNI_FOCUSED);
            iSelect=ListView_GetNextItem(hList,-1,LVNI_FOCUSED);

            if(iSelect==-1)
            {                      
                break;
            }

            ListView_SetItemState(hList,iSelect,LVIS_SELECTED ,LVIS_SELECTED);
            ListView_SetItemState(hList,iSelect,LVIS_FOCUSED ,LVIS_FOCUSED);
            flag=1;
            char a[] = "abc";
            //wsprintf(a,"%s",itoa(iSelect);
            itoa(iSelect, a, 10);

            MessageBox(hwnd,TEXT("CLICK"),TEXT(a),MB_OK);
        }

Upvotes: 1

Views: 3612

Answers (1)

rrirower
rrirower

Reputation: 4590

You can change the state of a list view using ListView_SetItemState. It will update the state flags for the item.

Upvotes: 5

Related Questions