問題タブ [wm-paint]
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.
winapi - スクロールグラフ
スクロールバーを持つグラフを描画しようとしています
。グラフは x 軸に時間を使用し、x 軸を制限 (1 分) したい
ので、1 分までスクロールバーのページの長さですその後、スクロールバーが追跡するスクロールバーをドラッグする
と、ページは「60秒の長さ」になり、スクロールバーの最大値は「経過時間」の長
さになり、グラフの関連ビットがプルアップされます。
グラフは、ドラッグされるまで自動スクロールする必要があります(ドラッグして最大に戻ると、自動スクロールします)
これは私がこれまでに持っているものです
wndproc の先頭で定義されています
static SCROLLINFO sci = {sizeof(SCROLLINFO),SIF_RANGE|SIF_POS|SIF_PAGE|SIF_TRACKPOS,0,0,0,0,0};
WM_HSCROLL イベントで:
WM_PAINT から呼び出された描画コードで
(はい、ここでスクロールバーの情報を設定するべきではないことを理解しています。適切に機能したら、適切な場所に配置するつもりです)
グラフ描画関数の上部に:
static SCROLLINFO sci = {sizeof(SCROLLINFO),SIF_RANGE|SIF_POS|SIF_PAGE|SIF_TRACKPOS,0,0,0,0,0};
グラフ描画関数で:
グローバルの場合:
g_h_minX
は開始時間で
g_h_maxX
あり、最後の結果時間
MAX_TIME_WIDTH_MS
はミリ秒単位の「ウィンドウの長さ」です -> スクロールバーページの長さ (60 秒)
end
そのため、スクロール バーがどこにあるかを設定し、start
からウィンドウの長さを取得してend
、グラフのどの部分を見ようとしているかを計算します。
私は過去2日間これをいじっていましたが、アイデアが不足しています。近くにいると確信していますが、よくわかりません。
編集:
コードを少し更新しました
。問題が何であったかを言うのを忘れていたようです。
scolling コードが正しく機能していません。新しいデータが入ってくると自動
スクロールしますが、スクロールバーの端から親指をドラッグすると、最初にスナップして移動しません。詳しく調べると、矢印が機能し、右クリック メニューの「ページ右」「ページ左」が機能しますが、トラッキングは機能しません
任意の助けをいただければ幸いです。
前もって感謝します。
c++ - WM_PAINT Bitblit を複数回実行していますか?
これは C++ - win32 用です。基本的に、ファイルからイメージ (bmp) を HBITMAP にロードし、それをメイン ウィンドウのデバイス コンテキストにビットブリットしました。
画像を変更したい場合は、どうすれば再度呼び出すことができますか?
InvalidateRectangle() と UpdateWindow() を呼び出しましたが、ウィンドウ コントロールがちらつきます。
opengl - VCL コンポーネントによるアニメーション (WM_PAINT)
問題は、TForm コンポーネント (ボーダー、キャプションなど) でマウス ボタンをクリックすると、OpenGL アニメーションが停止することです。マウスボタンを放すとすぐにアニメーションが始まります。
フォームのサイズ、便利なリンクの変更中にアニメーションを停止しないようにするにはどうすればよいですか?
c++ - WM_PAINT と完了していない COM 呼び出し (ATL OOP サーバーの「デッドロック」)
STA ATL COM OOP サーバーを開発しましたが、すべて正常に動作します。私たちは問題に直面しています: COM クライアントは Windows メッセージを介して COM 呼び出しの結果を内部的に取得するため、COM 呼び出しの応答を待っている間に WM_PAINT メッセージ (または私が推測するその他のメッセージ) を処理できます。それ自体が問題になる可能性がありますが、大きな問題は、以前の COM 呼び出しが完了するまで、サーバーへのすべての呼び出しが失敗する (HRESULT=0x80010005) ことです。これは、アプリケーションで非常に頻繁に発生するため、非常に大きな問題です。ペイントから COM 呼び出しを削除することはできません。
私はこれについてかなり調査してきましたが、それに関するものは何も見つかりませんでした (問題を述べたこの2006 年の記事と、私たちの場合に適用できないいくつかの解決策を除いて) が、WM_PAINT だけでなく、 Windows イベント (メッセージ) 内で実行するサーバーへの呼び出しは、同じ問題を引き起こす可能性があります。
したがって、基本的にはさまざまな解決策がありますが、どの COM メソッドをどのように使用するかについての手がかりはありません。 1- 最後の COM 呼び出しが処理され、値が返されるまで待機するメソッドサーバーと COM 応答を処理するメソッド (すべてクライアントから呼び出されます) 3- クライアントに IMessageFilter クラスを実装できるかどうか、およびそれを処理して呼び出しを処理する方法などを理解します。
ありがとうございました!
c++ - WM_PAINT および WM_CTLCOLORSTATIC ハンドラーのコードを改善する
紹介と関連情報:
メイン ウィンドウの背景とその子静的コントロールの複雑な描画を実装しました。
下の写真はそれがどのように見えるかを示しています。
静的コントロールにはSS_NOTIFY
、ユーザーがクリックすると特定のことが起こるため、言及することが重要なスタイルがあります。
この時点で、それらをクリックしたときにアクティブ化されるアクションは関係ありません。
メイン ウィンドウと静的コントロールの両方に、GradientFill(...)
API を使用して作成されたグラデーションの背景があります。
メインウィンドウのトップバナーは灰色のブラシで作成し、グリッド線は API で作成しましLineTo(...)
たMoveTo(...)
。
オレンジ色のスタティック コントロールにマップします。左上のロゴはEMF
ファイル、右上のロゴはPNG
ファイル、その他の画像はビットマップです。
オレンジ色の静的コントロールには、スタイルを持つ 4 つの子静的コントロールがありowner drawn
ますSS_NOTIFY
。
これは私が考えた唯一の方法であり、要求された方法でコントロールを描画することができました (これを改善できる場合は、提案してください。合理的な提案を受け入れます)。
オレンジ色の静的コントロールを描画するために、WM_CTLCOLORSTATIC
ハンドラーでその背景を描画し、所有者がサブクラス プロシージャで子静的コントロールを描画することにしました。
子静的コントロールから受信した通知も、親ウィンドウに転送する方法がわからなかったため、オレンジ色の静的コントロール サブクラス プロシージャで処理されますが、現時点では関係がないため省略します。
この投稿をコード スニペットで非常に長くする代わりに、デモ プロジェクトへのリンクを提供することにしました。
可能な限り小さくてシンプルなデモ アプリケーションを送信しようとしました。
解説を省略していないので、すべてがソース コードで十分にカバーされ、説明されていると思います。
まだ質問がある場合は、コメントを残してください。できるだけ早く返信します (通常はすぐに、または少なくとも同じ日に)。
デモ プロジェクトへのリンクは次のとおりです: http://www.filedropper.com/geotermistgrafika_1
重要な更新:
/=============================================== =========/
角括弧内のテキストは質問の元の部分でしたが、プロジェクトにメモリ リークがあったため現在は省略されています。上記のリンクは改善されたバージョンにリンクしています。
[メンバー xMRi のコメントに応じて更新:このリンクは問題ないはずです: http://www.filedropper.com/geotermistgrafika ]
/=============================================== =========/
MS Visual Studio C++ と純粋な Win32 API を使用して、Windows XP で作業しています。
注: VS の Express エディションにはリソース エディターがないため、リソース ファイルとリソース ヘッダーは、 http : //www.resedit.net/からResEditを使用して作成されました。
問題:
ウィンドウのサイズを変更すると、静的コントロールがわずかにちらつきます。
問題を解決するための私の努力:
私のコードにはメモリリークがないと信じています-したがって、これが問題であるとは思えませんが、経験が浅いため、私の仮定が何らかの形で確認できれば非常にありがたいです.
を適切に処理したと思います。また、WM_ERASEBKGND
スタイルCS_VREDRAW
とCS_HREDRAW
をウィンドウ クラスから除外しました。したがって、ちらつきが発生することはありません。
私のウィンドウにはスタイルがあることを忘れていたので、メンバーのロジャー・ローランドWS_CLIPCHILDREN
による次のコメントに応えて、今それについて言及しています。
ちらつきを避けるために、両方のハンドラーにダブル バッファリングを実装しました。
質問:
ちらつきをなくすためにデモ プロジェクトのコードを変更するにはどうすればよいですか?
WM_PAINT
ハンドラーとハンドラーの両方を最適化する方法についてアドバイスが必要なWM_CTLCOLORSTATIC
ので、ペイント コードをより効率的かつ高速にします。
2 番目の質問に対する小さなメモ:
メイン ウィンドウの背景に画像全体を描画してコードを改善し、その静的コントロールの背景に対応する画像の部分の上に透明な静的コントロールを配置することを考えていました。
そうすればNULL_BRUSH
、WM_CTLCOLORSTATIC
ハンドラーでのみ戻り、すべての作業をWM_PAINT
.
私はこの考えで正しい軌道に乗っていますか? これはうまくいきますか?
ありがとうございました。よろしく。
c++ - GradientFill API が正常に動作しない
紹介と関連情報:
グラデーションの背景を持つ静的コントロールを作成したいと考えています。
私はそれを次のようにしたい:
メイン ウィンドウの背景にグラデーションを作成し、その背景の上に透明な静的コントロールを配置します。
そのために、静的コントロールがあるべき位置にグラデーションを配置するRECT
変数をハンドラーに作成しました。WM_PAINT
また、ちらつきを避けるためにダブルバッファリングを使用しようとしています(WM_ERASEBKGND
フラグCS_VREDRAW
を処理し、CS_HREDRAW
ウィンドウクラスから削除しました)。
WM_SIZE
ウィンドウを無効にし、静的コントロールを適切に再配置するメッセージも処理しました。
私のWM_CTLCOLORSTATIC
ハンドラーでは、 が返されNULL_BRUSH
ました。
Visual Studio のアプリケーション ウィザードを使用して、これを説明するデモ アプリケーションを作成しました。
純粋な Win32 API と C++ を使用して、Windows XP で作業しています。
WM_PAINT
以下に、上記の他のハンドラーの 、およびスニペットの変更されたコードを送信します。
問題:
GradientFill
ハンドラーでAPIを使用するWM_PAINT
と、本来よりも大きな長方形が画面に表示されます。
以下の図は、この結果を示しています。
同じ長方形をソリッド ブラシで塗りつぶそうとすると、すべて正常に動作します。
以下の図は、この結果を示しています。
問題を解決するための私の努力:
長方形の座標が設定されている場所にブレークポイントを配置しましたが、問題はありませんでした。
また、 をGradientFill
返すTRUE
ので失敗しません。
質問:
これを修正する方法は?
前もって感謝します。
よろしく。
c++ - 彼の背景を変更すると、ボタンの機能が失われます
実装のサブクラス化によってボタンの背景を置き換えるために、すべてのソースを試しました。
背景を変更すると、四角い形になり、クリックできなくなりました。誰かが良いチュートリアルやコードのサンプルを共有できますか?
とにかく、これは私のコードです:
編集: BS_OWNERDRAW ウィンドウ スタイルをボタンに追加しました:
コールバックを変更しましたが、WM_DRAWITEM は呼び出されませんでした: