問題タブ [cedit]
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.
fonts - CEdit SetFont は、共有フォントの場合でも、常に GDI HFONT ハンドルを作成します
この C++/MFC MDI アプリケーションでは、各 MDI クライアント ウィンドウに CDialog に基づくフォームが含まれています。このフォームには、非常に多くのコントロール (数百ものコントロールも含む) を含めることができます。GDI ハンドルが比較的すぐに不足することに気付きました (Windows の制限はプロセスごとに 10000 です)。
主な問題は、ほぼすべてのコントロールに設定したフォントでした。多くの場合、Arial 11 などの複数のコントロールに同じ属性を持つフォントが使用されるため、内部参照カウントを使用してフォントを共有しています。
これは役に立ちましたが、CEdit は他のコントロールとは異なる動作をします。同じ共有フォント ハンドルを複数の CEdit に渡す場合、GDI ハンドルの数は CEdit ごとに 1 ずつ増加します。
m_font は共有 CFont インスタンスであり、CDialog メンバーとして宣言されています。
同じフォント インスタンスが SetFont に渡されても、反復ごとに dwCount がインクリメントされます。CEdit がフォントのシャドウ コピーを作成するかのように。
pEdit->SetFont(NULL) でさえ、gdi ハンドルの数を増やします!
CStatic などの他のコントロール タイプでは、すべて問題ありません。
これは comctl32.dll のバージョンにも関連しており、バージョン 6.0 を使用すると動作が再現されます。
行を省略すると、comctl32.dll 5.8 が使用され、ハンドルの数は増加しません。
この問題を回避する機会はありますか?
c++ - CEdit からの終了を拒否する方法
CEdit クラス (CMyEdit) をサブクラス化し、ON_CHAR メッセージを通じてユーザー入力を継続的に検証しています。ON_CHAR プロシージャは、CMyEdit.isOK メンバー変数を true または false に設定します。値が正しくない場合 (.isOk = false)、編集ボックスからの終了を拒否する方法はありますか? たとえば、ユーザーが他の編集ボックスや他のダイアログに移動できないようにします。
ありがとう。