我想用DrawText函数在窗体上动态绘制从9到0反复循环的倒计时效果,于是我在SetTimer的回调函数中写了如下所示的代码:Private Sub TimerWndProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal nidEvent As Long, ByVal dwTime As Long)
Dim udtClientArea As RECT
Dim lnghDC, hTmpDC, hTmpBitmap, hBrushBmp As Long
If (uMsg = WM_TIMER) And (nidEvent = m_lngTimerID) Then
Call GetClientRect(hWnd, udtClientArea)
With udtClientArea
.Left = 32&
.Top = 40&
.Right = 84&
.Bottom = 84&
End With
lnghDC = GetDC(hWnd)
hTmpDC = CreateCompatibleDC(lnghDC)
hTmpBitmap = CreateCompatibleBitmap(lnghDC, udtClientArea.Right, udtClientArea.Bottom)
hBrushBmp = SelectObject(hTmpDC, hTmpBitmap)
With udtClientArea
Call BitBlt(hTmpDC, .Left, .Top, .Right, .Bottom, lnghDC, .Left, .Top, SRCCOPY)
End With
Call SetTextColor(hTmpDC, &H0&)
Call DrawText(hTmpDC, CStr(m_lngSecondsNumber), -1&, udtClientArea, DT_CENTER Or DT_VCENTER Or DT_SINGLELINE Or DT_END_ELLIPSIS)
With udtClientArea
Call BitBlt(lnghDC, .Left, .Top, .Right, .Bottom, hTmpDC, .Left, .Top, SRCCOPY)
End With
Call SelectObject(hTmpDC, hBrushBmp)
DeleteObject hTmpBitmap
DeleteDC hTmpDC
Call ReleaseDC(hWnd, lnghDC)
m_lngSecondsNumber = m_lngSecondsNumber - 1&
If m_lngSecondsNumber < 0& Then m_lngSecondsNumber = 9&
End If
End Sub
现在可以实现倒计时了,可还存在两个问题我无法解决。
1、为什么用DrawText直接在窗体的hDC上绘制的文本周围就是透明的不会出现白底色,而在CreateCompatibleDC创建的兼容设备中绘制文本再用BitBlt拷贝到窗体上文本周围就会出现白底色。请问这个问题怎么解决呢?
2、请问用DrawText绘制文本时有办法设置字号吗,如果想绘制大点儿的字符该怎么办呢?
Dim udtClientArea As RECT
Dim lnghDC, hTmpDC, hTmpBitmap, hBrushBmp As Long
If (uMsg = WM_TIMER) And (nidEvent = m_lngTimerID) Then
Call GetClientRect(hWnd, udtClientArea)
With udtClientArea
.Left = 32&
.Top = 40&
.Right = 84&
.Bottom = 84&
End With
lnghDC = GetDC(hWnd)
hTmpDC = CreateCompatibleDC(lnghDC)
hTmpBitmap = CreateCompatibleBitmap(lnghDC, udtClientArea.Right, udtClientArea.Bottom)
hBrushBmp = SelectObject(hTmpDC, hTmpBitmap)
With udtClientArea
Call BitBlt(hTmpDC, .Left, .Top, .Right, .Bottom, lnghDC, .Left, .Top, SRCCOPY)
End With
Call SetTextColor(hTmpDC, &H0&)
Call DrawText(hTmpDC, CStr(m_lngSecondsNumber), -1&, udtClientArea, DT_CENTER Or DT_VCENTER Or DT_SINGLELINE Or DT_END_ELLIPSIS)
With udtClientArea
Call BitBlt(lnghDC, .Left, .Top, .Right, .Bottom, hTmpDC, .Left, .Top, SRCCOPY)
End With
Call SelectObject(hTmpDC, hBrushBmp)
DeleteObject hTmpBitmap
DeleteDC hTmpDC
Call ReleaseDC(hWnd, lnghDC)
m_lngSecondsNumber = m_lngSecondsNumber - 1&
If m_lngSecondsNumber < 0& Then m_lngSecondsNumber = 9&
End If
End Sub
现在可以实现倒计时了,可还存在两个问题我无法解决。
1、为什么用DrawText直接在窗体的hDC上绘制的文本周围就是透明的不会出现白底色,而在CreateCompatibleDC创建的兼容设备中绘制文本再用BitBlt拷贝到窗体上文本周围就会出现白底色。请问这个问题怎么解决呢?
2、请问用DrawText绘制文本时有办法设置字号吗,如果想绘制大点儿的字符该怎么办呢?
解决方案 »
- 易语言程序通过外网访问内网MSSQL数据库问题
- VB热键问题!如何取得同时按下数字键1和数字键9的键值..大家帮帮忙啊..忙.
- 关于抓取网页信息的问题(使用ADODB.Stream时出错)
- 有人试过连接access2003数据库吗?可以连吗?
- 帮我看看,这句C语言是什么意思,怎么转化为VB语言?
- 互联网络连接数据库的问题?
- vb能否做多线程的程序,高分求解
- 关于Socket控件,高分求解
- 急!!关于dll的总题
- 200分大馈赠!哪位大虾能给我邮寄一份SAPI5.0,小弟愿意给您200分(先给30分)
- 如何准确获取windows系统版本。
- 高手请进!客户端无法捕获SoapException类型的异常!
基本用法,setbkmode htmpdc,0 '(是不是0去查api的常数说明,我记得是0)2. 查api createfont系列api
hFont = createfont 参数...
selectobject htmpdc,hFont