ListView_GetViewRect 函数是 Windows API 中用于检索列表视图控件的客户区域(client area)中,当前可见的部分的矩形的函数。该函数定义在 Commctrl.h 头文件中,用于操作 Windows 上的列表视图控件。

以下是 ListView_GetViewRect 函数的一般格式:
BOOL ListView_GetViewRect(
  HWND   hwnd,
  RECT * prc
);

  •  参数 hwnd 是列表视图控件的句柄。

  •  参数 prc 是一个指向 RECT 结构的指针,用于接收包含可见部分矩形坐标的信息。


函数返回一个布尔值,表示是否成功获取可见部分的矩形。

示例代码如下:
#include <windows.h>
#include <commctrl.h>

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
    switch (uMsg) {
        case WM_CREATE: {
            // 创建列表视图控件
            HWND hwndListView = CreateWindowEx(0, WC_LISTVIEW, L"", 
                WS_VISIBLE | WS_CHILD | LVS_REPORT, 10, 10, 300, 200,
                hwnd, NULL, GetModuleHandle(NULL), NULL);

            // 设置列表视图样式为详细信息视图
            ListView_SetView(hwndListView, LVS_REPORT);

            // 插入一些项以确保列表视图有内容
            LVITEM lvItem;
            lvItem.mask = LVIF_TEXT;
            lvItem.iItem = 0;
            lvItem.iSubItem = 0;
            lvItem.pszText = L"Item 1";
            ListView_InsertItem(hwndListView, &lvItem);

            lvItem.iItem = 1;
            lvItem.pszText = L"Item 2";
            ListView_InsertItem(hwndListView, &lvItem);

            lvItem.iItem = 2;
            lvItem.pszText = L"Item 3";
            ListView_InsertItem(hwndListView, &lvItem);
            
            break;
        }
        case WM_PAINT: {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hwnd, &ps);

            // 获取可见部分的矩形
            RECT rcView;
            if (ListView_GetViewRect(hwndListView, &rcView)) {
                // 在可见部分矩形上绘制一个红色矩形
                FillRect(hdc, &rcView, CreateSolidBrush(RGB(255, 0, 0)));
            }

            EndPaint(hwnd, &ps);
            break;
        }
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        default:
            return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }
    return 0;
}

int main() {
    // 初始化 Common Controls Library
    INITCOMMONCONTROLSEX icex;
    icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
    icex.dwICC = ICC_LISTVIEW_CLASSES;
    InitCommonControlsEx(&icex);

    // 注册窗口类
    WNDCLASS wc = { 0 };
    wc.lpfnWndProc = WindowProc;
    wc.hInstance = GetModuleHandle(NULL);
    wc.lpszClassName = L"ListViewExample";
    RegisterClass(&wc);

    // 创建主窗口
    HWND hwndMain = CreateWindowEx(0, L"ListViewExample", L"ListView_GetViewRect Example",
        WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 400, 300,
        NULL, NULL, GetModuleHandle(NULL), NULL);

    // 进入消息循环
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return 0;
}

这个示例创建了一个包含三个项的列表视图控件,并在窗口的 WM_PAINT 消息中获取可见部分的矩形,然后在该矩形上绘制一个红色的矩形。请注意,这只是一个简单的示例,实际应用中可能需要更多的初始化和消息处理。


转载请注明出处:http://www.zyzy.cn/article/detail/24737/Win32 API/Commctrl.h/ListView_GetViewRect