32BPP窗口模式下24位位图的像素操作(2)

等测距卷轴的逻辑写的差不多了,结果发现之前写的位图至显示表面的代码有些问题,所以重写了一个函数,给定一个表面,基于表面的尺寸和传入的坐标,直接在BITMAP24_PTR上取图,取图后的表面直接就可用,先给出完整代码:

int PickBitmap(LPDIRECTDRAWSURFACE7 lpdds, BITMAP24_PTR bitmap, LONG ddsWidth, LONG ddsHeight, LONG cx, LONG cy) { LONG bitmapWidth = bitmap->infoHeader.biWidth; LONG bitmapHeight = bitmap->infoHeader.biHeight; 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的函数,代码如下:

char hextable[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; 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); }

问题解决了,终于能睡个好觉咯。

你可能感兴趣的:(c,struct,单元测试,null,buffer,工具)