日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

关于自绘CListBox的一些疑惑

發布時間:2025/3/15 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于自绘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();
}




轉載于:https://www.cnblogs.com/heqing/archive/2005/01/18/93611.html

新人創作打卡挑戰賽發博客就能抽獎!定制產品紅包拿不停!

總結

以上是生活随笔為你收集整理的关于自绘CListBox的一些疑惑的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。