Listview C ++ win32 API - пример не работает - PullRequest
0 голосов
/ 02 мая 2020

Я пытаюсь создать просмотр списка в C ++ с API-интерфейсом win32, однако код, предоставленный на mdsn, выдает ошибку.

HWND CreateListView (HWND hwndParent) 
{
    INITCOMMONCONTROLSEX icex;           // Structure for control initialization.
    icex.dwICC = ICC_LISTVIEW_CLASSES;
    InitCommonControlsEx(&icex);

    RECT rcClient;                       // The parent window's client area.

    GetClientRect (hwndParent, &rcClient); 

    // Create the list-view window in report view with label editing enabled.
    HWND hWndListView = CreateWindow(WC_LISTVIEW, //ERROR red line under create window
                                     L"",
                                     WS_CHILD | LVS_REPORT | LVS_EDITLABELS,
                                     0, 0,
                                     rcClient.right - rcClient.left,
                                     rcClient.bottom - rcClient.top,
                                     hwndParent,
                                     (HMENU)IDM_CODE_SAMPLES, //ERROR IDM CODE SAMPLES undefined
                                     g_hInst, //ERROR
                                     NULL); 

    return (hWndListView);
}

Этот пример не похож на mdsn, и я понятия не имею, почему это не работает. Я получаю IDM_CODE_SAMPLES Undefined и что-то не так с createwindow. Пожалуйста, помогите мне заставить это работать, это было бы действительно полезно.

Ответы [ 2 ]

1 голос
/ 02 мая 2020

IDM_CODE_SAMPLES - это идентификатор, который вы хотите присвоить вашему элементу управления. Вы можете либо определить символ для числового значения c, либо напрямую использовать числовое значение c (например, , выберите 100 ). Идентификатор полезен, если вы хотите сослаться на конкретный элемент управления, хотя его HWND одинаково полезен в качестве идентификатора.

g_hInst предположительно является глобальной переменной типа HMODULE, инициализированной из WinMain , Если вы не хотите использовать глобальную переменную, вы можете вызвать GetModuleHandle(nullptr) вместо нее, при условии, что вы компилируете .exe, а не .dll.

Вы получите много полезная информация при работе с Введение в программирование на Win32 на C ++ .

0 голосов
/ 04 мая 2020

Теперь я получаю сообщение об ошибке (1 неразрешенное внешнее устройство)

Мы можем найти из InitCommonControlsEx функция.

Гарантирует, что DLL общего управления (Comctl32.dll) загружается и регистрирует определенные c классы общего управления из DLL.

Add:

#include <commctrl.h>    
#pragma comment(lib,"Comctl32.lib")

Пример минимального кода:

#ifndef UNICODE
#define UNICODE
#endif 

#include <windows.h>
#include <commctrl.h>

#pragma comment(lib,"Comctl32.lib")

#define IDM_CODE_SAMPLES 101

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
HWND CreateListView(HWND hwndParent);

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, PWSTR pCmdLine, int nCmdShow)
{
    // Register the window class.
    const wchar_t CLASS_NAME[] = L"Sample Window Class";

    WNDCLASS wc = { };

    wc.lpfnWndProc = WindowProc;
    wc.hInstance = hInstance;
    wc.lpszClassName = CLASS_NAME;

    RegisterClass(&wc);

    // Create the window.

    HWND hwnd = CreateWindowEx(
        0,                              // Optional window styles.
        CLASS_NAME,                     // Window class
        L"Learn to Program Windows",    // Window text
        WS_OVERLAPPEDWINDOW,            // Window style

        // Size and position
        CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,

        NULL,       // Parent window    
        NULL,       // Menu
        hInstance,  // Instance handle
        NULL        // Additional application data
    );
    CreateListView(hwnd);
    if (hwnd == NULL)
    {
        return 0;
    }

    ShowWindow(hwnd, nCmdShow);

    // Run the message loop.

    MSG msg = { };
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return 0;
}

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;

    case WM_PAINT:
    {
        PAINTSTRUCT ps;
        HDC hdc = BeginPaint(hwnd, &ps);

        EndPaint(hwnd, &ps);
    }
    return 0;

    }
    return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

HWND CreateListView(HWND hwndParent)
{
    INITCOMMONCONTROLSEX icex;           // Structure for control initialization.
    icex.dwICC = ICC_LISTVIEW_CLASSES;
    InitCommonControlsEx(&icex);

    RECT rcClient;                       // The parent window's client area.

    GetClientRect(hwndParent, &rcClient);

    // Create the list-view window in report view with label editing enabled.    
    HWND hWndListView = CreateWindow(WC_LISTVIEW, //ERROR red line under create window
        L"",
        WS_CHILD | LVS_REPORT | LVS_EDITLABELS,
        0, 0,
        rcClient.right - rcClient.left,
        rcClient.bottom - rcClient.top,
        hwndParent,
        (HMENU)IDM_CODE_SAMPLES, //ERROR IDM CODE SAMPLES undefined
        GetModuleHandle(nullptr), //ERROR
        NULL);

    return (hWndListView);
}
...