500字范文,内容丰富有趣,生活中的好帮手!
500字范文 > 自定义状态栏进度条-自定义Excel

自定义状态栏进度条-自定义Excel

时间:2021-02-18 07:00:41

相关推荐

自定义状态栏进度条-自定义Excel

自定义进度条

API的用处不是一时半会就可以说完了,但例子还是要一个个给,现在给出第二个利用API的例子,在Excel的状态栏中显示自定义的进度条。

"//此模块创建了一个显示在状态栏的自定义进度条,并可对状态栏的文字进行设置

"//——以下声明API函数——

"//创建文字函数,其中fCharacterSet:字符集;134为GB2312

PrivateDeclareFunctionCreateFontLib"gdi32"Alias"CreateFontA"(ByValfHeightAsLong,ByValfWidthAsLong,ByValfEscapementAsLong,ByValfOrientationAsLong,ByValfWeightAsLong,ByValfItalicAsLong,ByValfUnderlineAsLong,ByValfStrikeoutAsLong,ByValfCharacterSetAsLong,ByValfPrecisionAsLong,ByValfClippingAsLong,ByValfQualityAsLong,ByValfPitchAndFamilyAsLong,ByValfNameAsString)AsLong

"//取得窗体设备环境函数

PrivateDeclareFunctionGetDCLib"user32"(ByValhwndAsLong)AsLong

"//设置环境内容,此处为文字

PrivateDeclareFunctionSelectObjectLib"gdi32"(ByValhdcAsLong,ByValhObjectAsLong)AsLong

"//删除创建的环境内容

PrivateDeclareFunctionDeleteObjectLib"gdi32"(ByValhObjectAsLong)AsLong

"//释放设备环境

PrivateDeclareFunctionReleaseDCLib"user32"(ByValhwndAsLong,ByValhdcAsLong)AsLong

"//该函数创建一个具有扩展风格的重叠式窗口、弹出式窗口或子窗口

PrivateDeclareFunctionCreateWindowEXLib"user32"Alias"CreateWindowExA"(ByValdwExStyleAsLong,ByVallpClassNameAsString,ByVallpWindowNameAsString,ByValdwStyleAsLong,ByValxAsLong,ByValyAsLong,ByValnWidthAsLong,ByValnHeightAsLong,ByValhWndParentAsLong,ByValhMenuAsLong,ByValhInstanceAsLong,lpParamAsAny)AsLong

"//破坏创建的窗口

PrivateDeclareFunctionDestroyWindowLib"user32"(ByValhwndAsLong)AsLong

"//设置一个窗口为另一窗口的子窗口

PrivateDeclareFunctionSetParentLib"user32"(ByValhWndChildAsLong,ByValhWndNewParentAsLong)AsLong

"//视情况向窗体发送不同的信息

PrivateDeclareFunctionSendMessageLib"user32"Alias"SendMessageA"(ByValhwndAsLong,ByValwMsgAsLong,ByValwParamAsLong,lParamAsAny)AsLong

"//查找窗口句柄

PrivateDeclareFunctionFindWindowLib"user32"Alias"FindWindowA"(ByVallpClassNameAsString,ByVallpWindowNameAsString)AsLong

"//查找一个窗口中子窗口的句柄

PrivateDeclareFunctionFindWindowExLib"user32"Alias"FindWindowExA"(ByValhWnd1AsLong,ByValhWnd2AsLong,ByVallpsz1AsString,ByVallpsz2AsString)AsLong

"//设置场景背景色

PrivateDeclareFunctionSetBkColorLib"gdi32"(ByValhdcAsLong,ByValcrColorAsLong)AsLong

"//设置文本颜色

PrivateDeclareFunctionSetTextColorLib"gdi32"(ByValhdcAsLong,ByValcrColorAsLong)AsLong

"//取得系统色

PrivateDeclareFunctionGetSysColorLib"user32"(ByValnIndexAsLong)AsLong

"//取得窗体客户区坐标

PrivateDeclareFunctionGetClientRectLib"user32"(ByValhwndAsLong,lpRectAsRECT)AsLong

"//——以下定义常量及类型——

PrivateConstWS_VISIBLE=&H10000000"可见

PrivateConstWS_CHILD=&H40000000"子窗口

PrivateConstWS_BORDER=&H800000"单边框

PrivateConstPBS_STANDARD=&H0"标准

PrivateConstPBS_SMOOTH=&H1"平滑

PrivateConstCCM_FIRST=&H2000&

PrivateConstWM_USER=&H400

PrivateConstPBM_SETBKCOLOR=(CCM_FIRST+1)"设置进度条背景色

PrivateConstPBM_SETPOS=(WM_USER+2)"设置进度条状态

PrivateConstPBM_SETBARCOLOR=(WM_USER+9)"设置进度条颜色

PrivateConstCOLOR_BTNFACE=15"系统按纽背景色

PrivateTypeRECT

LeftAsLong

TopAsLong

RightAsLong

BottomAsLong

EndType

"//进度条显示时的样式

EnumPBType

P_STANDARD=WS_VISIBLEOrWS_CHILDOrWS_BORDEROrPBS_STANDARD"标准样式

P_SMOOTH=WS_VISIBLEOrWS_CHILDOrWS_BORDEROrPBS_SMOOTH"平滑式

EndEnum

"//文字的字体粗细需在0到1000之间,例如,400代表普通,700代表粗体,而0则表示默认。

EnumFnWeight

FW_DONTCARE=0

FW_THIN=100

FW_EXTRALIGHT=200

FW_ULTRALIGHT=200

FW_LIGHT=300

FW_NORMAL=400

FW_REGULAR=400

FW_MEDIUM=500

FW_SEMIBOLD=600

FW_DEMIBOLD=600

FW_BOLD=700

FW_EXTRABOLD=800

FW_ULTRABOLD=800

FW_HEAVY=900

FW_BLACK=900

EndEnum

"//主过程

"//参数如下;

"//FontHeight:文字高度,FontWeight:文字粗细,FontColor:文字颜色,Italic:斜体,lngPBType:进度条类型,MaxVlue:最大值,StopValue:停止值,Prompt:状态栏字符串。

SubStatusBarMsg(FontHeightAsLong,FontWeightAsFnWeight,FontColorAsLong,ItalicAsBoolean,lngPBTypeAsPBType,MaxVlueAsLong,StopValueAsLong,PromptAsString)

DimhwndStatusbarAsLong"状态栏句柄

DimPbHwndAsLong"创建的进度条

DimXlStaBarRectAsRECT"用于装载状态栏区域

DimxlMainAsLong"EXCEL主窗口句柄

DimhDcStatusBarAsLong"状态栏设备环境

DimhFontAsLong,hFontOldAsLong"创建的文字及原文字信息

DimoldStatusBarAsBoolean"原状态栏状态

DimIAsLong,iValAsString

DimStrLenAsInteger"状态栏文本长度

DimGetBarRECTAsLong

StrLen=Len(Prompt)*Abs(FontHeight)+30

"//取得EXCEL主窗口的句柄。

xlMain=FindWindow("XLMAIN",vbNullString)"Excel2002及以后版本可以直接用Application.hWnd来取得Excel主窗口的句柄

"//取得状态栏的句柄。状态栏类名:"EXCEL4"

hwndStatusbar=FindWindowEx(xlMain,0,"EXCEL4",vbNullString)

"//取得状态栏的客户区坐标

GetBarRECT=GetClientRect(hwndStatusbar,XlStaBarRect)

"//取得状态栏的场景

hDcStatusBar=GetDC(hwndStatusbar)

"//创建一种将用于状态栏的文字,注意:文字名称的长度必修小于32""新宋体"为自己给定的文字名,可以自行更改

hFont=CreateFont(FontHeight,0,0,0,FontWeight,Italic,0,0,134,0,0,0,0,"新宋体")

"//首先设置新字体并保存原来的字体!

hFontOld=SelectObject(hDcStatusBar,hFont)

"//保存原状态栏状态

oldStatusBar=Application.DisplayStatusBar

Application.DisplayStatusBar=True

"//创建进度条

PbHwnd=CreateWindowEX(0,"msctls_progress32","",lngPBType,StrLen,XlStaBarRect.Top+1,198,_

XlStaBarRect.Bottom-2,hwndStatusbar,0,0,0)

"//将进度条设为状态栏的子窗口

SetParentPbHwnd,hwndStatusbar

"//进度条颜色,颜色可以自行设置

SendMessagePbHwnd,PBM_SETBARCOLOR,0&,ByVal16711680"蓝色

"//进度条背景色,颜色可以自行设置

SendMessagePbHwnd,PBM_SETBKCOLOR,0&,ByVal16777215"白色

"//状态栏背景色,这里用的是按纽背景色

CallSetBkColor(hDcStatusBar,GetSysColor(COLOR_BTNFACE))

"//文字颜色,即状态栏前景色

CallSetTextColor(hDcStatusBar,FontColor)

"//设置状态栏文字

Application.StatusBar=Prompt

ForI=1ToMaxVlue

iVal=I/MaxVlue*100

IfI=StopValueThen

"//保存工作薄

"ActiveWorkbook.Save

CallSetBkColor(hDcStatusBar,GetSysColor(COLOR_BTNFACE))

CallSetTextColor(hDcStatusBar,FontColor)

Application.StatusBar=Prompt

EndIf

"//向进度条发送消息,以更改进度条的状态

SendMessagePbHwnd,PBM_SETPOS,ByValiVal,0&

NextI

"//清除进度条

DestroyWindowPbHwnd

"//恢复原来状态栏的字体

SelectObjecthDcStatusBar,hFontOld

"//释放状态栏的设备场景

ReleaseDChwndStatusbar,hDcStatusBar

"//恢复原状态栏状态

Application.StatusBar=False

Application.DisplayStatusBar=oldStatusBar

EndSub

"//此为工作表中按钮调用程序

SubSaveWorkbook()

CallStatusBarMsg(-12,FW_BOLD,255,False,P_SMOOTH,800000,800000,"正在保存当前工作薄,请稍候……")

EndSub

下面是ThisWorkbook的代码

"//重置自定义设定

PrivateSubWorkbook_BeforeClose(CancelAsBoolean)

WithApplication

.CommandBars("WorksheetMenuBar").Controls("文件(&F)").Controls("保存(&S)").Reset

.CommandBars("Standard").Controls("保存(&S)").Reset

.OnKey"^s"

EndWith

EndSub

"//将菜单,工具栏和快捷键(Ctrl+S)上的保存菜单重设为执行自己的过程

PrivateSubWorkbook_Open()

WithApplication

.CommandBars("WorksheetMenuBar").Controls("文件(&F)").Controls("保存(&S)").OnAction="SaveWorkbook"

.CommandBars("Standard").Controls("保存(&S)").OnAction="SaveWorkbook"

.OnKey"^s","SaveWorkbook"

EndWith

EndSub

这样你就自定义好了进度条,可惜的是这个进度条还不算完善,它不能自行根据保存文件所需要的时间动态变化进度条的演示时间,还有,这时按菜单,工具栏与快捷键Ctrl+S其实都没有保存文件,我把保存文件的这行代码变成备注了!!请注意!点击下载完全代码。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。