본문 바로가기

Windows/Windows API

리스트박스에서 이벤트 처리 (WM_VKEYTOITEM)

#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]={"Apple","Orange","Melon","Grape","Great", "Strawberry"};
BOOL CALLBACK MainDlgProc(HWND hDlg,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
    int i;
    switch(iMessage)
    {
    case WM_INITDIALOG:
        hDlgMain = hDlg;
        for (i=0;i<sizeof(Items)/sizeof(Items[0]);i++)
            SendDlgItemMessage(hDlg,IDC_LIST1,LB_ADDSTRING,0,(LPARAM)Items[i]);
        return TRUE;

    // 리스트 박스에서 키보드 입력을 처리하게 끔 한다.
    case WM_VKEYTOITEM:
        // D 가 들어오면은
        if (LOWORD(wParam) == 'D') {
            // 현재 선택된 인덱스 값을 가져오고
            i=SendDlgItemMessage(hDlg,IDC_LIST1,LB_GETCURSEL,0,0);
            if (i != LB_ERR) {
                // 지운다.
                SendDlgItemMessage(hDlg,IDC_LIST1,LB_DELETESTRING,i,0);

                // 그리고 리스트 박스에서 키보드 처리를 했다고 알린다.
                return (BOOL)-2;
            }
        }
        // D 가 아닐경우는 부모에게 메세지를 보낸다.
        return (BOOL)-1;
    case WM_COMMAND:
        switch (LOWORD(wParam))
        {
        case IDOK:
        case IDCANCEL:
            EndDialog(hDlgMain,0);
            return TRUE;
        }
        return FALSE;
    }
    return FALSE;
}