क्लिस्टक्ट्रल एमएफसी सी++, व्युत्पन्न वर्ग


मैंने CListCtrl का एक व्युत्पन्न वर्ग बनाया है, लेकिन मुझे एक समस्या है..जब मैं एक पंक्ति पर क्लिक करता हूं तो पंक्ति नीली नहीं होती है..और मुझे समझ में नहीं आता कि क्यों..मेरी व्युत्पन्न कक्षा:

<pre>
#include "stdafx.h"
#include "Domino6.h"
#include "MyListCtrl.h"
#include "MyHeader.h"


// MyListCtrl

IMPLEMENT_DYNAMIC(MyListCtrl, CListCtrl)

MyListCtrl::MyListCtrl()
{
	//m_bList = false;
}

MyListCtrl::~MyListCtrl()
{
}


BEGIN_MESSAGE_MAP(MyListCtrl, CListCtrl)
	ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnNMCustomdraw)
END_MESSAGE_MAP()


void MyListCtrl::PreSubclassWindow()
{
	// TODO: Add your specialized code here and/or call the base class
	CHeaderCtrl* pHeader = NULL;
	pHeader = GetHeaderCtrl();
	int nWidth;


	if (m_bList == false)
		nWidth = GetColumnWidth(1);

	else
		nWidth = GetColumnWidth(0);
	
	if (pHeader != NULL)
	{
		//int nWidth = GetColumnWidth(1);
		
		//m_HeaderCtrl.m_nCol = m_nCol;
		VERIFY(m_HeaderCtrl.SubclassWindow(pHeader->m_hWnd)); // m_HeaderCtrl is the new wrapper object
	}
	CListCtrl::PreSubclassWindow();
}
// MyListCtrl message handlers


void MyListCtrl::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult)
{
	NMLVCUSTOMDRAW *pCD = (NMLVCUSTOMDRAW*)pNMHDR;
	// By default set the return value to do the default behavior.
	*pResult = CDRF_DODEFAULT;

	LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
	// TODO: Add your control notification handler code here
	*pResult = CDRF_DODEFAULT;

	int n_width = 0;

	if(m_bList == false)

	n_width = GetColumnWidth(1);

	else

	n_width = GetColumnWidth(0);


	int NumberOfColumns = m_HeaderCtrl.GetItemCount();

	m_HeaderCtrl.m_nwidth_  = GetColumnWidth(0);
	m_HeaderCtrl.m_nwidth1_ = GetColumnWidth(1);
	m_HeaderCtrl.m_nwidth1 = GetColumnWidth(2);
	m_HeaderCtrl.m_nwidth2 = GetColumnWidth(3);
	m_HeaderCtrl.m_nwidth3 = GetColumnWidth(4);
	m_HeaderCtrl.m_nwidth4 = GetColumnWidth(5);
	m_HeaderCtrl.m_nwidth5 = GetColumnWidth(6);

	//obtain row and column of item
	m_nRow = pCD->nmcd.dwItemSpec;
	m_nCol = pCD->iSubItem;

	//Remove standard highlighting of selected (sub)item.
	pCD->nmcd.uItemState = CDIS_DEFAULT;

	switch (pCD->nmcd.dwDrawStage)
	{
	case  CDDS_PREPAINT:  // First stage (for the whole control)
	{
		*pResult = CDRF_NOTIFYITEMDRAW;
	}
	break;

	case CDDS_ITEMPREPAINT:
	{
		*pResult = CDRF_NOTIFYSUBITEMDRAW;
	}
	break;

	case  CDDS_ITEMPREPAINT | CDDS_SUBITEM: // Stage three 
	{
		if (m_bList == true)
		{
			{
				CDC* pDC = CDC::FromHandle(pNMCD->hdc);

				CBrush brushBlue(RGB(255, 192, 203));// inner color blue.
				CBrush* pOldBrush = pDC->SelectObject(&brushBlue);

				// create and select a thick, black pen
				CPen penBlack;
				penBlack.CreatePen(PS_SOLID, 3, RGB(0, 0, 0));// red color with width 3
				CPen* pOldPen = pDC->SelectObject(&penBlack);

				for (int ij = 0; ij < 50; ij++)
				{
					CRect rect1(0, 24 + (17 * (ij)), n_width, 42 + (17 * (ij)));  //CRect(a,b,c,d) come b metto il valore d del rettangolo precedente, invece d = b+18; 
					pDC->Rectangle(rect1);

					if (ij < m_arrStr.GetSize())
					pDC->DrawText(m_arrStr[ij], CRect(rect1), DT_BOTTOM);
				}

				pDC->SelectObject(pOldBrush);
				pDC->SelectObject(pOldPen);
			}
			*pResult = CDRF_NOTIFYPOSTPAINT;
		}
		break;
	case CDDS_ITEMPOSTPAINT | CDDS_SUBITEM: // Stage four (called for each subitem of the focused item)
	{

	}
	break;

	default:// it wasn't a notification that was interesting to us.
	{
		*pResult = CDRF_DODEFAULT;
	}
	break;
	}
  }
}

मैंने क्या प्रयास किया है:

मैंने देखा कि यदि मैं किसी अन्य सूची का उपयोग करता हूं जो व्युत्पन्न नहीं है तो मुझे यह समस्या नहीं होती है..क्या आप मेरी मदद कर सकते हैं?

समाधान 1

यदि आप स्वयं किसी एक वस्तु को पेंट कर रहे हैं तो (मेरे नमूना कोड के अनुसार) आपको भी वापस लौटना होगा CDRF_NEWFONT प्रसंस्करण करते समय CDDS_ITEMPREPAINT | CDDS_SUBITEM. इसे Microsoft उदाहरण में भी दिखाया गया है कस्टम ड्रा का उपयोग करना – Win32 ऐप्स | माइक्रोसॉफ्ट लर्न[^].

コメント

タイトルとURLをコピーしました