Lal Miah Ответов: 3

ListView не получает код CDDS_ITEMPREPAINT


Вот код, который я использовал, но я не получаю правильного сообщения

//creating the list view
hListView=CreateWindowEx(0,L"SysListView32",NULL,
				WS_CHILD|WS_VISIBLE|LVS_REPORT|WS_BORDER|WS_HSCROLL|WS_VSCROLL|WS_TABSTOP|WS_GROUP|LVS_AUTOARRANGE|LVS_ALIGNLEFT,10,50,rc.right-10,rc.bottom-50,hWnd,(HMENU)DISP_LISTVIEW,(HINSTANCE)GetWindowLong(hWnd,GWL_HINSTANCE),NULL);
 
//for extended style
int estyle=LVS_EX_TRACKSELECT | LVS_EX_ONECLICKACTIVATE | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES| LVS_EX_HEADERDRAGDROP;
ListView_SetExtendedListViewStyle(hListView,estyle);
 
//in the WndProc function

case WM_NOTIFY:
	NMHDR *nmhdr;
	nmhdr=(NMHDR*)lParam;
	switch(wParam)
	{
	case DISP_LISTVIEW:
	if(nmhdr->code==NM_CUSTOMDRAW)
	{
		LONG l=(LONG)TableDraw(lParam);
		SetWindowLong(hWnd, DWL_MSGRESULT, l);
                return TRUE;
	}
	else
        ...
     	...
 
//function to color row. copied from code project
LRESULT TableDraw (LPARAM lParam)
{
	int iRow;
	LPNMLVCUSTOMDRAW pListDraw = (LPNMLVCUSTOMDRAW)lParam;
	switch(pListDraw->nmcd.dwDrawStage)
	{
	case CDDS_ITEMPREPAINT:
//it never reach here
		iRow = (int)pListDraw->nmcd.dwItemSpec;
		if(iRow%2 == 0)
		{
			pListDraw->clrTextBk = RGB(202, 221,250);
			return CDRF_NEWFONT;
		}
	case CDDS_PREPAINT:
		return (CDRF_NOTIFYPOSTPAINT | CDRF_NOTIFYITEMDRAW);
	default:
		break;
	}
	return CDRF_DODEFAULT;
}


Приложение представляет собой приложение с Многодокументным интерфейсом. а HWND, переданный в SetWindow long, является дочерним окном приложения. Код ошибки, который я получаю от функции GetLastError, равен 1413

Не могли бы вы дать мне знать, что я могу сделать? где я делаю неправильно?

3 Ответов

Рейтинг:
2

Richard MacCutchan

Вы должны проверить на наличие NM_CUSTOMDRAW каждый раз, когда вы получаете WM_NOTIFY сообщение. Для чего нужен этот тест DISP_LISTVIEW используется для?


[no name]

DISP_LISTVIEW-это идентификатор элемента управления ListView, вот как я знаю, что запрошенный элемент управления ListView. И я использую NM_CUSTOMDRAW, но я не получаю сообщение. вместо этого я получаю ошибку 1413

Richard MacCutchan

Где вы получаете ошибку 1413?

Richard MacCutchan

Кроме того, взгляните на комментарии здесь со ссылкой на содержание wParam ценности.

Рейтинг:
1

Member 12136623

У меня была та же проблема и я решил ее, избегая вызова SetWindowLong и возвращая непосредственно результат процедуры:

LONG l=(LONG)TableDraw(lParam);
SetWindowLong(hWnd, DWL_MSGRESULT, l);
return TRUE;


Теперь быть
return (LRESULT )TableDraw (lParam);                


Я надеюсь, что это может помочь


Stefan_Lang

Вы используете несовместимые типы в обоих примерах: первый присваивает 64-битный указатель 32-битной длине, а второй заменяет истинное возвращаемое значение 64-битным указателем.

Рейтинг:
0

Stefan_Lang

Эта линия:

LONG l=(LONG)TableDraw(lParam);
сохраняет 64-битное значение указателя в 32-битную интегральную переменную! Вы, вероятно, теряете информацию.

Подсказка: никогда не использовать C-стиля бросает! Они имеют тенденцию скрывать драматические ошибки от вашего взгляда. Без typecast компилятор выдал бы сообщение об ошибке и сказал бы вам, что не так.

Эмпирическое правило: если компилятор говорит вам что-то о типах, которые не подходят, то
- либо один из типов выбран неудачно (исправление: изменение типа переменной)
- или оператор не использует правильные переменные (исправление: найдите правильную переменную для использования)
- или утверждение не имеет смысла и на самом деле содержит семантическую ошибку, которую необходимо исправить. (исправление: все, что требуется для исправления семантики)

В любом случае, приведение типа просто закрывает компилятор, но это не решит фактическую проблему!


P.S.: функция SetWindowLong() была заменена функцией SetWindowLongPtr (), чтобы сделать ее независимой от целевой платформы (32 или 64 бит).

P. P. S.: Если вы не можете избежать приведений типов (например, с помощью API Windows и типов LPARAM/WPARAM/LRESULT), вам все равно следует предпочесть static_cast или reinterpret_cast над C-стилем. Тогда вы получаете по крайней мере некоторые проверки и соответствующие сообщения об ошибках.