关于自绘CListBox的一些疑惑
来源:互联网 发布:redis写入mysql 编辑:程序博客网 时间:2024/05/22 22:06
当CListBox自身功能不能满足我们的需求时,就会考虑使用自绘方式来实现自己的控件,以下就是我在实现一个自绘控件时遇到的一些问题,现将其总结如下:
1。应该重载Create()函数来隐式设置LBS_OWNERDRAWFIXED标志,Create的原型为:
1。应该重载Create()函数来隐式设置LBS_OWNERDRAWFIXED标志,Create的原型为:
// Operationspublic: BOOL Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID);
2。可能你并不需要MeasureItem函数,但你还是需要重载它,否则会触发ASSERT(FALSE)。
3。SetItemHeight函数可以放在WM_CREATE的OnCreate映射函数中,但有必要检查一个是否包含LBS_OWNERDRAWFIXED和LBS_HASSTRINGS标志:
int CMaskListBox::OnCreate(LPCREATESTRUCT lpCreateStruct){ if (CListBox::OnCreate(lpCreateStruct) == -1) return -1; if ((GetStyle() & (LBS_OWNERDRAWFIXED | LBS_HASSTRINGS)) == (LBS_OWNERDRAWFIXED | LBS_HASSTRINGS)) SetItemHeight(-1, ITEM_HEIGHT); return 0;}
4。LBS_NOINTEGRALHEIGHT标志有时会救你于水火,当你的控件被放入某个视图中,你可能会发现你的OnSize事件并不能将它填充到整个视图区,最下方总会留出一点空间时,可能就是因为你没有设置这个标志了。所以Create需要这样实现:
BOOL CMaskListBox::Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID){ dwStyle |= LBS_NOINTEGRALHEIGHT | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS; return CListBox::Create(dwStyle, rect, pParentWnd, nID);}
5。DrawItem函数有必要使用内存绘画,以减少画面闪烁:
void CMaskListBox::DrawItem(LPDRAWITEMSTRUCT lpdis){ if (lpdis->itemID < 0) return; if (lpdis->itemID >= (UINT)GetCount()) return; CDC* pDC = CDC::FromHandle(lpdis->hDC); CRect rect(lpdis->rcItem); CDC MemDC; CBitmap MemBitmap; MemDC.CreateCompatibleDC(NULL); MemBitmap.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height()); CBitmap *pOldBit = MemDC.SelectObject(&MemBitmap); CRect drRect(CPoint(0, 0), CSize(rect.Width(), rect.Height())); COLORREF clBk; //if ((lpdis->itemState & ODS_SELECTED) // if item has been selected // (lpdis->itemAction & (ODA_SELECT | ODA_DRAWENTIRE))) if (lpdis->itemState & ODS_SELECTED) clBk = ::GetSysColor(COLOR_HIGHLIGHT); else clBk = ::GetSysColor(COLOR_WINDOW); MemDC.FillSolidRect(&drRect, clBk); // 在这里可以自己画你的数据了 pDC->BitBlt(rect.left, rect.top, rect.Width(), rect.Height(), &MemDC, 0, 0, SRCCOPY); MemBitmap.DeleteObject(); MemDC.DeleteDC();}
- 关于自绘CListBox的一些疑惑
- 简单的自绘CListBox
- CListBox自绘
- 关于NAT的一些疑惑
- 关于UWP的一些疑惑
- 关于Service的一些疑惑。
- 3.VC(ui)-clistbox 和button的自绘
- 简单的自绘CListBox(多行显示)
- 关于IBM federation server的一些疑惑
- 关于IBM federation server的一些疑惑
- 关于python的一些想法和疑惑
- 关于switch cas 的一些疑惑解答
- 关于Marching Cube的一些疑惑思考
- 关于多线程共享数据的一些疑惑
- 关于Unity中的_MainTex_ST的一些疑惑
- 关于z-index的一些疑惑
- 关于CLISTBOX 的另类操作
- 关于今天笔试关于java一些基础题的疑惑
- Delphi7的dbExpress驱动问题
- 判断Unicode编码的文件
- linux下的RandomAccessFile类
- 【原创】Ubuntu的版本命名学习
- C++之父评论C++与Java (转载)
- 关于自绘CListBox的一些疑惑
- META标签详解
- 在非MFC程序中引用CString
- 【转】wince6移植之gwes与显示驱动!!
- 解决EOS启动“不能连接到Server”的问题
- select 中的DISTINCT用法
- SOA数据访问与传统数据访问的区别
- CCNA资源共享
- 我的Total Commander设置