問題タブ [onpaint]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
3 に答える
8908 参照

c# - (C#)graphics.drawImageにはサイズ制限がありますか?どのように対処しますか?

一部のデータの非常に大きなグラフィック表現を表示しようとしています。画像の永続的な保存とe.Graphics.DrawImage(myBitmap, new Point(0,0))フォー​​ムのPictureBoxコントロールのonPaintにビットマップを使用しています。画像の高さまたは幅が2^15を超える場合、Parameter not Valid例外が発生することに気づきました(他のサイトで言及されています)が、この制限に関する公式のドキュメントは見つかりませんでした。

この2^15の画像サイズ制限は、の明確な公式部分Graphics.DrawImageですか?画像全体をフォームにレンダリングするための簡単な回避策はありますか?

(はい、pictureBoxは画像と同じかそれ以上のサイズに設定されています。ただし、質問として、画像ボックスの代わりにフォーム自体のonPaintを使用する必要がありますか?)

0 投票する
2 に答える
1481 参照

c# - Onpaint イベント (無効化) 一定期間の通常操作 (実行時) 後に実行順序を変更する

ペイント イベントを介して描画される 3 つのデータ グラフがあります。グラフに挿入する必要があるデータがある場合、コントロールの invalidate() コマンドを呼び出します。

最初のコントロールのペイント イベントは、他の 2 つのグラフのビットマップ バッファを実際に作成し、長いループの繰り返しを回避します。

したがって、無効化コマンドは特定の順序 (1、2、3) になっています。これはうまく機能しますが、グラフ化されたデータが通常はスクロールを開始するグラフ ウィンドウ (PictureBox) の最後に到達すると、ペイント イベントが間違った順序 (2、3、1) で発生し始めます。

誰もこれに遭遇したことがありますか?なぜこれが起こっているのでしょうか?

0 投票する
1 に答える
726 参照

c# - Visual C# - onPaint と透明度

2 つの半透明のテキストで単純なフォームを作成し、それをペイント イベントに入れています。ただ、フォームの幅を広げると、テキストが暗くなり、粒子が粗くなります。実際には、より暗い色が必要ですが、粒子の粗い効果は必要ありません。

ここに私のコードスニペットがあります:

前もって感謝します

0 投票する
2 に答える
557 参照

c# - フォームに複数の長方形を描画するときに発生したGDI+の問題

GDI +を使用してC#Windowsフォームでテーブルを描画したいと思います。長方形の数が多すぎてすべての長方形をフォームに表示できない場合、フォームはスクロールしません。そして、フォームに適合しなかった人にはアクセスできません。

フォームに描画するすべてのものを表示するには、何をする必要がありますか?

ありがとう。

0 投票する
2 に答える
421 参照

c# - ユーザー コントロールの増加が更新されない

私は C# と .Net 2.0 で開発しています。セルの最大数に応じてセル (円柱状) を描画するユーザー コントロールがあります。必要なセルを生成する描画ルーチンがいくつかあります。このコントロールの高さを調整するプロパティ NumberOfCells があります。CELLHEIGHT_CONSTANT * NumberOfCells. OnPaint() メソッドがオーバーライドされます (セルの数を描画するコード)。

上記の userControl1 を含むパネルを含む別のユーザー コントロールがあります。userControl1 の NumberOfCells を変更するプロパティ NumberCells があります。

次に、UserControl2 が Windows フォームに配置されます。そのフォームには、NumericUpDown コントロールがあります (1 からのみ増加します)。ユーザーが 1 ずつインクリメントすると、VerticalScroll.Maximum も 1 ずつ調整します。

すべてがうまく機能しますが、一度インクリメントすると、パネルは正常に更新されますが (必要に応じて垂直スクロールが挿入されます)、セルが追加されません! userControl2 とフォームで無効化を試みましたが、新しく追加されたセルを描画するものはないようです。

任意の支援をいただければ幸いです。前もって感謝します。

  • ローレンス
0 投票する
1 に答える
816 参照

c# - フォームが下にあるときのコールバック中の OnPaint イベント?

次のシナリオを想像してください。

これで、フォームの読み込み時に OnePanelInThisForm が正しく描画されるようになりました。ただし、「SomeForm」から SomeEventOcurred が発火した場合、ペイント イベントは発火しません。フォームを閉じて再度開くと、正しく再描画されます。実行するフォームにボタンを追加すると: OnePanelInThisForm.Invalidate(); パネルは正しく再塗装されています。

私は何が欠けていますか?

更新: 明確化。(そもそもこれをやらないのか…)

私はFORM_Aを持っています。この FORM_A には、Paint イベントをオーバーライドする Panel があります。標準の WinForm です。ペイントでは円を描きます。これは機能します。FORM_A には FORM_B を開くボタンがあることがわかります。ただし、それを実行する前に、FORM_B の SomeEvent というカスタム イベントをサブスクライブします。(上記のサンプルを参照してください)。したがって、FORM_B は FORM_A に「SomeEvent」について伝えることができます。

現在、FORM_B も通常の WinForm です。そして、それは通常のボタンを持っています。そのボタンの Click イベントで、FORM_C を開きます。FORM_C にも SomeEvent というイベントがあり、明らかに FORM_B はそのイベントを購読しています。まったく同じように。FORM_C には、そのイベントをトリガーするボタンがあり、関心のあるサブスクライバーに通知するという考え方です。この場合、FORM_C がイベントを発生させると、FORM_B がサブスクライブされ、関心があります。

FORM_B が Call Back を受信すると、それが行う唯一のことは、イベントが発生したことを関係者 (この場合は FORM A) に通知することです。

ここで、フォーム C がまだトップ フォームであっても、コールスタックは FormA に戻り、最初のイベントからコールバックとして定義されたメソッドに戻ります。

このコードは実行されます。それが実際に行うのは、somePanel.Invalidate() (または Refresh()、同じ結果) だけです。

そのパネルの PAINT メソッドのブレークポイントは、コードが呼び出されないことを示しています。無効化されているにもかかわらず、ペイント イベントは発生しません。これは、フォーム (したがってパネル) が実際には FORMB と FORMC (まだ開いている) で覆われているために起こると思います。

それだけです。フォーム C を閉じてからフォーム B を閉じても、フォーム A はまだペイント イベントを発生させません。フォームのアクティブ化でパネルを無効化しようとしましたが、それは起こりません。

フォーム A を閉じて再度開くと、もちろん、図面は正しいです。

これがより明確になることを願っています。

これは非常に単純なので、それほど多くのコードはありません。FORM A > B > C (発火イベント) -> B -> A -> Invalidate()。

0 投票する
2 に答える
753 参照

c++ - Windowsのペイントイベントでの例外とアクセス違反

いくつかの新しいコードを実行した後、私のC ++アプリケーションは奇妙な動作を始めました(画面の更新が正しくないか不完全であり、画面の更新がまったくない場合もあります)。しばらくすると、新しいコードがアクセス違反を引き起こしていることがわかりました。不思議なことに、アプリケーションは単に実行を続けます(ただし、画面の更新が正しくありません)。

最初は、問題の原因は「try-catch(...)」構造(過度にアクティブな元同僚によって配置された)であると考えましたが、数時間後(呼び出しスタックを注意深く調べ、多くのブレークポイントを追加し、... )ペイントイベントでアクセス違反が発生した場合、Windowsはそれをキャッチし、単にアプリケーションの実行を継続することがわかりました。

  • これは正常な動作ですか?
  • ペイントイベント中にWindowsが例外/エラーをキャッチするのは正常ですか?
  • これを無効にする方法はありますか?(そうでない場合は、コードのテスト中にすべての例外を有効にして、常にデバッガーで実行する必要があることを意味します)。

編集:

  • XPでは、正しくクラッシュします(アクセス違反後の必要な動作)
  • VistaおよびWindows7では、アプリケーションは引き続き実行されます
0 投票する
4 に答える
32155 参照

c# - C#でデスクトップに効果的に描画する方法は?

C#でデスクトップに直接描画したい。少し検索したところ、Desktop HDC(null)のGraphicsオブジェクトを使用することになりました。次に、このGraphicsオブジェクトを使用して通常どおりにペイントしました。

問題は、画面のいずれかの部分を再描画すると、形状が失われることです。Whileループを試しましたが、実際にはアプリケーションが可能な限り高速に描画することになります。これは、デスクトップの更新速度ではありません。

通常、描画コードを「OnPaint」イベントに入れる必要がありますが、そのようなものはデスクトップには存在しません。

どうすればいいですか?

コード例:https ://stackoverflow.com/questions/1536141/how-to-draw-directly-on-the-windows-desktop-c

0 投票する
1 に答える
1062 参照

c++ - レイヤード ウィンドウで InvalidateRect を呼び出した後、OnPaint で空の更新矩形を取得する

透明なウィンドウで InvalidateRect を呼び出すと、空の更新長方形が表示される理由を理解しようとしています。アイデアは、ウィンドウに何かを描画したことです (描画のアルファが一時的に 1/255 に切り替えられます)。次に、それを完全な透明モード (つまり、アルファが 0) に切り替えて、デスクトップ & デスクトップ上の画面上で図面を移動できるようにします。

描画を移動しようとすると、境界の四角形を取得し、それを使用して InvalidateRect を呼び出します。

InvalidateRect(m_hTarget, &winRect, FALSE);

winRect が実際に正しいこと、m_hTarget が正しいウィンドウであること、およびその四角形が winRect を完全に取り囲んでいることを確認しました。

CWnd から派生した m_hTarget に対応するクラスの OnPaint ハンドラーに入ります。そこで CPaintDC を作成しますが、更新用の四角形 (dcPaint.m_ps.rcPaint) にアクセスしようとすると、常に空になります。この四角形は、画面を更新する必要があるかどうかを判断する関数に渡されます (透明なウィンドウの場合は UpdateLayeredWindow を使用)。

ここで空でない四角形をハードコードすると、残りのコードは正しく機能し、画面上で図面を移動できます。

InvalidateRect で「FALSE」パラメータを「TRUE」に変更しようとしましたが、効果はありませんでした。また、標準の CDC を使用してから、OnPaint ハンドラーで BeginPaint/EndPaint メソッドを使用して、CPaintDC が奇妙なことをしていないことを確認しましたが、同じ結果が得られました。

私が使用しているコードは、もともと不透明なウィンドウ用に設計されたものです。m_hTarget が不透明なウィンドウに対応する場合、同じ関数呼び出しのセットにより、正しい (つまり、空ではない) 四角形が OnPaint に渡されます。ただし、ウィンドウがレイヤー化されると、正しく機能しないようです。

0 投票する
1 に答える
701 参照

compact-framework - NETCF - 最適化された再描画 (onPaint)

Compact Framework で再描画を最適化する方法について提案を求めたいですか? GetHashCode() は、常に異なるハッシュ コードを返すため、役に立ちませんでした。

とにかく、実行時にオブジェクトをドラッグしてサイズ変更できるプログラムがあります。このオブジェクトは透明なオブジェクトであり、オブジェクト クライアントのサイズに合わせて動的にサイズ変更される PNG 画像があります。

気がついたのですが (たとえば、4 つの透明なオブジェクトがあり、1 つをドラッグまたはサイズ変更しています)、3 つが動いていなくても、4 つすべてが OnPaintBackground をトリガーします。もう 1 つは、1 つのオブジェクトをタップするだけで、onPaintBacground() をトリガーします。とにかく、このイベントがトリガーされても問題はありません。

私がやりたいのは最適化です。つまり、必要なときにオブジェクトを再描画するだけで済みます。

皆さん、提案をお願いできますか?

ここに私の擬似C#コードがあります

前もって感謝します。