在NM_CUSTOMDRAW里怎么用双缓冲。 RT.在NM_CUSTOMDRAW里怎么用双缓冲。CTreeCtrl 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 网上使用双缓冲的例子程序很多的吧lz应该是想问怎么自绘CTreeCtrl控件吧codeproject上有很多的;http://www.codeproject.com/info/search.aspx?artkw=CTreeCtrl 在OnPaint里你会用么?一样的 OnPaint里跟NM_CUSTORMDRAW里不一样呀, NM_CUSTORMDRAW里有个什么绘画周期: 通知擦除所有->擦除项->开始绘->开始绘项->项绘制结束->所有项绘制结束,我已经按根据不同的时期处理,但是还是有问题。我先看看codeproject. 你说用SDK?我重绘listctrl就是按着类似OnPaint中的方法实现的 用的还是MFC。那可能是我nmcd.dwDrawStage和*pResult的值不对.应该是怎么的nmcd.dwDrawStage 感觉有一点点闪。 CDC *pDC = CDC::FromHandle(lpTVCD->nmcd.hdc); switch(lpTVCD->nmcd.dwDrawStage) { case CDDS_PREPAINT: { *pResult = CDRF_NOTIFYITEMDRAW ; } break; case CDDS_ITEMPREPAINT: { HTREEITEM htItem = (HTREEITEM)(lpTVCD->nmcd.dwItemSpec); DrawItemBk(pDC, htItem, nState); DrawItemText(pDC, htItem, nState); *pResult = CDRF_SKIPDEFAULT; } break; case CDDS_POSTPAINT: { *pResult = CDRF_DODEFAULT; } break; default: *pResult = CDRF_DODEFAULT; break; }这是原来的,显示各方面一切正常。如果使用内存贴图画的话, 那我应该在那个位置MemDC.SelectObject(&MemBit),在哪个位置pDC->Bitblt void CSkinTreeCtrl::OnPaint(){ CPaintDC dc(this); // device context for painting CRect rcClient; GetClientRect(&rcClient); CDC MemDC; MemDC.CreateCompatibleDC(&dc); CBitmap bmp; bmp.CreateCompatibleBitmap(&dc,rcClient.Width(),rcClient.Height()); MemDC.SelectObject(&bmp); CFont font; font.CreateFont(12, // nHeight 0, // nWidth 0, // nEscapement 0, // nOrientation FW_NORMAL, // nWeight FALSE, // bItalic FALSE, // bUnderline 0, // cStrikeOut ANSI_CHARSET, // nCharSet OUT_DEFAULT_PRECIS, // nOutPrecision CLIP_DEFAULT_PRECIS, // nClipPrecision DEFAULT_QUALITY, // nQuality DEFAULT_PITCH | FF_SWISS, // nPitchAndFamily TEXT("宋体")); MemDC.FillSolidRect(&rcClient, RGB(234, 237, 242)); MemDC.SelectObject(&font); MemDC.SetTextColor(RGB(0, 0, 0)); MemDC.SetBkMode(TRANSPARENT); HTREEITEM hItem = GetFirstVisibleItem(); while (hItem) { CRect rcItem; GetItemRect(hItem, &rcItem, FALSE); if (rcItem.top > rcClient.bottom) { break; } //draw something CString strText; strText=GetItemText(hItem); if (GetItemState(hItem, TVIS_SELECTED) == TVIS_SELECTED) { CImage img; if (GetFocus() == this) { img.LoadFromResource(AfxGetResourceHandle(), IDB_TREE_SELECT_BKG); } else { img.LoadFromResource(AfxGetResourceHandle(), IDB_TREESELECT_NOFOCUS_BKG); } img.Draw(MemDC,rcItem); img.Destroy(); } rcItem.left += 30; MemDC.DrawText(strText, strText.GetLength(), &rcItem, DT_LEFT | DT_SINGLELINE | DT_VCENTER); hItem = GetNextVisibleItem(hItem); } dc.BitBlt(rcClient.left,rcClient.top,rcClient.Width(),rcClient.Height(),&MemDC,0,0,SRCCOPY);} lz应该是想问怎么自绘CTreeCtrl控件吧codeproject上有很多的;http://www.codeproject.com/info/search.aspx?artkw=CTreeCtrl 最后在WM_PAINT里和在NM_CUSTOMDRAW里感觉了一下,我感觉没多大区别, WM_PAINT里确实容易些, 以前一直都被灌输了一个思想:控件窗口的重绘,重载DrawItem是首选,其次是NM_CUSTOMDRAW,然后才是WM_PAINT, 像EDIT这些WM_PAINT也不好处理,就重载OnCtlColor了。对于重绘控件WM_PAINT比DrawItem,应该在哪个地方处理呢? 还是完全决定于实际 MFC非托管项目中怎么使用托管的对话框??? 检测在线问题 请教关于基于对话框的摄像头 IP分割_菜鸟问题 关于system的问题? 如何编程实现 某一程序在运行时是否加载了某一dll typeid是什么东西 一个关于windows nt symbol的安装问题,小弟急!!!! 求教Win32 Application 与Win32 console Application区别? 为什么我的automation server总是很快就退出了? WSASend出现发送数据失败是什么错误啊(客户端,服务器exe) WIN32编程实现“同时绘制圆形和正方形”(使用线程)
lz应该是想问怎么自绘CTreeCtrl控件吧
codeproject上有很多的;
http://www.codeproject.com/info/search.aspx?artkw=CTreeCtrl
一样的
你说用SDK?
我重绘listctrl就是按着类似OnPaint中的方法实现的
用的还是MFC。那可能是我nmcd.dwDrawStage和*pResult的值不对.应该是怎么的nmcd.dwDrawStage
感觉有一点点闪。
CDC *pDC = CDC::FromHandle(lpTVCD->nmcd.hdc); switch(lpTVCD->nmcd.dwDrawStage)
{
case CDDS_PREPAINT:
{
*pResult = CDRF_NOTIFYITEMDRAW ;
}
break; case CDDS_ITEMPREPAINT:
{
HTREEITEM htItem = (HTREEITEM)(lpTVCD->nmcd.dwItemSpec); DrawItemBk(pDC, htItem, nState);
DrawItemText(pDC, htItem, nState);
*pResult = CDRF_SKIPDEFAULT;
}
break; case CDDS_POSTPAINT:
{
*pResult = CDRF_DODEFAULT;
}
break; default:
*pResult = CDRF_DODEFAULT;
break;
}这是原来的,显示各方面一切正常。如果使用内存贴图画的话, 那我应该在那个位置MemDC.SelectObject(&MemBit),在哪个位置pDC->Bitblt
void CSkinTreeCtrl::OnPaint()
{
CPaintDC dc(this); // device context for painting
CRect rcClient; GetClientRect(&rcClient);
CDC MemDC;
MemDC.CreateCompatibleDC(&dc);
CBitmap bmp;
bmp.CreateCompatibleBitmap(&dc,rcClient.Width(),rcClient.Height());
MemDC.SelectObject(&bmp);
CFont font;
font.CreateFont(12, // nHeight
0, // nWidth
0, // nEscapement
0, // nOrientation
FW_NORMAL, // nWeight
FALSE, // bItalic
FALSE, // bUnderline
0, // cStrikeOut
ANSI_CHARSET, // nCharSet
OUT_DEFAULT_PRECIS, // nOutPrecision
CLIP_DEFAULT_PRECIS, // nClipPrecision
DEFAULT_QUALITY, // nQuality
DEFAULT_PITCH | FF_SWISS, // nPitchAndFamily
TEXT("宋体"));
MemDC.FillSolidRect(&rcClient, RGB(234, 237, 242));
MemDC.SelectObject(&font);
MemDC.SetTextColor(RGB(0, 0, 0));
MemDC.SetBkMode(TRANSPARENT); HTREEITEM hItem = GetFirstVisibleItem();
while (hItem)
{
CRect rcItem;
GetItemRect(hItem, &rcItem, FALSE);
if (rcItem.top > rcClient.bottom)
{
break;
}
//draw something
CString strText;
strText=GetItemText(hItem);
if (GetItemState(hItem, TVIS_SELECTED) == TVIS_SELECTED)
{
CImage img;
if (GetFocus() == this)
{
img.LoadFromResource(AfxGetResourceHandle(), IDB_TREE_SELECT_BKG);
}
else
{
img.LoadFromResource(AfxGetResourceHandle(), IDB_TREESELECT_NOFOCUS_BKG);
}
img.Draw(MemDC,rcItem);
img.Destroy();
}
rcItem.left += 30;
MemDC.DrawText(strText, strText.GetLength(), &rcItem, DT_LEFT | DT_SINGLELINE | DT_VCENTER);
hItem = GetNextVisibleItem(hItem);
} dc.BitBlt(rcClient.left,rcClient.top,rcClient.Width(),rcClient.Height(),&MemDC,0,0,SRCCOPY);
}
codeproject上有很多的;
http://www.codeproject.com/info/search.aspx?artkw=CTreeCtrl