問題タブ [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.
winforms - Windowsフォームでウィンドウタイトルバーにカスタムボタンを描画するには?
フォームのタイトルバー内の最小化、最大化、閉じるボタンの横にカスタム ボタンを描画するにはどうすればよいですか?
Win32 API 呼び出しを使用して WndProc プロシージャをオーバーライドする必要があることはわかっていますが、適切に機能するソリューションを見つけることができませんでした。
誰もこれを行う方法を知っていますか? より具体的には、Vistaで機能するこれを行う方法を知っている人はいますか?
c++ - WndProcで使用するためにこのポインタを保存するための最良の方法
this
で使用するポインタを格納するための最良の/一般的な方法を知りたいですWndProc
。私はいくつかのアプローチを知っていますが、私が理解しているように、それぞれに独自の欠点があります。私の質問は次のとおりです。
この種のコードを作成するには、どのような方法がありますか。
サンク、ハッシュマップ、スレッドローカルストレージ、ウィンドウユーザーデータ構造体について考えることができます。
これらの各アプローチの長所/短所は何ですか?
コード例と推奨事項に対して付与されるポイント。
これは純粋に好奇心のためです。MFCを使用した後、私はそれがどのように機能するのか疑問に思い、ATLなどについて考えるようになりました。
編集:HWND
ウィンドウプロシージャで有効に使用できる最も早い場所はどこですか?これは-として文書化されてWM_NCCREATE
いますが、実際に実験すると、ウィンドウに送信される最初のメッセージではありません。
編集: ATLは、このポインターにアクセスするためにサンクを使用します。MFCは、sのハッシュテーブルルックアップを使用しますHWND
。
.net - WM_COMMAND などの WIN32 API メッセージ関連の #defines を見つけることができる .NET 名前空間はありますか?
WndProcをオーバーライドしているので、次のようなコードを書きたい
c# - これらの WndProc コードは何を意味しますか?
外側をクリックすると閉じるウィンドウを作成しようとしていますが、現時点では、WndProc 関数を処理してそれを行うことを検討しています。
これまでに受け取ったメッセージはどれも役に立たないようですが、まったく理解できないメッセージがいくつかあります。コード 0x0118、0xC123、0xC128、および 0xC12E は何を表していますか?
c# - WPFでWndProcメッセージを処理する方法は?
Windowsフォームでは、をオーバーライドWndProc
して、メッセージが届いたときに処理を開始します。
誰かがWPFで同じことを達成する方法の例を教えてもらえますか?
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 を知っているので、これらのツールキットとの比較はおそらく理解できるでしょう。
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 向けのメッセージを区別できません。何か案は?
c# - ウィンドウ内の「X」ボタンの座標を取得するにはどうすればよいですか?
何らかの理由で、ユーザーが実際に X ボタンをクリックしたことを検出する必要があります。私がこれまでに持っているのはこれです:
基本的に、ウィンドウの非クライアント領域でのマウスクリックである「WM_NCLBUTTONDOWN」メッセージを探します。次に、LParam から X 座標と Y 座標を取得し、最後にそれを画面座標に変換します。したがって、この時点で、ユーザーが非クライアント領域をクリックしたことがわかり、フォームのどこにあるかがわかります。
私の質問は、これらの座標が X ボタン上にあるかどうかをどのように確認できるかです。今のところ、私は 680 をハードコーディングしています。これは、ウィンドウの現在のサイズで機能するためです (サイズは大きくありません)。オプション。さらに、Y 座標のコーディングすらしていないため、誰かがウィンドウの右端をクリックすると、そのコードもトリガーされます。それで...誰かアイデアはありますか?
c# - ドラッグ可能な WinForm の問題
フォームの任意の部分をクリックしてドラッグすることで移動できる Windows フォームがあります。キャプションをクリックしたとフォームに思わせるために、WndProc をオーバーライドし、NCHITTEST 関数の結果を HTCAPTION に設定する方法を使用しました。これにより、ドラッグが可能になります。
このコードはうまく機能し、以下のとおりです。
この問題は、ToolStripPanel をフォームにドッキングすると発生します (これはドラッグ可能なツールバーとして機能します)。フォーム全体をドラッグ モードにするために必要なメッセージを渡すには、ToolStrip でカバーされていない ToolStripPanel の任意の部分が必要です。
独自の ToolStripContainer クラスを作成して WndProc 関数をオーバーライドし、上記と同じ関数を使用しようとしましたが、ToolStripContainer がフォーム内でドラッグ モードになり、これは目的の機能ではありません。
また、NCHITTEST メッセージを親に渡し、現在のマウス座標で新しいメッセージを作成し、WinAPI と親のウィンドウ ハンドルを使用して親に送信しようとしました。
ここで簡単なものが欠けている必要があります...誰にもアイデアはありますか?