본문 바로가기

Windows/Windows API

리스트 박스 아이템 찾기 (SendDlgItemMessage, LB_FINDSTRING, LB_FINDSTRINGEXACT)

#include <windows.h>
#include "resource.h"

BOOL CALLBACK MainDlgProc(HWND hDlg,UINT iMessage,WPARAM wParam,LPARAM lParam);
HINSTANCE g_hInst;
HWND hDlgMain;

int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance
         ,LPSTR lpszCmdParam,int nCmdShow)
{
    g_hInst=hInstance;

    DialogBox(g_hInst, MAKEINTRESOURCE(IDD_DIALOG1), HWND_DESKTOP, MainDlgProc);

    return 0;
}

char Items[][15]={"abacus","abadon","able","abort","about","above","absolute",
    "acacia","accent","accept","access","accident","account","ace","achieve",
    "acid","acquire","across","act","active","actual","ada"};
BOOL CALLBACK MainDlgProc(HWND hDlg,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
    int i;
    char str[128];
    int idx;
    switch(iMessage)
    {
    case WM_INITDIALOG:
        hDlgMain = hDlg;
        // Dialog 에 data넣고
        for (i=0;i<sizeof(Items)/sizeof(Items[0]);i++)
            SendDlgItemMessage(hDlg,IDC_LIST1,LB_ADDSTRING,0,(LPARAM)Items[i]);
        return TRUE;
    case WM_COMMAND:
        // edit box 내용 가져오고
        GetWindowText(GetDlgItem(hDlg,IDC_EDIT1),str,128);
        // listbox의 index를 정의하고
        idx=SendDlgItemMessage(hDlg,IDC_LIST1,LB_GETCURSEL,0,0);
        switch (LOWORD(wParam))
        {
        case IDOK:
        case IDCANCEL:
            EndDialog(hDlgMain,0);
            return TRUE;
        case IDC_BTNFIND:    // 찾기 버튼 선택하면
            // 해당 아이템을 찾고나서 index를 반환
            idx=SendDlgItemMessage(hDlg,IDC_LIST1,LB_FINDSTRING,idx,
                (LPARAM)str);

            // 받은 인덱스를 선택한다.
            SendDlgItemMessage(hDlg,IDC_LIST1,LB_SETCURSEL,idx,0);
            return TRUE;
        case IDC_BTNFINDEXACT:
            idx=SendDlgItemMessage(hDlg,IDC_LIST1,LB_FINDSTRINGEXACT,idx,
                (LPARAM)str);
            SendDlgItemMessage(hDlg,IDC_LIST1,LB_SETCURSEL,idx,0);
            return TRUE;
        case IDC_BTNSEL:
            idx=SendDlgItemMessage(hDlg,IDC_LIST1,LB_SELECTSTRING,idx,
                (LPARAM)str);
            return TRUE;
        }
        return FALSE;
    }
    return FALSE;
}