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

投稿時間: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

投稿時間:2004/08/05(Thu) 23:00
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re: AutoRedrawについて
> AutoRedrawの動作について調べるために下記のコードを作成したました。
何がお知りになりたいのか知りませんが、描画した画像が消えないようにしたいなら
プロパティで AutoRedraw=True に設定しておけばいいだけですが。

投稿時間:2004/08/06(Fri) 04:26
投稿者名:おじん
Eメール:
URL :
タイトル:
Re^2: AutoRedrawについて
> > AutoRedrawの動作について調べるために下記のコードを作成したました。
> 何がお知りになりたいのか知りませんが、描画した画像が消えないようにしたいなら
> プロパティで AutoRedraw=True に設定しておけばいいだけですが。
やっぱり日本文が通じなかったようです。
2つのPicgtureBoxについて、
1つ目は、ファイルからPicture1へ、2つ目はPictureBox1からPicture2へイメージを
移すとき、それぞれのAutoRedrawのプロパディがTrue、Falseの組み合わせによって、
「描画したり(=画像が見える)、描画されない(=画像が見えない)」ことがある。
言い換えると、AutoRedraw=Trueでも描画されなかったり、反対に、
AutoRedraw=Falseでも描画されたりすることがある(Picture1=Trueは必須のよう)。
ただしPicture1がForm上にある=隠れていない場合は、Falseでも描画される。
テストで「目的にかなう組み合わせが見つかっていますので」結果オーライでやります。

投稿時間:2004/08/06(Fri) 06:32
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^3: AutoRedrawについて
両方とも .AutoRedraw = True のままにしておけば、 Picture1.Visible = False でも
Picture2 に画像が転送されますが。
又、デザイン時にプロパティに画像ファイルを指定しておけばメモリに読み込まれるので
.AutoRedraw =Falseでも表示されます。
.AutoRedraw =False でも画像が表示されているタイミングなら転送可能ですが、最小化や
裏に隠れると消えます。

デザイン時にプロパティに画像ファイルを指定して表示させておくのと
Set Picture1.Picture = LoadPicture(Text1.Text) では、まったく違います。
Set Picture1.Picture = LoadPicture(Text1.Text) は描画になり、.AutoRedraw =False
だと表示していないと転送できません。又、マシンが高速だと完全に表示される前に
転送され表示できない場合があります。

    Picture2.Cls                          'False の場合?
    Set Picture1.Picture = LoadPicture(Text1.Text)
    
    DoEvents
のように DoEvents を入れると表示されません。
基本的に転送したり、印刷したり、描画したものが消えては困る場合は、.AutoRedraw = True
にしておく必要がありますので、前回のような回答をしたまでです。
又、メモリや処理速度に特に問題がなければプログラム上で.AutoRedraw = True や
False に切り替える必要がないかと思います。

投稿時間:2004/08/06(Fri) 11:16
投稿者名:おじん
Eメール:
URL :
タイトル:
Re^4: AutoRedrawについて
いつもありがとうございます。感謝もうしあげております。

> 両方とも .AutoRedraw = True のままにしておけば、 Picture1.Visible = False でも
> Picture2 に画像が転送されますが。
「Formをみえなくする」とは、Formを小さくすることで、.Visible=Falseではありませんでした。

> 又、デザイン時にプロパティに画像ファイルを指定しておけばメモリに読み込まれるので
以下の解説が「本質的」に理解できていないのだと思いました。これまで思考錯誤でやっていました
から。設計時、あるいはそうでない時で状況が変わること、思いもしませんでした。ましてや、
マシン、メモリ、処理速度などに関係することなど。(テスト中、何かのときに、画像がチカッと
一瞬表示し瞬時消えることがあったのですが、なにか関連あったのでしょうか)
AutoRedrawのテストをしようとしてつくったプログラムそのものが「正しく、適切」でなかった
ようです。上記括弧の例以外にも「おかしいな」と思う理由不明の現象がありました。

>     DoEvents
> のように DoEvents を入れると表示されません。
良くわからずに使っています。これも「テストねた」の一つです。

> 基本的に転送したり、印刷したり、描画したものが消えては困る場合は、.AutoRedraw = True
プロパディの説明に、「自動的に再描画〜」「継続表示属性を持つ〜」とあります。が、
「〜消えては困る場合は〜」のような説明でないと理解できないようです。なにせ、高校時代の
国語の成績は「2」でしたから。でも、63歳までどうにか生きてこれた、みなさんのおかげで。