M@gelearn Ответов: 1

Кто-нибудь может помочь мне с представлением списка winapi?


После создания представления списка.. элементы есть, я могу выбрать их, но у них есть прозрачная кисть или что-то в этом роде.. и я вижу только выбор этого элемента, но самого элемента там нет..
Кто-нибудь знает, почему.. ?


У меня есть около 8 часов, я смотрю вокруг этого кода и не могу понять, почему мой текст не появляется..
Может быть, я смогу показать вам функцию заголовка и класс окна, которые я использую в своем проекте.

These are resource.h, main.cpp и ресурс.rc. Я взял код, который ссылается на listview ..извините, мой код имеет 16.000+ строк, не могу скопировать все это
// constants
#define ID_LISTVIEW         1000
#define NUM_ITEMS           30
#define NUM_COLUMNS         2
#define MAX_ITEMLEN         64
#define MAX_SYMBOLS         16
#define MAX_DESCRIPTION     64

// stringtable defines
#define IDS_SYMBOLS         1
#define IDS_DESCRIPTION     2

//Functions from resources.cpp
HWND CreateListView(HWND hWndParent);
LRESULT NotifyHandler(HWND, UINT, WPARAM, LPARAM);

// structures
typedef struct tagABRINFO
{
    char szSymbol[MAX_SYMBOLS];
    char szDescription[MAX_DESCRIPTION];
} ABRINFO;
====================================================|

#define _WIN32_IE 0x300

#include <windows.h>
#include <commctrl.h>
#include "resources.h"
#include <string.h>
#include <mmsystem.h>
#include <cstdio>

#define case ID_ABBREV 50

ABRINFO argsAbrInfo[] =
{
	{"LoD", "Lord of Destruction"},
	{"PvP", "Player versus Player"},
	{"XP", "Experience"},
	{"Javazon", "Javelin build Amazon"},
	{"HOTO", "Hart of the Oak Runeword"},
	{"Assa", "Assassin Character"},
	{"Andy", "Final Boss Act 1 Andariel"},
	{"D2", "Diablo 2 Classic"},
	{"PVM", "Player versus Monsters"},
	{"HP/MP", "Healing Potion/Mana Potion"}
};
HWND CreateListView(HWND hWndParent)
{
	HWND hWndList;
	int index;
	LV_COLUMN lvC;
	char szText[MAX_PATH];
	LV_ITEM lvI;
	int iSubItem;

	InitCommonControls();

	hWndList = CreateWindowEx(0L, WC_LISTVIEW, NULL, WS_VISIBLE | WS_CHILD | WS_BORDER |
                           LVS_REPORT | LVS_SINGLESEL, 0, 32, 795, 448,
                            hWndParent, (HMENU)ID_LISTVIEW, hInst, NULL);

    ListView_SetExtendedListViewStyle(hWndList, LVS_EX_FULLROWSELECT | LVM_ENSUREVISIBLE | LVM_SETOUTLINECOLOR);

	if (hWndList == NULL)
		return NULL;

	lvC.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
	lvC.fmt = LVCFMT_LEFT;
	lvC.cx = 0x100;
	lvC.pszText = szText;

	for (index = 0; index <= NUM_COLUMNS; index++)
	{
		lvC.iSubItem = index;
		LoadString(hInst, IDS_SYMBOLS + index, szText, sizeof(szText));
		if (ListView_InsertColumn(hWndList, index, &lvC) == -1)
			return NULL;
	}

	lvI.mask = LVIF_TEXT | LVIF_PARAM | LVIF_STATE;
	lvI.state = 0;
	lvI.stateMask = 0;

	for (index = 0; index < NUM_ITEMS; index++)
	{
		lvI.iItem = index;
		lvI.iSubItem = 0;
		lvI.pszText = LPSTR_TEXTCALLBACK;
		lvI.cchTextMax = MAX_ITEMLEN;
		lvI.lParam = (LPARAM)&argsAbrInfo[index];

		if (ListView_InsertItem(hWndList, &lvI) == -1)
			return NULL;

		for (iSubItem = 1; iSubItem < NUM_COLUMNS; iSubItem++)
		{
			ListView_SetItemText(hWndList, index, iSubItem, LPSTR_TEXTCALLBACK);
		}
	}
	return (hWndList);
}
LRESULT NotifyHandler(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	LV_DISPINFO *pLvdi = (LV_DISPINFO *)lParam;
	ABRINFO *pAbr = (ABRINFO *)(pLvdi->item.lParam);

	if (wParam != ID_LISTVIEW)
		return 0L;

	switch(pLvdi->hdr.code)
	{
		case LVN_GETDISPINFO:
			switch (pLvdi->item.iSubItem)
			{
				case 0:
					pLvdi->item.pszText = pAbr->szSymbol;
					break;
				case 1:
					pLvdi->item.pszText = pAbr->szDescription;
					break;
				default:
					break;
			}
			break;
		default:
			break;
	}
	return 0L;
}
//Main Vindow
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR args, int nCmdShow)
{
    InitCommonControls();

    WNDCLASSW wc = {0};

    wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
    wc.hIcon         = (HICON)LoadImage(GetModuleHandle(NULL),
                        MAKEINTRESOURCE(IDI_MAIN), IMAGE_ICON, 32, 32, 0);
    wc.hInstance     = hInst;
    wc.lpfnWndProc   = MainWndProc;
    wc.lpszClassName = L"myMainClass";
    wc.style         = 0;
    wc.lpszMenuName  = MAKEINTRESOURCEW(IDR_MENU);

    if(!RegisterClassW(&wc))
        return -1;

    registerCloseClass(hInst);
    registerVersionClass(hInst);

    hMainWindow = CreateWindowW(L"myMainClass", L"My app",
                                WS_SYSMENU | WS_MINIMIZEBOX | WS_CAPTION,
                                300, 100, 800, 550, NULL, NULL, NULL, NULL);

    ShowWindow(hMainWindow, nCmdShow);
    UpdateWindow(hMainWindow);

    MSG msg = {0};

    while(GetMessage(&msg, NULL, 0, 0) > 0)
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return 0;
}
//Main Loop
LRESULT CALLBACK MainWndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
    static HWND hWndListView;
    switch(msg)
    {
      case WM_NOTIFY:
        {
            return (NotifyHandler(hWnd, msg, wp, lp));
            break;
        }
      case WM_COMMAND:
        switch(wp)
        {
           case ID_ABBREV:
                 {
                      hWndListView = CreateListView(hWnd);
                      PlaySound(MAKEINTRESOURCE(IDW_CLICK), NULL, SND_RESOURCE | SND_ASYNC);
                      return DefWindowProcW(hWnd, msg, wp, lp);
                  }
        }
      case WM_DESTROY:
        {
            PostQuitMessage(0);
        }
        break;
    default:
        return DefWindowProcW(hWnd, msg, wp, lp);
    }
    return 0;
}
====================================================|

/////////////////////////////////////////////////////////////////////////////
//
// String Table
//

STRINGTABLE DISCARDABLE
BEGIN
    IDS_SYMBOLS             "Symbols"
    IDS_DESCRIPTION         "Description"
END


Что я уже пробовал:

Не знаю, что еще можно предложить.. Я написал этот код с другим классом WND, и он работает..
Класс Ex работает, а класс W-нет. Кто-нибудь может помочь мне понять, почему Ex class может видеть элементы в списке, а W не появляется ?..

Приведенный ниже пример почти идентичен тому, который показан в MSDN..

Rick York

Каким должно быть представление списка? Это всплывающее окно? Часть диалога? Новый компонент в главном окне?

M@gelearn

Представление списка должно появляться, когда пользователь нажимает на пункт меню. Это новый компонент в окне. Код, который я показываю, - это код из MSDN, но я вырезал только те части , которые мне действительно не нужны в моем проекте , так что.. изображения, другие столбцы, значки стиля представления маленькие значки и т. д. и я сначала попробовал код в проекте MSDN и работал, код показал то, что я написал, чтобы показать, но когда я транспонировал код в моем проекте, все было хорошо olumns head columns name, но то, что было в списке под всем, невидимо.. Я могу выбрать RAW, но текст не появляется..

1 Ответов

Рейтинг:
7

Yofoo

"список" представляет собой систему контроля, хотя использование CreateWindowExA, но окно Юникод
в CreateListView вы можете использовать тест кода:

bUnicode = IsWindowUnicode(hWndList);

поэтому в fun NotifyHandler вам нужен case the LVN_GETDISPINFOW
пример:
case LVN_GETDISPINFOW:
    pLvdi->item.pszText = (CHAR *)L"LVN_GETDISPINFOW";
    break;


M@gelearn

На самом деле у меня есть этот случай в моем NotifyHandler.. и он не работает

Yofoo

я должен подтвердить, что код хорошо работает на моем компьютере(win7 x32)
найденная форма LVN_GETDISPINFOW отлаживает приложение, вы можете добавить код трассировки в NotifyHandler
пример:

uCode = pLvdi->hdr.code;
ATLTRACE("NotifyHandler: %d\r\n", (int)uCode);

my pc show: NotifyHandler: -177
-177 просто LVN_GETDISPINFOW

кроме того в CreateWindowEx вы можете добавить стиль LVSOWNERDATA
LVN_GETDISPINFO нужен виртуальный список-просмотр,
LPSTR_TEXTCALLBACK причина LVN_GETDISPINFO может отличаться в ОС

M@gelearn

Имя события проблемы: APPCRASH
Название Приложения: MyApp.exe
Версия Приложения: 0.0.0.0
Отметка Времени Приложения: 00050000
Имя модуля неисправности: COMCTL32.DLL
Версия Модуля Неисправности: 5.82.7601.18837
Отметка времени модуля неисправности: 553a83e2
Код исключения: c0000005
Смещение исключения: 0000c7d1
Версия ОС: 6.1.7601.2.1.0.768.3
Код языка: 1033
Дополнительные сведения 1: 0a9e
Дополнительные сведения 2: 0a9e372d3b4ad19135b953a78882e789
Дополнительные сведения 3: 0a9e
Дополнительные сведения 4: 0a9e372d3b4ad19135b953a78882e789

M@gelearn

когда я использую LVS_OWNERDATA

M@gelearn

Мой компьютер (win 7 x32)

M@gelearn

Хммм.. Я просто сразу что-то увидел в вашем сообщении LVN_GETDISPINFOW, я использую только LVN_GETDISPINFO, поэтому сразу добавляю W... теперь отображается список, но я вижу только знаки или что-то вроде китайского языка..

Yofoo

LVN_GETDISPINFOW нужен Unicode, если прямое использование символов asc вызывает недопустимое, например китайский язык, также возможно исключение причины
вы можете использовать этот код для проверки:
pLvdi->item.pszText = (CHAR *)L"LVN_GETDISPINFOW";

Юникод конвертировать можно использовать: не менее multibytetowidechar

M@gelearn

и я добавляю LVS_OWNERDATA и сразу же касаюсь пункта меню, который показывает listview the App. crush с ошибкой, которая относится к comctrl.dll

M@gelearn

Да, я использовал pLvdi->item.pszText = (CHAR *)L"LVN_GETDISPINFOW"; и показывает Corecly..

M@gelearn

Хорошо я думаю что нашел решение
Я меняюсь на широкий символ в структуре typedef
// структуры
typedef struct tagABRINFO
{
Тип данных wchar szSymbol[MAX_SYMBOLS];
WCHAR szDescription[MAX_DESCRIPTION];
} АБРИНФО;
первым был чар

затем я добавил L к каждому элементу L"" в структуре
и измените эту строку также на
LV_DISPINFOW *pLvdi = (LV_DISPINFOW *)lParam;
первый был
LV_DISPINFO *pLvdi = (LV_DISPINFO *)lParam;

Опять тай.. :)

M@gelearn

работать отлично...

M@gelearn

О, теперь, когда это работает благодаря вашей помощи, я хочу задать еще один вопрос.

Итак, в моем списке просмотра у меня есть все , что мне нужно, но одна вещь, которую я упускаю, я не знаю, как сделать размер каждого столбца, размер которого установлен рано, но вступает в силу для всех столбцов, которые у меня есть ... и как я могу установить had raw, как первая строка, вторая строка, чтобы иметь номер в моем списке..
Спасибо..