等测距卷轴的逻辑写的差不多了,结果发现之前写的位图至显示表面的代码有些问题,所以重写了一个函数,给定一个表面,基于表面的尺寸和传入的坐标,直接在BITMAP24_PTR上取图,取图后的表面直接就可用,先给出完整代码:
DDSURFACEDESC2 ddsd;
DDRAW_INIT_STRUCT(ddsd);
lpdds->Lock(NULL, &ddsd, DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT, NULL);
int mempitch = ddsd.lPitch;
UCHAR *ddsBuffer = (UCHAR *)(ddsd.lpSurface);
for (LONG dy = 0, by = cy; dy < ddsHeight; ++dy, ++by)
{
memcpy(ddsBuffer + dy * mempitch, bitmap->buffer + cx * 4 + by * bitmapWidth * 4, 4 * ddsWidth);
}
//DisplayMemory(ddsBuffer, mempitch * ddsHeight);
lpdds->Unlock(NULL);
return 1;
}
这个函数调通至完成单元测试搞了我一下午~哎,智商低没办法啊。
这也算是我转到C/C++后第一次做大规模内存内容上的调试,还不知道有什么好工具可用,所以自己写了一个先凑合着用,就是上面代码注释了的那个DisplayMemory的函数,代码如下:
void DisplayMemory(UCHAR *buffer, LONG size)
{
char *msg = (char *)malloc(size * 3 + 1);
for (LONG i = 0; i < size; ++i)
{
char c1, c2, c3;
c1 = hextable[((int)(buffer[i])) / 16];
c2 = hextable[((int)(buffer[i])) % 16];
c3 = ' ';
msg[i * 3] = c1;
msg[i * 3 + 1] = c2;
msg[i * 3 + 2] = c3;
}
msg[size*3] = '/0';
MessageBox(NULL, msg, "Memory", MB_OK);
free(msg);
}
问题解决了,终于能睡个好觉咯。