要求用MFC做一个自定义的DLG,编译成静态lib供主程序使用。
要求DLG有背景图片,其上Static和Button也要显示bmp。图片不能放在资源中,因为GetDIBits函数CE下没有,没办法使资源中的位图通过双缓存进行加载,使用读bmp文件的方式解析bmp,SetDIBitsToDevice放进MemoryDC,然后BitBlt。
Static貌似不支持OwnerDraw,最后只能把代码写OnPaint中,Button的OwnerDraw没有问题。
解析bmp显示右上角总是不对,说明Pattern数据的末尾部分由问题,检查代码:
BITMAPFILEHEADER bfh = {0};
FILE *file = _wfopen(strFile, L"r");
if (!file)
{
ASSERT(0);
return false;
}
fread(&bfh, sizeof(bfh), 1, file);
long lSize = bfh.bfSize - sizeof(bfh);
m_pstBitmapInfo = (BITMAPINFO*)malloc(lSize);
if (!m_pstBitmapInfo)
{
fclose(file);
file = NULL;
return false;
}
fread(m_pstBitmapInfo, lSize, 1, file);
fclose(file);
file = NULL;
m_pBits = (char*)m_pstBitmapInfo + (bfh.bfOffBits - sizeof(bfh));
最后发现,是因为打开时不是二进制读取的,字节对齐的问题,应该传入参数"rb"。
还有静态lib,最开始说做一个单独的exe,所以建了exe的工程,最后要改lib,我就把配置改了下直接用了,发现DoModal总是返回-1,不得其解。以为win32程序不可以调用包含MFC代码的lib呢。发现可以建立lib工程,可以支持MFC,重新建了工程还是返回-1。原来是因为lib本身不能包含dlg资源导致,需要把对话框资源放在主程序中。
解脱了。