0

これが実際にどのように呼ばれているのかわからないため、質問のタイトルを正確に表すことができませんでした。

Win32 API が変数に 1 つ以上の値を格納する方法を見続けています。

たとえば、WPARAMLPARAM. これは、long上位ワードと下位ワードの 2 つに「分割」された数値です。32 ビット値を取り、それを 2 に分割し、2 つの 16 ビット値に設定する例は他にもたくさんあります。

このように自分で変数を設定するにはどうすればよいですか? (変数を作成し、ビットを必要な数に分割し、各部分を設定します)

PS私は主に教育目的で質問しているので、自分でこれを行うことをお勧めしなくても、答えていただければ幸いです. ありがとう。

4

3 に答える 3

1

あなたはこれを行うことができます:

WPARAM param = (WPARAM)(hiByte << 8 | lowByte);

これにより、変数の 16 ビットが設定されますparam

逆の操作は次のとおりです。

//BYTE  is defined in WinDef.h
BYTE lowByte = (BYTE)(param && 0xFF);
BYTE hiByte =  (BYTE)((param >> 8) && 0xFF);

または、マクロLOBYTEを使用して次のようにHIBYTE定義することもできますWinDef.h

BYTE lowByte = LOBYTE(param);
BYTE hiByte =  HIBYTE(param);
于 2012-06-04T08:42:20.730 に答える
1

これを実現するには、(少なくとも) 2 つの方法があります。

  • ビット シフト / マスク演算子<<>>&およびを使用すると|、次のようになります (単なる例であり、テストされていません)。

    int loWord = ...;
    int hiWord = ...;
    LPARAM param = (hiWord << 16) | loWord;
    ...
    loWord = param & 0xFFFF;
    hiWord = param >> 16;
    
  • 型を使用するunion(ただし、この後者はメモリ アライメントとエンディアンの問題の影響を受けるため、移植可能なソリューションではない可能性があります)。ここで例を参照してください

于 2012-06-04T08:44:46.203 に答える
1

これは通常ビットマスクと呼ばれ、次のように定義する 1 つの方法があります。

struct Param
{
   unsigned wparam   : 16;     //16 bits
   unsigned lparam   : 16;     //16 bits
};

移植性がないため、通常、このように定義することはお勧めしません。ここでの他の回答は、より移植性の高い方法を示しています。

于 2012-06-04T08:46:21.610 に答える