关于自绘CListBox的一些疑惑
生活随笔
收集整理的這篇文章主要介紹了
关于自绘CListBox的一些疑惑
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
當CListBox自身功能不能滿足我們的需求時,就會考慮使用自繪方式來實現自己的控件,以下就是我在實現一個自繪控件時遇到的一些問題,現將其總結如下:
1。不要要求用戶自己設置LBS_OWNERDRAWFIXED標志,而應該在重載Create()函數來隱式設置,Create的原型為:
//?Operations
public:
????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();
}
1。不要要求用戶自己設置LBS_OWNERDRAWFIXED標志,而應該在重載Create()函數來隱式設置,Create的原型為:
//?Operations
public:
????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();
}
轉載于:https://www.cnblogs.com/heqing/archive/2005/01/18/93611.html
新人創作打卡挑戰賽發博客就能抽獎!定制產品紅包拿不停!總結
以上是生活随笔為你收集整理的关于自绘CListBox的一些疑惑的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: aswing学习笔记4-通过调用面板中的
- 下一篇: ant 彻底了解(转)