2014-01-08 1 views
1

MFC 대화 상자에 CListCtrl이 있습니다. 내가해야 할 일은 사용자가 그 선택을 할 수 없도록 조건에 따라 몇 가지 항목을 없애는 것입니다. 지금은 색상을 변경했지만 적절한 해결책은 아닙니다. 내 코드는 다음과 같습니다.CListCtrl Customdraw 함수에서 행을 비활성화하거나 회색으로 표시합니다.

void CSomeDialog::OnCustomdrawElementList(NMHDR *pNMHDR, LRESULT *pResult) 
{ 

NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>(pNMHDR); 
*pResult = 0; 

if (CDDS_PREPAINT == pLVCD->nmcd.dwDrawStage) 
    { 
    *pResult = CDRF_NOTIFYITEMDRAW; 
    } 
else if (CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage) 
    { 

    COLORREF crText; 

    //Here I want to do disable based on some condition of the data related to the item// 
    if ((pLVCD->nmcd.dwItemSpec % 2) == 0) 
     crText = RGB(255,0,0); 
    else if ((pLVCD->nmcd.dwItemSpec % 2) == 1) 
     crText = RGB(0,255,0); 

    // Storing the color back 
    pLVCD->clrText = crText; 

    *pResult = CDRF_DODEFAULT; 
    } 
} 

행을 비활성화하는 방법에 대한 참조를 찾을 수 없습니다.

또 다른 문제는이 사용자 지정 그리기 기능에서 항목과 관련된 데이터를 가져 오는 방법을 결정한 후에도 마찬가지입니다. pLVCD-> nmcd.lItemlParam을 사용하여 GetItemData()를 호출 할 수 있습니다. 도와주세요.

답변

0

행을 그리거나 비활성화하는 것은 약간 다릅니다.

행을 비활성화하여 선택할 수 없게하려면 LVN_ITEMCHANGING을 사용하십시오. 상태가 선택되지 않은 상태에서 선택된 상태로 변경되는지 확인하십시오 (uNewState 및 uOldState와 LVIS_SELECTED의 변경 사항 비교). 이 항목을 선택하지 않으려면 WM_NOTIFY 메시지에 TRUE를 반환하면됩니다.

목록보기의 항목에 데이터를 연결하면 무료 lParam 필드를 쉽게 사용할 수 있습니다. 여기에 당신이 가지고있는 내부 구조를 가리킬 수있는 몇몇 사용자 데이터를 저장할 수 있습니다. 드로잉 루틴에서이 필드에 액세스 할 수도 있습니다.

+0

사실 나는 어떻게 든 사용자가 현재 항목에 대해 유효하지 않은 항목을 즉시 알게해야합니다. 그것을 위해 나는 줄을 회색으로해야합니다. 나는 색깔을 바꿀 수는 있지만, 그것이 군대를 선택하는 것을 막을 수는 없습니다. OK 버튼을 비활성화하거나 유효하지 않은 선택/경고 팝업을 내부적으로 처리하는 등의 대안은 바람직하지 않습니다. –

관련 문제