給pb的listview或者treeview控制元件加上背景圖 (轉)
此文章獻給想美化介面的pb程式設計師。
一.載入點陣圖資源並建立PatternBrush作為填充背景圖的刷子
long ll_bmp
long h_deskdc
long ll_memDc
if ih_BkBrush>0 then
delete(ih_BkBrush)
ih_BkBrush=0
end if
h_deskdc =GetDc(0)
//載入圖片
ll_bmp = LoadImage(0,BMPBkName,0,0,0,16)
//失敗
if ll_bmp = 0 then
releaseDc(0,h_deskdc)
return
end if
ll_memDC = CreateCompatibleDC(h_deskdc)
//選入到場景
Object(ll_memDC,ll_bmp)
//建立繪製背景圖的刷子
ih_BkBrush =CreatePatternBrush(ll_bmp)
//釋放不需要的資源
releaseDc(0,h_deskdc)
Deleteobject(ll_bmp)
DeleteDc(ll_memDC)
二.給listview加背景圖
1.得到listview客戶區域矩形
getClientRect(handle(this),lvclientRect)
2.在listview中以pbm_erasebkgnd為事件id,自定義事件ue_erasebkgnd ,script如下
if ih_BkBrush>0 then
FillRect(hdc,lvClientrect,ih_BkBrush)
return 1
end if
3.當listview的顯示風格為listviewreport!,listviewlist!時候,拖動捲軸時候會出現擠壓需要以pbm_vscroll和pbm_hscroll作為eventid自定義事件ue_vscroll,ue_hscroll。
if ih_BkBrush>0 and (View=listviewreport! or View=listviewlist!) then
if (scrollcode<>SB_ENDSCROLL) and (scrollcode<>SB_THUMBPOSITION) then
InvalidateRect(handle(this),lvclientRect,1)
end if
end if
儘管如此,在上述兩種風格中拖動捲軸依然有閃爍的情況,我還沒有能夠解決,歡迎大家提出意見。
4.如果想要listview中item的文字和圖片背景透明,只需以下程式碼
Constant Long CLR_NONE = 4294967295
Constant Long LVM_FIRST =4096
Constant Long LVM_SETTEXTBKCOLOR = (LVM_FIRST + 38)
Constant Long LVM_GETIMAGELIST = (LVM_FIRST + 2)
Constant Long LVM_SETBKCOLOR = (LVM_FIRST + 1)
Constant Long LVSIL_NORMAL= 0
Constant Long LVSIL_SMALL=1
Constant Long LVSIL_STATE=2
//讓文字的背景色透明
Send(handle(this),LVM_SETTEXTBKCOLOR,0,CLR_NONE)
//讓圖片的背景色透明
Send(handle(this),LVM_SETBKCOLOR,0,CLR_NONE)
此外,如果使用pb自帶的圖片,需要將PictureMaskColor設定為Silver。
三.給treeview加背景圖
如果按照上述listview的方法給treeview新增背景圖,也可以基本實現,但是在樹的子項展開,收縮時候以及拖動捲軸時會擠壓圖形,如果用setredraw控制會出現嚴重的閃爍情況。此外樹的子項的文字和圖片背景也不能透明。
1.我參考了其他程式語言實現的例程,基本都會在WM_PAINT事件中處理,因此我以pbm_paint作為eventid自定義事件ue_paint。但由於此事件的引數Hdc在任何情況下均為0,所以我猜測在pb中,此事件只是在呼叫WindowProc處理WM_PAINT訊息前,並沒有使用beginPaint開始進行繪圖操作。
要讓樹的子項的文字和圖片背景透明,只需要做一些光柵運算就可以了
相關程式碼如下:
if ih_BkBrush>0 then
if message.Parm >0 then
//由send帶WordParm引數觸發,不執行下面的操作
return 0
end if
tagPAINTSTRUCT ps
//開始paint操作
HDC=BEGINPAINT(handle(this),ps)
long memdc,maskdc,ResultDc;
long hbitmap;
long li_RCWidth,li_RCHeight
li_RCWidth=tvclientRect.right -tvclientRect.left
li_RCHeight=tvclientRect.bottom -tvclientRect.top
ResultDc=CreateCompatibleDC(hdc);
hbitmap=CreateCompatibleBitmap(hdc,li_RCWidth,li_RCHeight);
SelectObject(ResultDc, hbitmap );
deleteObject(hbitmap)
//將背景圖繪製到裝置場景ResultDc上
FillRect(ResultDc,tvclientRect,ih_BkBrush)
// create a compatible memory dc
memdc=CreateCompatibleDC(hdc);
hbitmap=CreateCompatibleBitmap(hdc,li_RCWidth,li_RCHeight);
SelectObject(memdc, hbitmap );
deleteObject(hbitmap)
//將tv的內容繪製到裝置場景memdc上
send(handle(this),WM_PAINT,memdc, 0)
// create mask dc
maskdc=CreateCompatibleDC(hdc);
hbitmap=CreateBitmap(li_RCWidth,li_RCHeight,1, 1,0);
SelectObject(maskdc, hbitmap );
deleteObject(hbitmap)
//只有單色
BitBlt(maskdc,0,0,li_RCWidth,li_RCHeight,memdc,0,0,SRCCOPY);
SetBkColor(memdc,RGB(0,0,0));
SetTextColor(memdc,RGB(255,255,255))
//白色替換為黑色
BitBlt(memdc,0,0,li_RCWidth,li_RCHeight,maskdc,0,0,SRCAND);
//透過and操作,將item和文字置為黑色新增到背景圖上
BitBlt(ResultDc,0,0,li_RCWidth,li_RCHeight,maskdc,0,0,SRCAND);
//透過or操作,將treeitem替換為原有顏色
BitBlt(ResultDc,0,0,li_RCWidth,li_RCHeight,memdc,0,0,SRCPAINT);
//將合併後的圖copy到hdc上
BitBlt(hDc,0,0,li_RCWidth,li_RCHeight,ResultDc,0,0,SRCCOPY);
deleteDc(memdc)
deleteDc(maskdc)
deleteDc(ResultDc)
//結束paint操作
endpaint(handle(this),ps)
end if
由於做了多次的點陣圖處理操作,在較低的機器上可能會有延遲的現象,所以treeview控制元件的長度和寬度不要太大,子項的數目應該控制在合理的範圍內。
2、由於我們在ue_paint事件中已經對背景進行了繪製,因此需要遮蔽預設的重新整理背景操作。
ue_erasebkgnd:
if ih_BkBrush>0 then
//不執行預設的訊息處理程式
return 1
end if
3.對於treeview由於子項展開,收縮時候會擠壓圖形,需要itemcollapsin、itemexpanding和selectchanging事件控制從而使整個控制元件重畫。
if ih_BkBrush>0 then InvalidateRect(handle(this),tvclientRect,0)
4、對於由於捲軸拖動產生的圖形積壓,也需要做類似處理。
pbm_vscroll和pbm_hscroll:
if ih_BkBrush>0 and (scrollcode<>SB_ENDSCROLL) and (scrollcode<>SB_THUMBPOSITION) then
InvalidateRect(handle(this),tvclientRect,0)
end if
在這裡我只對程式的關鍵實現部分作了說明,省略了相關的變數、外部函式、結構宣告和其他部分。完整的pb8例程可在
?boardID=23&ID=934">,歡迎大家作進一步探討:)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-993472/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- ACCESS TreeView控制元件的使用View控制元件
- 給你的Flutter頁面跳轉加上動畫Flutter動畫
- tkinter treeview 背景色 問題.View
- ListView控制元件 1130View控制元件
- 美圖秀秀怎麼給圖片新增背景?美圖秀秀給圖片新增背景的教程
- 給自己的網站加上HTTPS網站HTTP
- Flutter 滾動控制元件篇-->ListViewFlutter控制元件View
- 如何給普通圖片加上水波紋【shader 奇技淫巧】
- Flutter | ShaderMask - 給你的Widget加上色彩Flutter
- CoordConv:給你的卷積加上座標卷積
- Qt QtCharts給QChartView換膚,換背景色新增背景圖片QTView
- .NET 控制元件轉圖片控制元件
- [提問交流]給row或者col設定背景色的類名稱是什麼
- Java 將PDF轉為透明背景的圖片Java
- 鴻蒙跳轉到相簿或者檔案選擇圖片並顯示到Image控制元件中鴻蒙控制元件
- android之豎直滾動控制元件-ListViewAndroid控制元件View
- 【轉載】WPF中TreeView控制元件資料繫結和後臺動態新增資料(一)View控制元件
- 給你的Vim加上自動程式設計功能程式設計
- 給一個塊元素新增多張背景圖片
- 給 Junit 5 加上 json 資料來源JSON
- 五分鐘給你的 gRPC服務 加上 HTTP 介面RPCHTTP
- 怎麼給多個影片同時新增上背景圖
- Python將base64轉為文件或者圖片Python
- 送給學Go或者轉Go同學的一套編碼規範Go
- 安卓開發——ListView控制元件(初始化ListView、列表重新整理、長按新增menu)安卓View控制元件
- 給Agent加上資料庫功能會怎樣?資料庫
- [20210113]給PB開發人員的一個建議.txt
- C# WinForm控制元件及其子控制元件轉成圖片(支援帶捲軸的長截圖)C#ORM控制元件
- 給 smox 加上翅膀,不斷進步的 react 狀態管理React
- 背景圖
- html背景圖的使用HTML
- TreeView的基本使用 1205View
- win10系統下如何給郵件更換背景圖片_Win10怎麼修改郵件應用的背景圖Win10
- 給記憶體加上AI?三星是這樣做的記憶體AI
- 工作調到外地或者職位變動手裡的客戶如何轉交給他人
- [工作札記]02: .Net Winform控制元件TreeView最簡遞迴繫結方法ORM控制元件View遞迴
- 短視訊系統原始碼,如何給button控制元件新增描邊、填充背景和描邊原始碼控制元件
- WPF TreeView BringIntoViewBehaviorView
- Linux好玩的:給GRUB2載入程式給個背景吧Linux