none
关于重绘CTreeCtrl的问题 RRS feed

  • 问题

  •  重绘CTreeCtrl重新齐OnPaint函数如下

    void MyTreeCtrl::OnPaint()
    {
    	CPaintDC dc(this); 
    
    	CDC memDC;
    	memDC.CreateCompatibleDC(&dc);
    
    	CRect  rcClient;
    
    	GetClientRect(&rcClient);
    
    	CBitmap bitmap;
    	bitmap.CreateCompatibleBitmap(&dc, rcClient.Width(), rcClient.Height());
    	memDC.SelectObject(&bitmap);
    
    	CRgn rgn;
    	rgn.CreateRectRgnIndirect(&rcClient);
    	memDC.SelectClipRgn(&rgn);
    	rgn.DeleteObject();
    
    	CWnd::DefWindowProc(WM_PAINT, (WPARAM)memDC.m_hDC, 0);
    
    	CDC maskDC;
    	maskDC.CreateCompatibleDC(&dc);
    	CBitmap maskBitmap;
    
    	maskBitmap.CreateBitmap(rcClient.Width(), rcClient.Height(), 1, 1, NULL);
    	maskDC.SelectObject(&maskBitmap);
    	memDC.SetBkColor(::GetSysColor(COLOR_WINDOW));
    	maskDC.BitBlt(0, 0, rcClient.Width(), rcClient.Height(), &memDC, rcClient.left, rcClient.top, SRCCOPY);
    
    	//memDC.SetBkColor(xmSkinConfig::GetColorFeedBk());
    	memDC.SetBkColor(RGB(0, 0, 0));
    	memDC.SetTextColor(RGB(255, 255, 255));
    
    	memDC.BitBlt(rcClient.left, rcClient.top, rcClient.Width(), rcClient.Height(), &maskDC, rcClient.left, rcClient.top, SRCAND);
    
    	dc.FillRect(rcClient, &CBrush(RGB(255, 255, 255));
    	
    	dc.BitBlt(rcClient.left, rcClient.top, rcClient.Width(), rcClient.Height(), &maskDC, rcClient.left, rcClient.top, SRCAND);
    
    	dc.BitBlt(rcClient.left, rcClient.top, rcClient.Width(), rcClient.Height(), &memDC, rcClient.left, rcClient.top, SRCPAINT);
    }

    这样是白底黑字是OK的。

    但是通过

    dc.FillRect(rcClient, &CBrush(RGB(0, 0, 0));

    设置为黑色底色,无论怎么设置字体颜色文字都是看不清的

    我怀疑是SRCAND和SRCPAINT参数导致的,但是一直没有调试正确,请问这是哪儿出了问题呢?

    2019年7月1日 11:35

答案

  • 你好,

    经过测试,可以通过更改下面这段代码实现你的需求。

    	memDC.BitBlt(rcClient.left, 
    		rcClient.top, 
    		rcClient.Width(), 
    		rcClient.Height(), 
    		&maskDC, 
    		rcClient.left, 
    		rcClient.top, 
    		SRCERASE);

    在使用这些参数时需要注意当你目标颜色更变时,相应的计算方式也需要更改。

    Best Regards,

    Suarez Zhou


    2019年7月2日 8:38

全部回复

  • 你好,

    感谢你在MSDN论坛发帖。

    能方便告知一下代码想实现的功能吗?因为有多次BitBlt()函数的调用,功能意义不明。或与可以尝试另外一种方式完成你的需求。而且这段代码似乎针对的就是白底黑字而写的,因为如你所言,SRCAND和SRCPAINT这些参数代表着目标和源DC间的运算方式,最后想实现黑白混合得白和得黑所需要的运算方式肯定是不同的。

    Best Regards,

    Suarez ZHou




    2019年7月2日 6:29
  • 你好,

    经过测试,可以通过更改下面这段代码实现你的需求。

    	memDC.BitBlt(rcClient.left, 
    		rcClient.top, 
    		rcClient.Width(), 
    		rcClient.Height(), 
    		&maskDC, 
    		rcClient.left, 
    		rcClient.top, 
    		SRCERASE);

    在使用这些参数时需要注意当你目标颜色更变时,相应的计算方式也需要更改。

    Best Regards,

    Suarez Zhou


    2019年7月2日 8:38
  • 你好 我目的是想设置Tree任意字体颜色和背景颜色  有什么比较方便的解决办法吗
    2019年7月3日 1:53
  • 你好,

    很抱歉没有及时看到这条信息。这个帖子已经被标记解决了,你需要重新新开一个帖询问你的问题。这样有助于其他有相同问题的人更快地找到答案。

    Best Regards,

    Suarez Zhou




    2019年7月5日 1:41