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

投稿日: 2004/08/05(Thu) 12:59
投稿者おじん
Eメール
URL
タイトルAutoRedrawについて

AutoRedrawの動作について調べるために下記のコードを作成したました。
処理の内容:原画(Picture1)を任意の角度で回転し描画する
      (描画には、LoadPicture、BitBltを使用しています)
質問の内容:結果的には思考錯誤のすえ、どうにかなりそうなのですが(未解決)、
      AutoRedrawの組み合わせでその結果(表示・非表示)が違ったものですから。
      「正しい使い方」は?、或いは「結果オーライ」なのか。
      AutoRedrawを使うときの留意点(他に影響あること)について。
Picture1がForm上に見える場合は、4通りのどの組み合わせでも正常(表示される)
に動作するようですので省きます。Form上に見えない場合に限って、
1.一度テスト起動して(開始ボタンで)、4通りの組み合わせをテストすると
  Picture2に表示されない組み合わせがある。
2.それぞれの組み合わせを「開始ボタン→テスト→中止」でやると1.と同じ組み合
  わせでも、1.の結果と違うことがある。

まだ、日本語が十分でないようですが、この範囲で伝わりましたらよろしく
お願いいたします。


蛇足ですが、AutoRedrawのプロパディは、次のように説明されています。
True の場合、
Form オブジェクトまたはピクチャ ボックス (PictureBox) コントロールは、自動的に再描画されます。グラフィックスとテキストは、画面に表示されるだけでなく、同時にメモリ イメージとしても保持されます。そのオブジェクトの再描画が必要なときには、オブジェクトは Paint イベントを受け取らず、メモリ イメージが使われます。

再描画とは、
グラフィックス メソッドによる出力が、メモリに格納されます。継続表示属性を持つグラフィックスは、ほかのウィンドウの後ろに隠れているフォームを再表示するときなど、ある種の画面イベントが発生したときに自動的に保存されます。グラフィックスが継続表示属性を持つのは、AutoRedraw プロパティに真 (True) が設定されている場合です。


PictureBox 2つ、CheckBox 2つ、TextBox 1つ、CommandButton1つ。
重要なことは、Picture1は設計後(実行前)に、Formから見えないように、Formサイズを
小さくしておかなければなりません。またそれができるようなところにPictureBoxをおく
必要があります。

Option Explicit
Private Declare Function BitBlt Lib "gdi32" ( _
        ByVal hDestDC As Long, _
        ByVal x As Long, ByVal y As Long, _
        ByVal nWidth As Long, ByVal nHeight As Long, _
        ByVal hSrcDC As Long, _
        ByVal xSrc As Long, ByVal ySrc As Long, _
        ByVal dwRop As Long) As Long


Private Sub Check1_Click()  'Picture1 用
If Check1.Value = 1 Then
    Picture1.AutoRedraw = True
Else
    Picture1.AutoRedraw = False
End If
End Sub

Private Sub Check2_Click()  'Picture2 用
If Check1.Value = 1 Then
    Picture2.AutoRedraw = True
Else
    Picture2.AutoRedraw = False
End If
End Sub


Private Sub Command1_Click()
    Set Picture1.Picture = LoadPicture()
    Picture2.Cls                          'False の場合?
    Set Picture1.Picture = LoadPicture(Text1.Text)
    '中央付近に描画
    BitBlt Picture2.hdc, _
          (Picture2.ScaleWidth - Picture1.ScaleWidth) \ 2, _
          (Picture2.ScaleHeight - Picture1.ScaleHeight) \ 2, _
          Picture1.ScaleWidth, Picture1.ScaleHeight, _
          Picture1.hdc, 0, 0, vbSrcCopy
End Sub


Private Sub Form_Load()
    '50 Pixels程度の小さい画像
    Text1.Text = "f:\temp_bmp\asiR0.bmp"
    With Picture1               '初期値
         .Autoredraw=False
         .ScaleMode=vbPixels
         .AutoSize=True
    End With
    With Picture2
         .Autoredraw=False
         .ScaleMode=vbPixels
         .Width=3885          '理屈ではPicture1.ScaleWidth,Heightの
         .Height=3885     'ルート2倍でいいはず?
    End With
    Check1.value=0
    Check2.value=0
End Sub


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

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

- Web Forum -