您的位置:首页 > 其它

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

2011-01-02 22:51 295 查看
等测距卷轴的逻辑写的差不多了,结果发现之前写的位图至显示表面的代码有些问题,所以重写了一个函数,给定一个表面,基于表面的尺寸和传入的坐标,直接在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);
}


问题解决了,终于能睡个好觉咯。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: