投稿日 | : 2005/11/16(Wed) 13:51 |
投稿者 | : GOD |
Eメール | : |
URL | : |
タイトル | : ステータスバーの文字列を取得 |
ステータスバーの文字列の色を変更したく、WM_PAINT時に自分で描画しようとしています。
そこでウィンドウハンドルからステータスバーの文字列を取得したいのですが、正しく取得できま
せん。
現状、問題点は2つあります。
1)StatusBar1.Panelsで設定した文字列を取得できない。
2)SB_SETTEXTで文字列を設定すると一時的に文字列を取得できるが、ウィンドウサイズを変更す
ると文字列が取得できなくなる。
上記問題点はオーナードローとは関係なく普通に行っても同様の現象が出てしまいます。
自分で文字列を描画する時は、コントロールの持っている文字列(Panelsで設定した文字列)は取得
できないものなのでしょうか。
現在、回避法としてステータスバーオブジェクトをグローバル変数に退避するくらいしか思いつか
ないのですが他に良い方法はありませんでしょうか。問題点の1が解決してくれるのが一番いいの
ですが...
環境:Win2000+SP4, IE6+SP1, VB6+SP5
サンプル:
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA"
(ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
lParam As Any) As Long
Private Const WM_USER As Long = &H400
Private Const SB_SETTEXTA As Long = (WM_USER + 1)
Private Const SB_GETTEXTA As Long = (WM_USER + 2)
Private Const SB_GETTEXTLENGTHA As Long = (WM_USER + 3)
'文字設定ボタン
Private Sub Command1_Click()
Dim strText As String
strText = StrConv("Test", vbFromUnicode)
'文字列設定
Call SendMessage(StatusBar1.hwnd, SB_SETTEXTA, 0, ByVal StrPtr(strText))
End Sub
'文字取得ボタン
Private Sub Command2_Click()
Dim strText As String
Dim lngLen As Long
'文字数取得
lngLen = SendMessage(StatusBar1.hwnd, SB_GETTEXTLENGTHA, 0, 0) And &HFFFF&
If lngLen = 0 Then
Debug.Print "文字列なし"
Exit Sub
End If
strText = String(lngLen, vbNullChar)
'文字列取得
Call SendMessage(StatusBar1.hwnd, SB_GETTEXTA, 0, ByVal StrPtr(strText))
strText = StrConv(strText, vbUnicode)
strText = Left(strText, InStr(1, strText, vbNullChar) - 1)
Debug.Print strText
End Sub
'文字設定2ボタン
Private Sub Command3_Click()
StatusBar1.Panels(1).Text = "Test"
End Sub
問題点1の再現法:
1)Command3押下
2)Command2押下 → 文字列が取得できない
問題点2の再現法:
1)Command1押下
2)Command2押下 → 文字列が取得できる
3)Windowサイズを変更
4)Command2押下 → 文字列が取得できない