[リストへもどる]
一括表示

投稿時間:2003/07/28(Mon) 16:36
投稿者名:tak
Eメール:
URL :
タイトル:
ListBoxの背景色をFormと一緒にしたいのですが・・
こんにちは!いつも参考にさせてもらっています。
実は、リストボックスの背景色をフォームの背景色と同じにしたいのです。
イメージとしては「リストボックスを透過させてフォームの背景色に溶け込ませる」感じです。
ラベルならば「BackStyle」キャプションで透過させることができたのですが・・。

・・というのもフォームの背景色を少し凝ったつくりにしてデフォルト色にない色にしているのです。ちょうど、VBのキャプションバーのように下から濃紺、上に行くにつれ薄薄青という感じです。

もし、ご存知の方がいらしたら是非、ご教授お願いいたします。

投稿時間:2003/07/28(Mon) 17:26
投稿者名:Say
Eメール:
URL :
タイトル:
Re: ListBoxの背景色をFormと一緒にしたいのですが・・
オーナードローすれば可能かと。

「オーナードロー」については自分で調べてみてください。

投稿時間:2003/07/29(Tue) 09:33
投稿者名:tak
Eメール:
URL :
タイトル:
オーナードローじゃ無理・・??
> 「オーナードロー」については自分で調べてみてください。
調べました。読んで字のごとく「自分で描画する」という事ですね。
確かに自分で描画する際に画像を読み込ませれる事はできますが、今回のように透過させて
背景に溶け込ませる事はできないのではないででしょうか?

下記が背景色イメージとして、この背景色イメージをオーナードローで描画すると、
白白白
白白白
水水水
水水水
緑緑緑
緑緑緑
青青青
青青青

こんな風になってしまって背景色に溶け込ませる事ができません・・。
白白白
白白白
水水水
水白水
緑水緑
緑緑緑
青青青
青青青

すごい分かりにくくてすみません・・。白水緑青イメージの中にまた白水緑青イメージ
がある、感じです。

投稿時間:2003/07/29(Tue) 11:37
投稿者名:Say
Eメール:
URL :
タイトル:
Re: オーナードローじゃ無理・・??
Win2000以降限定でよければレイヤードウィンドウでも可能かと・・・。

「レイヤードウィンドウ」については自分で調べてみてください。

投稿時間:2003/07/29(Tue) 12:53
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
代替案
> Win2000以降限定でよければレイヤードウィンドウでも可能かと・・・。
Layered Windowって、コントロール単位ではなく、
フォーム単位でしか適用できなかったような気がします。(未確認)


で、オーナードローに対する代替案を考えて見ました。
ListBoxの替わりに、ListViewコントロール(Ver.6)を利用しています。
これならば、APIを使わずに済むかも。

'===================
Option Explicit

Private Sub Form_Load()
    Me.AutoRedraw = True
    Me.ClipControls = False
    With Me.Picture1
        .AutoRedraw = True
        .Visible = False
        .BorderStyle = 0
        .ScaleMode = vbPixels
    End With
    With Me.ListView1
        Me.Picture1.Move -.Width, -.Height, .Width, .Height

        .View = lvwReport
        .FullRowSelect = True
        .HideSelection = False
        .HideColumnHeaders = True
        .ForeColor = vbWhite
        .ColumnHeaders.Add().Width = .Width - Screen.TwipsPerPixelX * 4
    
        .ListItems.Add Text:="第1の項目"
        .ListItems.Add Text:="第2の項目"
        .ListItems.Add Text:="第3の項目"
        .ListItems.Add Text:="第4の項目"
    End With
End Sub

Private Sub Paint()
    Dim H As Long
    Me.Scale (0, &H0)-(1, &H100)
    For H = &HFF To 0 Step -1
        Me.Line (0, H)-(1, H + 1), RGB(&H22, &H11, H), BF
    Next
    Me.ScaleMode = vbPixels
    
    With Me.ListView1
        Me.Picture1.PaintPicture _
            Me.Image, _
            0, 0, Me.Picture1.Width, Me.Picture1.Height, _
            .Left, .Top, .Width, .Height
    End With
    Set Me.ListView1.Picture = Me.Picture1.Image
End Sub

Private Sub Form_Resize()
    Paint
End Sub

投稿時間:2003/07/29(Tue) 13:38
投稿者名:Say
Eメール:
URL :
タイトル:
Re: 代替案
> > Win2000以降限定でよければレイヤードウィンドウでも可能かと・・・。
> Layered Windowって、コントロール単位ではなく、
> フォーム単位でしか適用できなかったような気がします。(未確認)

私もForm以外で使えるかどうか知りませんので、
だいたいこういう感じで考えてます。

Form1を動かすと、ListBoxが微妙に遅れてついてきますが・・・。 (^_^;

Option Explicit

Private Sub Form_Load()
Dim i As Long
    Form2.Show , Me
    Form2.Left = Me.Left + 1000
    Form2.Top = Me.Top + 1000
    hListBox = Form2.List1.hwnd
    For i = 0 To 25
        Form2.List1.AddItem String(10, Chr(Asc("A") + i))
    Next
    
    ExStyle = GetWindowLong(Form2.hwnd, GWL_EXSTYLE)
    ExStyle = ExStyle Or WS_EX_LAYERED
    SetWindowLong Form2.hwnd, GWL_EXSTYLE, ExStyle
    SetLayeredWindowAttributes Form2.hwnd, vbWhite, 0, LWA_COLORKEY
    Timer1.Interval = 10
    Timer1.Enabled = True
    
End Sub

Private Sub Form_Unload(Cancel As Integer)
    Timer1.Enabled = False
End Sub

Private Sub Timer1_Timer()
    Form2.Left = Me.Left + 1000
    Form2.Top = Me.Top + 1000
End Sub

投稿時間:2003/07/29(Tue) 16:42
投稿者名:tak
Eメール:
URL :
タイトル:
代替案を応用して・・
>Sayさん、魔界の仮面弁士さん
レスありがとうございます。
実は魔界の仮面弁士さんの代替案で気付いた事があります。
PictureBoxにイメージを作成してからそれを、ListViewにロードしているますよね。
いわばPictureBoxをワークエリアにしてる感じでしょうか。
なら、これを応用すれば最初に教えて下さったSayさん案のOwnerDrawを活用すればListBoxでもなんとかなるのではないかという結論に達しました。
VBではOwnerDrawなどあまり一般的でないようですね。苦し紛れのテクニックみたいな感じで。実際、自分もVBでグラフィック操作はした事なくて、今苦闘しながら調べています。

単なる途中経過報告でしかないんですが・・。