青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Sivan's blog

用代碼說話……
posts - 14, comments - 2, trackbacks - 0, articles - 0
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

[學]ListBox自繪

Posted on 2011-03-06 16:23 Sivan 閱讀(3291) 評論(0)  編輯 收藏 引用 所屬分類: VC/MFC

    看到很多軟件的設置對話框都是由一個自繪的ListBox和幾個Child風格的CDialog組成的,如圖飛秋的設置對話框:

sshot-1

自繪的ListBox可以繪制一些自己需要的圖標或者文字的字體、顏色和大小。琢磨了一下,做法如下:

從CListBox派生自己的類CListBoxEx

(1)設置Item的大小在MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)函數

MeasureItem是個虛函數,在這里覆寫它,設置Item大小

void CListBoxEx::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{

    // TODO:  添加您的代碼以確定指定項的大小
    lpMeasureItemStruct->itemHeight = m_nHeight; //設置Item高度
}
(2)在虛函數DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)內繪制我們想要的效果

添加圖標,繪制想要的文字效果。圖標可以是Bitmap或者Icon

Bitmap使用兼容DC拷貝上去;ICON直接利用CDC的DrawIcon畫上去

主要繪制沒有選中時的效果和選中的效果

void CListBoxEx::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
	// TODO:  添加您的代碼以繪制指定項
	CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
	CRect rectItem(lpDrawItemStruct->rcItem);
	CRect rectIcon(rectItem.left, rectItem.top, rectItem.left+m_nWidth, rectItem.top+m_nHeight);
	CRect rectText(rectIcon.right,rectItem.top,rectItem.right,rectItem.bottom);

	CListItem* pItem = static_cast<CListItem*>(GetItemDataPtr(lpDrawItemStruct->itemID));
	pDC->SetBkMode(TRANSPARENT);

	UINT action, state;
	action = lpDrawItemStruct->itemAction;
	state  = lpDrawItemStruct->itemState;

	// 繪制整個Item或者Item沒有被選中將要選中,填充背景
	if ((action & ODA_DRAWENTIRE) || ( !(state & ODS_SELECTED) && (action & ODA_SELECT)))
	{
		pDC->FillSolidRect(rectItem, m_clrBack);                        // 填充背景
		if (m_bIsEdge)
		{
			pDC->DrawEdge(rectItem, EDGE_SUNKEN, BF_BOTTOM); // 畫邊框
		}

		if (lpDrawItemStruct->itemData != NULL)
		{
			// 畫圖標
			CRect rect(rectIcon);
			rect.DeflateRect(0,5,0,0);
			CDC dcMem;
			dcMem.CreateCompatibleDC(pDC);

			CBitmap bmp;
			bmp.LoadBitmap(pItem->m_nBitMap);
			CBitmap* pOldBmp = dcMem.SelectObject(&bmp);
			pDC->BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),&dcMem,0,0,SRCCOPY);
			dcMem.SelectObject(pOldBmp);
			bmp.DeleteObject();
			// 文字
			//pDC->TextOut(rectText.left+2, rectText.top,pItem->m_szItemName);		
			rect = rectText;
			rect.DeflateRect(0,5,0,0);
			pDC->SetTextColor(RGB(0,0,0));
			rect.OffsetRect(2,0);
			if (pItem->m_szItemName != NULL)
			{
				pDC->DrawText(pItem->m_szItemName, lstrlen(pItem->m_szItemName),rect, DT_LEFT | DT_SINGLELINE);
			}
		}
	}

	// Item被選中
	if ( (state & ODS_SELECTED) && (action & (ODA_SELECT | ODA_DRAWENTIRE)))
	{
		CRect rect(rectItem);
		// 背景
		CPen Pen(PS_SOLID, 1, RGB(0, 0, 0));
		CPen* pOldPen = pDC->SelectObject(&Pen);
		pDC->Rectangle(rect);
		pDC->SelectObject(pOldPen);

		rect.DeflateRect(0,1,0,0);
		pDC->FillRect(rect, &CBrush(m_clrSel));

		// 邊框
		if (m_bIsEdge)
		{
			pDC->DrawEdge(rect, EDGE_SUNKEN, BF_BOTTOM);
		}

		// 圖標
		rect = rectIcon;
		rect.DeflateRect(0,5,0,0);
		CDC dcMem;
		dcMem.CreateCompatibleDC(pDC);

		CBitmap bmp;
		bmp.LoadBitmap(pItem->m_nBitMap);
		CBitmap* pOldBmp = dcMem.SelectObject(&bmp);
		pDC->BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),&dcMem,0,0,SRCCOPY);
		dcMem.SelectObject(pOldBmp);
		bmp.DeleteObject();

		// 文字
		rect.CopyRect(rectText);
		rect.DeflateRect(0,5,0,0);
		pDC->SetTextColor(m_clrText);   // 被選中時的顏色
		rect.OffsetRect(10,0);
		if (pItem->m_szItemName != NULL)
		{
			pDC->DrawText(pItem->m_szItemName, lstrlen(pItem->m_szItemName),rect, DT_LEFT | DT_SINGLELINE);
		}
	}
}

(3)其他

可以添加一些利用鍵盤上下鍵選擇Item的功能,覆寫函數DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)

int CListBoxEx::VKeyToItem(UINT nKey, UINT nIndex)
{

	// TODO:  添加處理特定虛擬鍵的代碼
	// 返回 -1 = 默認操作
	// 返回 -2 = 沒有進一步的操作
	// 返回索引 = 執行以下項上的鍵擊的默認操作
	//               索引指定的項
	if ((nKey == VK_UP) && (nIndex > 0))
		SetCurSel(nIndex);

	else if ((nKey == VK_DOWN) && (nIndex < (UINT)GetCount()))
		SetCurSel(nIndex);

	return -1;
}

因為要接收鍵盤上下鍵消息,所以在listbox屬性中,將Want Key Input改為True

(4)碰到的問題

代碼添加完畢,利用自己派生的類CListBoxEx關聯一個ListBox控件,運行卻沒有自己要的自繪效果,跟蹤代碼發現,DrawItem根本沒有被調用,怎么回事,哦,原來是忘記設置控件的屬性,標示其是否自繪。

查看Listbox Control屬性→行為→Owner Draw,將No改為variable。

一般也不需要自動排序,將Sort改為False。

(5)運行結果


詳細可看這里

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            麻豆精品视频在线观看| 久久aⅴ乱码一区二区三区| 欧美视频在线不卡| 欧美日韩喷水| 欧美日韩一区二区三区在线观看免| 欧美黄色aa电影| 欧美三级电影精品| 国产一区二区三区久久悠悠色av | 亚洲免费av电影| 亚洲国产精品一区在线观看不卡 | 久久九九免费视频| 欧美专区第一页| 美女免费视频一区| 欧美日韩第一区| 国产精品一区二区在线观看网站| 国内精品久久久久久影视8| 亚洲经典三级| 翔田千里一区二区| 免费的成人av| 亚洲最新在线| 久久久久综合一区二区三区| 欧美激情麻豆| 国产一区二区三区高清在线观看| 亚洲福利精品| 久久福利毛片| 中文国产成人精品| 免费成人黄色av| 亚洲午夜精品久久久久久浪潮| 亚洲影院在线观看| 欧美日韩亚洲国产一区| 激情综合视频| 午夜欧美大尺度福利影院在线看| 欧美顶级少妇做爰| 久热re这里精品视频在线6| 欧美日韩精选| 亚洲激情电影中文字幕| 久久久7777| 午夜一区二区三区不卡视频| 欧美日韩在线一二三| 亚洲精品一区二区网址| 欧美成人小视频| 欧美大秀在线观看| 亚洲精品1234| 亚洲日本在线观看| 麻豆精品91| 亚洲黄色影片| 中文有码久久| 国模套图日韩精品一区二区| 亚洲成人资源网| 欧美午夜片在线观看| 久久精品国产亚洲a| 欧美亚洲一级片| 激情另类综合| 日韩午夜视频在线观看| 国产精品初高中精品久久| 亚洲女同在线| 久久先锋资源| 亚洲欧美日韩综合国产aⅴ| 欧美在线观看视频在线| 亚洲福利久久| 日韩视频免费观看| 亚洲欧美日韩精品综合在线观看| 狠狠色噜噜狠狠狠狠色吗综合| 亚洲精品在线二区| 最新中文字幕一区二区三区| 欧美在线观看一区| 在线视频精品一区| 欧美成人按摩| 久久久久高清| 国产精品久久久久9999| 亚洲国产免费看| 亚洲精品视频免费| 老司机凹凸av亚洲导航| 久久久99久久精品女同性| 欧美日韩成人综合天天影院| 欧美aⅴ一区二区三区视频| 激情伊人五月天久久综合| 香蕉久久精品日日躁夜夜躁| 欧美一区二区三区精品| 国产精品一区二区三区乱码| 一区二区三区四区国产精品| 亚洲欧美日产图| 韩国v欧美v日本v亚洲v| 久久精品免费| 亚洲免费福利视频| 久久www成人_看片免费不卡| 国产自产精品| 欧美一区二区三区四区在线 | 免费观看成人www动漫视频| 一区二区日本视频| 亚洲视频一区| 久久国产夜色精品鲁鲁99| 亚洲一区视频在线| 亚洲毛片av在线| 亚洲美女尤物影院| 欧美成人dvd在线视频| 欧美在线免费观看视频| 日韩午夜一区| 在线国产亚洲欧美| 国产欧美三级| 狠狠色2019综合网| 国产精品久久久久av| 亚洲精品视频免费| 国产精品日韩在线播放| 国内精品久久久久影院优| 亚洲女人av| 一区二区免费在线视频| 欧美成人视屏| 欧美xart系列高清| 久久婷婷综合激情| 久久久精品日韩欧美| 午夜视黄欧洲亚洲| 亚洲一区二区成人在线观看| 中文网丁香综合网| 亚洲视频导航| 亚洲欧美国产va在线影院| 亚洲一区二区不卡免费| 欧美一级欧美一级在线播放| 午夜精品在线观看| 嫩草影视亚洲| 欧美日韩卡一卡二| 亚洲卡通欧美制服中文| 欧美一乱一性一交一视频| 性娇小13――14欧美| 久热re这里精品视频在线6| 久久夜色精品国产噜噜av| 久久在线免费观看| 欧美日韩另类在线| 国产精品手机视频| 91久久精品www人人做人人爽 | 欧美在线999| 另类图片国产| 欧美二区乱c少妇| 日韩一级免费| 久久国产99| 国产精品美女诱惑| 在线视频观看日韩| 欧美影院视频| 欧美va日韩va| 亚洲精品一区二区在线| 久久岛国电影| 亚洲欧美日本伦理| 欧美激情一区二区久久久| 国产亚洲a∨片在线观看| 亚洲无人区一区| 亚洲欧洲中文日韩久久av乱码| 欧美一区高清| 黑丝一区二区三区| 久久久久一区二区三区四区| 99精品国产一区二区青青牛奶| 欧美成人精品1314www| 国内精品伊人久久久久av影院 | 亚洲大胆视频| 欧美国产欧美亚州国产日韩mv天天看完整| 亚洲男女自偷自拍| 国产精品毛片| 亚洲精品在线免费| 一本色道久久综合亚洲二区三区| 欧美成人一区二区三区在线观看| 最新日韩在线视频| 99re这里只有精品6| 午夜精品久久久久久久久久久久| 这里只有精品视频在线| 国产精品日韩专区| 久久精品亚洲一区二区三区浴池| 欧美中文在线观看国产| 亚洲电影在线看| 亚洲精品资源美女情侣酒店| 国产精品青草久久久久福利99| 欧美专区日韩专区| 欧美精品免费观看二区| 亚洲欧美三级在线| 免费不卡在线视频| 亚洲男同1069视频| 猛男gaygay欧美视频| 欧美日韩国产成人在线观看| 久久精品成人一区二区三区蜜臀| 欧美日韩美女一区二区| 欧美一区二区三区男人的天堂| 久久久亚洲高清| 久久精品色图| 国产精品一区久久| 亚洲视频网站在线观看| 99re6热在线精品视频播放速度| 亚洲欧美在线播放| 先锋亚洲精品| 国产精品久久久久久久久久久久久久 | 9人人澡人人爽人人精品| 午夜在线不卡| 亚洲永久网站| 国产精品久久久爽爽爽麻豆色哟哟 | 国内自拍一区| 欧美一区二区视频97| 欧美性jizz18性欧美| 在线中文字幕日韩| 久久国产精品网站| 影音先锋亚洲视频| 欧美日本一区二区高清播放视频| 免播放器亚洲| 在线综合欧美|