5

ウィンドウ スタイルの 16 進数について質問があります。

http://support.microsoft.com/kb/111011/en-usによると、、、、、、および0x16CF0000のウィンドウ スタイルが含まれています。WS_VISIBLEWS_CLIPSIBLINGSWS_CLIPCHILDRENWS_CAPTIONWS_SYSMENUWS_THICKFRAMEWS_MINIMIZEBOXWS_MAXIMIZEBOX

ウィンドウ スタイルの組み合わせにウィンドウ スタイルが存在するかどうかを確認するにはどうすればよいですか? たとえば、WS_BORDER( 0x00800000) スタイルが に存在するかどうかを確認したいと思い0x16CF0000ます。

4

7 に答える 7

7

標準形は次のとおりです。

if (value & WS_BORDER != 0) {  }

&はビット単位で実行します-ANDであり、WS_BORDERのビットが設定されている場合にのみ、結果はゼロ以外になります

于 2009-08-14T20:56:28.117 に答える
3

基本的には、かどうかを確認するだけyourValue AND WS_BORDER = WS_BORDERです。

残念ながら、スタイルフラグ内の一部のビットは、コンテキストに応じて2回使用されます。たとえば、両方ともWS_TABSTOP0x00010000WS_MAXIMIZEBOXであるため、ウィンドウに実際にそのプロパティがあるかどうかは、コンテキスト(オブジェクトの位置やその他のフラグ)によって異なります。 (親コントロールにタブストップを設定することはできませんが、子コントロールに最大化ボックスを設定できる場合があります)...

WS_OVERLAPPED      = 0x00000000,
WS_POPUP           = 0x80000000,
WS_CHILD           = 0x40000000,
WS_MINIMIZE        = 0x20000000,
WS_VISIBLE         = 0x10000000,
WS_DISABLED        = 0x08000000,
WS_CLIPSIBLINGS    = 0x04000000,
WS_CLIPCHILDREN    = 0x02000000,
WS_MAXIMIZE        = 0x01000000,
WS_BORDER          = 0x00800000,
WS_DLGFRAME        = 0x00400000,
WS_VSCROLL         = 0x00200000,
WS_HSCROLL         = 0x00100000,
WS_SYSMENU         = 0x00080000,
WS_THICKFRAME      = 0x00040000,
WS_GROUP           = 0x00020000,
WS_TABSTOP         = 0x00010000,

WS_MINIMIZEBOX     = 0x00020000,
WS_MAXIMIZEBOX     = 0x00010000,

WS_CAPTION         = WS_BORDER | WS_DLGFRAME,
WS_TILED           = WS_OVERLAPPED,
WS_ICONIC          = WS_MINIMIZE,
WS_SIZEBOX         = WS_THICKFRAME,
WS_TILEDWINDOW     = WS_OVERLAPPEDWINDOW,

WS_OVERLAPPEDWINDOW    = WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | 
                         WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX,
WS_POPUPWINDOW     = WS_POPUP | WS_BORDER | WS_SYSMENU,
WS_CHILDWINDOW     = WS_CHILD,
于 2009-08-14T21:02:37.620 に答える
2
if(0x16CF0000 & WS_BORDER)
于 2009-08-14T20:55:32.317 に答える
1

小切手IF((0x16CF0000 | WS_BORDER) == 0x16CF0000)

于 2009-08-14T20:57:26.650 に答える
1

過去に、そのようなものが定義されているヘッダー ファイルを取得し、スクリプトを記述して、フラグがあった変数を取得し、定数の記号名を含むテキスト文字列に変換するコードに変換しました。

#defines の解析は、AWK のようなものを使用してこれを行った当時はかなり簡単でした。今では、当時使用していたマシンに Python がある場合、または Python がすぐに利用できない場合は、AWK に戻るでしょう。

于 2009-08-14T21:13:08.847 に答える
0

私は win32 ダイアログ ビルダーを作成していたので、この質問は本当に気になりました。機能の 1 つは、すべての win32 共通コントロールとユーザー定義コントロールのスタイルを設定することでした。観察と、MSDN が提供する小さなドキュメントから多くのことを学びました。そして私の情報を共有したいと思います。これは、この質問に答えるだけではありません。

Microsoft チームはどのようにウィンドウ スタイルをフォーマットしましたか?

  1. これらは、すべてのウィンドウに適用される一般的なウィンドウ スタイルです。それらは「WS_」で始まり、上位ビットにあります。0xffff0000。

  2. 次に、指定されたプレフィックスで始まるコントロール固有/ユーザー定義のスタイルがあります。ButtonStyle の BS、ComboBoxStyle の CBS など。それらは下位ビットにあります。0x0000ffff.

これら 2 つのレベルのスタイルには 5 つのタイプがあります。

  1. デフォルト - これらの種類のスタイルはゼロです。このスタイルは、style が 0 の場合にのみ選択されます。

  2. フラグ - これらの種類のスタイルは決してゼロに等しくならず、一意のビットに配置されます。これらのスタイルを同時に使用できることを意味します。

  3. 排他的 - これらの種類のスタイルは通常、互いにビットを共有します。ただし、WS_POPUP と WS_CHILD は排他的ですが、ビットを共有しないため、必ずしもそうである必要はありません。CBS_SIMPLE や CBS_DROPDOWN などの他のほとんどのスタイルは排他的であり、実際にビットを共有します。排他的なスタイルは、多くの場合、カテゴリを表します。BS_OWNERDRAW、BS_RADIOBUTTON、BS_PUSHBUTTON はすべて、ボタン カテゴリのタイプを表します。BS_CENTER、BS_LEFT、BS_TOP は配置カテゴリです。BS_PUSHBUTTON はゼロに等しく、タイプ カテゴリのデフォルトを表すことに注意してください。

  4. 複合 - これらの種類のスタイルは、複数のスタイルで構成されています。WS_OVERLAPPEDWINDOW、WS_POPUPWINDOW、DS_SHELLFONT、LBS_STANDARD など。

  5. 同義語 - これらの種類のスタイルは同じものを参照します。例: WS_CHILDWINDOW 対 WS_CHILD、WS_TILED 対 WS_OVERLAPPED、WS_TILEDWINDOW 対 WS_OVERLAPPEDWINDOW。WS_TABSTOP と WS_MAXIMIZEBOX は同じ値を共有しますが、意味が異なるため同義語ではありません。どのように?これは私の知識の範囲外です。WS_TABSTOP は、ダイアログで使用されるコントロールに適用され、ダイアログは正しい動作を実装します。ただし、 isDialogMessage を使用して、ダイアログの外で同じ動作をシミュレートできます。また、子ウィンドウには最大化ボックスを設定できます。私のアプリケーションでは、WS_TABSTOP スタイルを完全に無視しました。

スタイルをテストするにはどうすればよいですか? スタイルを文字列に変換する関数を作成しました。ただし、スタイルが別のスタイルに存在するかどうかをテストする関数は、多くのコンテキストが必要になるため、実用的ではない場合があります。サンプルの関数プロトタイプは次のようになります...

/** \param className - use WC_DIALOG for dialog window
                       use NULL for top level window
*/
bool hasWindowStyle(const char *className,UINT style,UINT requiredStyle);

className は主要なコンテキストとして使用されます。className が WC_DIALOG の場合、すべての DS_* スタイルをウィンドウで使用できます。しかし、ボタン クラス、編集クラスなどに属するスタイルを持つことはできません。問題は、以下が技術的に間違っていることです...

return (style & requiredStyle) == requiredStyle;

requiredStyle がスタイルに存在する場合でも、requiredStyle が特定の className に対して有効なスタイルであるとは限らないため、これは誤りです。これには、特定のクラスのすべてのスタイルのマップが必要であり、requiredStyle がそのマップに存在する場合にのみ、上記の式を返します。

std::map<std::string,UINT> win32_class_list;

auto elem = win32_class_list.find(className);
auto invalid = win32_class_list.end();

if(elem == invalid) return false;
else return (style & requiredStyle) == requiredStyle;

上記は最初の問題を解決しました。しかし、最後の問題は解決するのが現実的ではないようです。CBS_SIMPLE|CBS_LOWERCASE という必要なスタイルがあるとします。この必要なスタイルがコンボボックスのスタイルの一部であるかどうかをどのように判断しますか? これは非常に状況に応じた質問です。

ウィンドウ スタイルを文字列に変換する関数については、パート 2 をご覧ください。

于 2021-11-28T19:51:51.293 に答える