0

我对我的问题的标题不太准确,因为我不知道这个东西的真正名称。

我不断看到 Win32 API 如何在变量中存储超过 1 个值。

例如,WPARAMLPARAM。这是一个long“分为”两个的数字:高字和低字。当它取 32 位值,将其除以 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);

或者您可以使用宏LOBYTEHIBYTE定义WinDef.h为:

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

有(至少)两种方法可以实现这一点:

  • 使用位移/掩码运算符<<, >>,&|,类似这样的东西(只是一个例子,未经测试):

    int loWord = ...;
    int hiWord = ...;
    LPARAM param = (hiWord << 16) | loWord;
    ...
    loWord = param & 0xFFFF;
    hiWord = param >> 16;
    
  • 使用一种union类型(尽管后一种会受到内存对齐和字节序问题的影响,因此它可能不是一个可移植的解决方案);在这里看一个例子

于 2012-06-04T08:44:46.203 回答
1

它通常称为位掩码,定义它们的一种方法如下:

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

通常不建议以这种方式定义它们,因为它们不可移植。这里的其他答案显示了一种更便携的方法。

于 2012-06-04T08:46:21.610 回答