VB6.0用掲示板の過去のログ(No.2)−VBレスキュー(花ちゃん)
[記事リスト] [新規投稿] [新着記事] [ワード検索] [管理用]

投稿日: 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押下 → 文字列が取得できない


- 関連一覧ツリー (★ をクリックするとツリー全体を一括表示します)

- 返信フォーム (この記事に返信する場合は下記フォームから投稿して下さい)

- VBレスキュー(花ちゃん) - - Web Forum -