我正在使用win32函数GetRegionData(...)
提取确切的矩形,这些矩形构成了无效的绘画区域,以响应WM_PAINT消息。
以下代码正常工作,并且对GetRegionData
的第二次调用成功。
DWORD uRegionSize = GetRegionData(hRgn, sizeof(RGNDATA), NULL); // Send NULL request to get the storage size
RGNDATA* pData = (RGNDATA*)(new char[uRegionSize]); // Allocate space for the region data
pData->rdh.dwSize = uRegionSize;
DWORD uSizeCheck = GetRegionData(hRgn, uRegionSize, pData);
if (uSizeCheck != uRegionSize) {
// FAIL!
delete[] pData;
return;
}
...
do stuff with rectangles
...
但是,当我尝试将数据缓冲区移动到在堆栈上分配的成员变量时,GetRegionData
每次返回0都会失败。
在我的标题中:
char UpdateRegionData[LOTS_MORE_BYTES_THAN_NEEDED];
在我的cpp中:
DWORD uRegionSize = GetRegionData(hRgn, sizeof(RGNDATA), NULL); // Send NULL request to get the storage size
RGNDATA* pData2 = (RGNDATA*)UpdateRegionData;
pData2->rdh.dwSize = uRegionSize;
DWORD uSizeCheck = GetRegionData(hRgn, uRegionSize, pData2);
if (uSizeCheck != uRegionSize) {
// FAIL!
return;
}
两个版本之间唯一的不同是内存分配,但是第二个版本失败。 GetLastError()
返回代码183,它是ERROR_ALREADY_EXISTS,似乎没有什么意义。
答案 0 :(得分:1)
感谢Raymond指出尺寸错误-确实是一个错误,但这不是问题的原因。实际原因是字节对齐。我正在处理的项目的字节对齐方式设置为默认值1。当我使用__declspec(align(4))
为缓冲区指定4字节对齐方式时,问题已解决。