問題タブ [wndproc]

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 に答える
30441 参照

winforms - Windowsフォームでウィンドウタイトルバーにカスタムボタンを描画するには?

フォームのタイトルバー内の最小化、最大化、閉じるボタンの横にカスタム ボタンを描画するにはどうすればよいですか?

Win32 API 呼び出しを使用して WndProc プロシージャをオーバーライドする必要があることはわかっていますが、適切に機能するソリューションを見つけることができませんでした。

誰もこれを行う方法を知っていますか? より具体的には、Vistaで機能するこれを行う方法を知っている人はいますか?

0 投票する
11 に答える
17939 参照

c++ - WndProcで使用するためにこのポインタを保存するための最良の方法

thisで使用するポインタを格納するための最良の/一般的な方法を知りたいですWndProc。私はいくつかのアプローチを知っていますが、私が理解しているように、それぞれに独自の欠点があります。私の質問は次のとおりです。

この種のコードを作成するには、どのような方法がありますか。

サンク、ハッシュマップ、スレッドローカルストレージ、ウィンドウユーザーデータ構造体について考えることができます。

これらの各アプローチの長所/短所は何ですか?

コード例と推奨事項に対して付与されるポイント。

これは純粋に好奇心のためです。MFCを使用した後、私はそれがどのように機能するのか疑問に思い、ATLなどについて考えるようになりました。

編集:HWNDウィンドウプロシージャで有効に使用できる最も早い場所はどこですか?これは-として文書化されてWM_NCCREATEいますが、実際に実験すると、ウィンドウに送信される最初のメッセージではありません。

編集: ATLは、このポインターにアクセスするためにサンクを使用します。MFCは、sのハッシュテーブルルックアップを使用しますHWND

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

.net - WM_COMMAND などの WIN32 API メッセージ関連の #defines を見つけることができる .NET 名前空間はありますか?

WndProcをオーバーライドしているので、次のようなコードを書きたい

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

c# - これらの WndProc コードは何を意味しますか?

外側をクリックすると閉じるウィンドウを作成しようとしていますが、現時点では、WndProc 関数を処理してそれを行うことを検討しています。

これまでに受け取ったメッセージはどれも役に立たないようですが、まったく理解できないメッセージがいくつかあります。コード 0x0118、0xC123、0xC128、および 0xC12E は何を表していますか?

0 投票する
9 に答える
102851 参照

c# - WPFでWndProcメッセージを処理する方法は?

Windowsフォームでは、をオーバーライドWndProcして、メッセージが届いたときに処理を開始します。

誰かがWPFで同じことを達成する方法の例を教えてもらえますか?

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

c - WNDCLASSEX の概念、優れたプログラミング習慣、およびシステム クラスの WndProc

Windows API は、WNDCLASS / WNDCLASSEX構造に依存する「クラス」を使用することを理解しています。

私はWindows API Hello Worldアプリケーションをうまく使いこなし、このクラスが私たち自身のウィンドウだけでなく、「EDIT」、「BUTTON」などのWindowsコアコントロールでも使用されていることを理解しています。 WndProc (関数を定義できます)

このクラスに関するドキュメントは見つかりますが、概念を説明するものは見つかりません。

これまでのところ、私が見つけた唯一のことはこれでした:

ウィンドウ クラスは、C++ クラスとは何の関係もありません。

これは本当に役に立ちません(それが何でないかは教えてくれますが、それが何であるか教えてくれません)。実際、WNDCLASSEX を C++ クラスに関連付けて、「WNDCLASSEX」がコントロールタイプを表していると考えたくなるから です。それで、私の最初の質問は、それは何ですか?

次に、クラスで WndProc を定義できることを理解しています。ただし、ウィンドウは、子コントロール (またはウィンドウ、または Windows API で呼び出されるもの) からメッセージを取得することもできます。どうすればいいの?

最後に、新しいクラスを定義するのが適切なプログラミング方法はいつですか? アプリケーションごと (メイン フレーム用)、フレームごと、定義したコントロールごとに 1 つ (たとえば、独自のプログレス バー クラスを作成する場合)?

私は Java/Swing、C#/Windows.Form、C/GTK+、および C++/wxWidgets を知っているので、これらのツールキットとの比較はおそらく理解できるでしょう。

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

c++ - Win32 での WM_NOTIFY とスーパークラス チェーンの問題

参考までに、この記事で概説されているウィンドウ スーパークラス メソッドを使用しています。特定の問題はWM_NOTIFY、スーパークラスのベース コントロールからのメッセージを処理する場合 (つまり、カスタム描画用) に発生します。メッセージを親ウィンドウから反映するか、独自のウィンドウを親として設定する必要があります (CREATESTRUCT 内でWM_(NC)CREATEベースに渡されます)。クラス)。スーパークラスが 1 つしかない場合、このメソッドは正常に機能します。スーパークラスをスーパークラス化すると、問題が発生します。現在、3 つの WindowProc が同じ HWND で動作しています。WM_NOTIFYメッセージ (または上記の親トリックから自分自身に送信される) は、常に最も外側の (最も派生した) WindowProc に移動します。それらが内部スーパークラス向けのメッセージ (基本メッセージは最初のスーパークラスに送られることになっている) なのか、外部スーパークラス向けのメッセージ (内部スーパークラスからのメッセージは外部スーパークラス向け) なのかを知る方法はありません)。これらのメッセージはすべて、同じコントロール ID を持つ同じ HWND から送信されるため、区別できません。継承の各レベルをカプセル化する新しいウィンドウを作成せずにこれを解決する方法はありますか?

テキストの壁について申し訳ありません。説明するのは難しい概念です。これが図です。

単一のスーパークラス:

スーパークラスのスーパークラス:

2 番目のケースのWM_NOTIFYメッセージはすべて同じ HWND とコントロール ID からのものであるため、(Base からの) SuperA 向けのメッセージと (SuperA からの) SuperB 向けのメッセージを区別できません。何か案は?

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

c# - ウィンドウ内の「X」ボタンの座標を取得するにはどうすればよいですか?

何らかの理由で、ユーザーが実際に X ボタンをクリックしたことを検出する必要があります。私がこれまでに持っているのはこれです:

基本的に、ウィンドウの非クライアント領域でのマウスクリックである「WM_NCLBUTTONDOWN」メッセージを探します。次に、LParam から X 座標と Y 座標を取得し、最後にそれを画面座標に変換します。したがって、この時点で、ユーザーが非クライアント領域をクリックしたことがわかり、フォームのどこにあるかがわかります。

私の質問は、これらの座標が X ボタン上にあるかどうかをどのように確認できるかです。今のところ、私は 680 をハードコーディングしています。これは、ウィンドウの現在のサイズで機能するためです (サイズは大きくありません)。オプション。さらに、Y 座標のコーディングすらしていないため、誰かがウィンドウの右端をクリックすると、そのコードもトリガーされます。それで...誰かアイデアはありますか?

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

c# - ドラッグ可能な WinForm の問題

フォームの任意の部分をクリックしてドラッグすることで移動できる Windows フォームがあります。キャプションをクリックしたとフォームに思わせるために、WndProc をオーバーライドし、NCHITTEST 関数の結果を HTCAPTION に設定する方法を使用しました。これにより、ドラッグが可能になります。

このコードはうまく機能し、以下のとおりです。

この問題は、ToolStripPanel をフォームにドッキングすると発生します (これはドラッグ可能なツールバーとして機能します)。フォーム全体をドラッグ モードにするために必要なメッセージを渡すには、ToolStrip でカバーされていない ToolStripPanel の任意の部分が必要です。

独自の ToolStripContainer クラスを作成して WndProc 関数をオーバーライドし、上記と同じ関数を使用しようとしましたが、ToolStripContainer がフォーム内でドラッグ モードになり、これは目的の機能ではありません。

また、NCHITTEST メッセージを親に渡し、現在のマウス座標で新しいメッセージを作成し、WinAPI と親のウィンドウ ハンドルを使用して親に送信しようとしました。

ここで簡単なものが欠けている必要があります...誰にもアイデアはありますか?