Ну, я не могу точно сказать, почему вы получаете недопустимые значения x, но я, скорее всего, написал бы этот код по-другому:
// the way you had it, it was making a copy of the CREATESTRUCT and storing it in str
// this just uses a pointer
LPCREATESTRUCT str = ((LPCBT_CREATEWND)lParam)->lpcs;
// when you have a pointer, use -> to use a member
int normal = str->x;
Поскольку вы сказали, что вы новичок в указателях, я немного объясню ->
. Когда вы пишете x->y
, это действительно то же самое, что и (*x).y
, но с более приятным синтаксисом.
Также примечание совета, хотя приведение в этом коде кажется разумным. В общем, если вы обнаружите, что вы много разыгрываете, вы, вероятно, делаете это либо трудным, либо неправильным образом. Поэтому убедитесь, что вы нашли время, чтобы понять, что вы делаете.