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