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

投稿時間:2004/03/31(Wed) 11:48
投稿者名:おじん
URL :
タイトル:
GDIリソースが減っていく、、、
小さな(32ピクセル)画像イメージを多く(109個)使って表示している
のですが、テスト実行を3回行うと「リソースが不足〜」のコメントがでます。
パソコンを再起動すれば復帰しますが、何か気分がよくありません。
画像が関連するソース部分例は次のとおりです。よくないところ、または回避
方法を教えてください。
Win98 VB6(SP6) memory 128M

画像を読みこむ 画像名例は、 1A.gif, 2B.gif, 3C.gif,,,,,
                       gTbl(n).sign に A,B,C,,などがセットしてある
    Dim n%
    For n = 0 To 108
        gifName = App.Path & "\" & CStr(n + 1) & gTbl(n).sign & ".gif"
        If n > 0 Then
            Load Picture2(n): Picture2(n).Visible = True
        End If
        Set Picture2(n).Picture = LoadPicture(gifName)
    Next n

読み込んだ画像を表示する    gTbl(n).X gTbl(n).Y に表示する座標位置が
              セットされている
    Dim n, w&, h&, c&
    
    w = Picture2(0).Width / Screen.TwipsPerPixelX
    h = Picture2(0).Height / 15
    c = GetPixel(Picture2(0).hdc, 0, 0)
    For n = 0 To 108
        TransparentBlt Picture1.hdc, gTbl(n).X, gTbl(n).Y, w, h, _
            Picture2(n).hdc, 0, 0, w, h, c
    Next n
    Picture1.Refresh

まだテストはしていませんが、設計時点でPicture2(n)のPicutreに画像を
セットしても「リソース不足〜」は起こるのでしょうか?

よろしくお願いいたします。

投稿時間:2004/03/31(Wed) 14:18
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re: GDIリソースが減っていく、、、
リソースが不足するのは、PictureBoxを大量に利用しているからだと思います。
PictureBoxではなく、ImageListコントロールに格納するようにしてみては如何でしょう。
(TransparentBlt の部分は、Drawメソッドで代用)

投稿時間:2004/03/31(Wed) 14:28
投稿者名:おじん
URL :
タイトル:
Re^2: GDIリソースが減っていく、、、
> リソースが不足するのは、PictureBoxを大量に利用しているからだと思います。
> PictureBoxではなく、ImageListコントロールに格納するようにしてみては如何でしょう。
> (TransparentBlt の部分は、Drawメソッドで代用)
ImageListコントロールは使ったことがないのですがやってみます。
迷路に入りましたら、また投稿させていただきます。
ありがとうございました。

投稿時間:2004/03/31(Wed) 16:05
投稿者名:おじん
URL :
タイトル:
Re^2: 回避はできたが、、、
MSDNに丁度いいサンプルがあり「回避の方法」は解決しました。
ありがとうございました。が、新たな問題(疑問)が発生しました。
蛇足ですが、書き換えたソースを載せます。

'イメージを読みこむ
    Dim n%
    Dim imgX As ListImage
    For n = 0 To 108
        gifName = App.Path & "\genso\" & _
                CStr(n + 1) & gTbl(n).sign & ".ico"
        Set imgX = ImageList1.ListImages. _
                            Add(, , LoadPicture(gifName))'<---ここを変えた
    Next n
End Sub

'イメージを表示
    Dim n%
    'Picture1.ScaleMode = vbPixels
    ' MaskColor を設定します。これが透過になります。
    ImageList1.MaskColor = vbWhite
    For n = 0 To 108
        ' MaskColor を透過色としてイメージを描画します。
        ImageList1.ListImages(n + 1).Draw Picture1.hdc, _
                    gTbl(n).X, gTbl(n).Y, imlTransparent'<---ここも変えた
        ' イメージを標準スタイルで描画します。
        'ImageList1.ListImages(1).Draw Picture1.hdc, g, g, imlNormal
        ' 選択スタイルでイメージを描画します。
        'ImageList1.ListImages(1).Draw Picture1.hdc, g, g, imlSelected
        ' フォーカス スタイルでイメージを描画します。
        'ImageList1.ListImages(1).Draw Picture1.hdc, g, g, imlFocus
    Next n
    Picture1.Refresh
End Sub

新たな問題とは、表示位置(x,y)が思うところ(gTbl(n).X,gTbl(n).Y)にならない。
(先のソースの時にgTblの値が正しいことは確認済みです)
それで次のようにしてテストをしてみたが、やはり思うところ(X,Y)には表示されない。
PictureBoxの原点(左上)近くに集まります。値をDisplayしてみると正しい値なので
すが、、、。

Private Sub Picture1_MouseUp( _
        Button As Integer, Shift As Integer, _
        X As Single, Y As Single)
    Static n%
    n = n + 1
    ImageList1.MaskColor = vbWhite
    ImageList1.ListImages(n).Draw Picture1.hdc, X, Y, imlTransparent
    Picture1.Refresh
End Sub

よろしくご指導のほどをお願いいたします。

投稿時間:2004/04/02(Fri) 14:21
投稿者名:おじん
URL :
タイトル:
Re^3: 解決しました
ImageList1.ListImages(n).Drawを使用する場合は、PictureBoxのScaleModeがどうであれ、
X,Yの値は、Twips単位で指定しなければならない(こうすれば解決する)ようです。
ありがとうございました。