Win32窗口列表控件的被动消息响应

1、手动敲代码,将课堂上的操作流程敲一遍;
2、鼠标右键点击列表控件中的项,弹出提示框,提示当前右键点击的是第几行;

#define _CRT_SECURE_NO_WARNINGS
#include <Windows.h>
#include <tchar.h>
#include <CommCtrl.h>
#include <windowsx.h>
static TCHAR szWindowClassName[] = _T("WindowClass");
static TCHAR szTitle[] = _T("Title");
HWND hListView_1 = nullptr;    UINT IDC_LIST_1 = 200;
HWND hEdit_1 = nullptr; UINT IDC_Edit_1 = 300;
HWND hButtonControl = nullptr; UINT IDC_BUTTON_1 = 400;
LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg,WPARAM wParam,LPARAM lParam)
{
    switch (uMsg)
    {
    case WM_CREATE:
    {
        hButtonControl = CreateWindow(WC_BUTTON,
            _T("实现点击按钮就插入一行"),
            WS_CHILD | WS_VISIBLE | WS_BORDER | BS_PUSHBUTTON,
            5, 320,
            200, 30,
            hWnd,
            (HMENU)IDC_BUTTON_1,
            NULL, NULL
        );
        hEdit_1 = CreateWindow(WC_EDIT, _T(""), WS_CHILD | WS_VISIBLE | WS_BORDER, 400, 5,
            300, 300, hWnd, (HMENU)IDC_Edit_1, NULL, NULL);
        
        hListView_1 = CreateWindow(WC_LISTVIEW, (LPTSTR)_T(""), WS_CHILD | WS_VISIBLE | WS_BORDER | LVS_REPORT | LVS_SHOWSELALWAYS, 10, 50, 300, 200, hWnd, (HMENU)IDC_LIST_1, NULL, NULL);

        ListView_SetExtendedListViewStyle(hListView_1, LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT |
            LVS_EX_HEADERDRAGDROP | LVS_EX_GRIDLINES | LVS_EX_AUTOCHECKSELECT | LVS_EX_AUTOSIZECOLUMNS);
        LVCOLUMN colInfo = { 0 };
        colInfo.mask |= LVCF_WIDTH | LVCF_TEXT | LVCF_FMT;
        colInfo.cx = 100;
        colInfo.pszText = (LPTSTR)_T("第0列");
        colInfo.fmt |= LVCFMT_RIGHT;
        //SendMessage(hListCtrl, LVM_INSERTCOLUMN, 0, (LPARAM)&colInfo);
        ListView_InsertColumn(hListView_1, 0, &colInfo);

        LVCOLUMN colInfo_2 = { 0 };
        colInfo_2.mask |= LVCF_WIDTH | LVCF_TEXT | LVCF_FMT;
        colInfo_2.cx = 100;
        colInfo_2.pszText = (LPTSTR)_T("第1列");
        colInfo.fmt |= LVCFMT_RIGHT;
        SendMessage(hListView_1, LVM_INSERTCOLUMN, 1, (LPARAM)&colInfo_2);

        LV_ITEM row_item = { 0 };
        row_item.mask |= LVIF_TEXT;
        row_item.pszText = (LPTSTR)_T("aaaaaa");

        ListView_InsertItem(hListView_1, &row_item);
        ListView_SetItemText(hListView_1, 0, 1, (LPTSTR)_T("xxxxxx"));
    }
        break;
    case WM_NOTIFY:
    {
        NMHDR* pNmHdr = (NMHDR*)lParam;
        if (pNmHdr->idFrom == IDC_LIST_1)
        {
            if (pNmHdr->code == NM_CLICK)
            {
                LPNMITEMACTIVATE lpnmitem = (LPNMITEMACTIVATE)lParam;

                TCHAR szText[128] = { 0 };
                _stprintf(szText, _T("点击的是 %d 行,%d 列!"), lpnmitem->iItem, lpnmitem->iSubItem);
                MessageBox(hWnd, szText, _T("Tip"), MB_OK);
            }
        }
        if (pNmHdr->code == HDN_ENDTRACK)
        {
            HWND hListHeader = ListView_GetHeader(hListView_1);
            if (hListHeader == pNmHdr->hwndFrom)
            {
                int nColWidth = ListView_GetColumnWidth(hListView_1, 1);

                TCHAR szText[128] = { 0 };
                _stprintf(szText, _T("第1列的宽度是:%d"), nColWidth);
                MessageBox(hWnd, szText, _T("Tip"), MB_OK);
            }
        }

    }
        break;
    case WM_COMMAND:
    {
        UINT nControlID = LOWORD(wParam);
        UINT nNotificationCode = HIWORD(wParam);
        if (nNotificationCode == BN_CLICKED)
        {
            if (nControlID == IDC_BUTTON_1)
            {

                //实现点击按钮把界面编辑框的文本插入到列表中
                TCHAR szText[MAX_PATH] = { 0 };
                Edit_GetText(GetDlgItem(hWnd, IDC_Edit_1), szText, MAX_PATH);

                //实现点击按钮就插入一行
                int iTotalRow = ListView_GetItemCount(GetDlgItem(hWnd, IDC_LIST_1));    //获取当前列表中有多少行
                LV_ITEM row_item = { 0 };
                row_item.mask |= LVIF_TEXT;
                row_item.pszText = szText;
                row_item.iItem = iTotalRow;
                int iRow = ListView_InsertItem(GetDlgItem(hWnd, IDC_LIST_1), &row_item);
                ListView_SetItemText(GetDlgItem(hWnd, IDC_LIST_1), iRow, 1, szText);
            }
        }
    }
        break;

    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, uMsg, wParam,lParam);
        break;
    }
    return 0;
}
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine, INT nCmdShow)
{
    WNDCLASSEX wcex = { 0 };
    wcex.cbSize = sizeof(WNDCLASSEX);
    wcex.lpfnWndProc = WindowProc;
    wcex.lpszClassName = szWindowClassName;
    if (!RegisterClassEx(&wcex)) return 0;
    HWND hWnd = CreateWindow(szWindowClassName, szTitle,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,800,600,NULL,NULL,hInstance,NULL);
    if (!hWnd) return 0;
    ShowWindow(hWnd, nCmdShow);
    MSG msg = { 0 };
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return (int)msg.wParam;
}

 

posted on 2021-01-29 21:20  SakuraQAQ  阅读(173)  评论(0)    收藏  举报

导航