显示真彩BMP需要逻辑调色板吗?
代码如下,有什么错误?
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc,hMemDC;
////////////////////////////读文件///////////////////////////
BITMAPFILEHEADER bf;
BITMAPINFOHEADER bi; FILE *fp;
char *buf; if((fp = fopen("E:\\sss.bmp","r")) == NULL)
{
//MessageBox(hWnd,(LPCWSTR)"Filec:\\test.bmpnotfound!",(LPCWSTR)"Error
Message",MB_OK|MB_ICONEXCLAMATION);
return FALSE;//打开文件错误,返回
}
fread(&bf,sizeof(bf),1,fp);//将BITMAPFILEHEADER结构从文件中读出,填写到bf中
fread(&bi,sizeof(bi),1,fp);//将BITMAPINFOHEADER结构从文件中读出,填写到bi中
int ImageSize = bi.biWidth * bi.biHeight * 4;
buf = new char[ImageSize];//将实际图片数据从文件中读出
fread(buf,ImageSize,1,fp); HDC hDc;
HBITMAP hBitmap;
HPALETTE hPalette; //没有用到调色板,要产生一个逻辑调色板
LOGPALETTE *pPal; //指向逻辑调色板结构的指针
hPalette=CreatePalette(pPal); //产生逻辑调色板,hPalette是一个全局变量 hDc = GetDC(hWnd); //获得设备上下文句柄
hBitmap = CreateDIBitmap(hDc,(LPBITMAPINFOHEADER)&bf,CBM_INIT,(LPSTR)buf,(LPBITMAPINFO)&bf,DIB_RGB_COLORS);//产生位图句柄
// ReleaseDC(hWnd,hDc); //释放设备上下文
///////////////////////////////////////////////////////////////////////////
//switch (message)
//{
//case WM_COMMAND:
// wmId = LOWORD(wParam);
// wmEvent = HIWORD(wParam);
// // 分析菜单选择:
// switch (wmId)
// {
// case IDM_ABOUT:
// DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
// break;
// case IDM_EXIT:
// DestroyWindow(hWnd);
// break;
// default:
// return DefWindowProc(hWnd, message, wParam, lParam);
// }
// break;
//case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);//获得屏幕设备上下文
// TODO: 在此添加任意绘图代码...
////////////////////////////////////////////////////////////////////////
if(hBitmap)//hBitmap一开始是NULL,当不为NULL时表示有图
{
hMemDC = CreateCompatibleDC(hdc);//建立一个内存设备上下文
}
SelectObject(hMemDC,hBitmap);//将位图选入内存设备上下文
BitBlt(hdc,0,0,bi.biWidth,bi.biHeight,hMemDC,0,0,SRCCOPY);//显示位图
DeleteDC(hMemDC);//释放内存设备上下文
///////////////////////////////////////////////////////////////////////////////////
EndPaint(hWnd, &ps);
/*break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}*/
return 0;
}
其中这三句是我后来加的
HPALETTE hPalette; //没有用到调色板,要产生一个逻辑调色板
LOGPALETTE *pPal; //指向逻辑调色板结构的指针
hPalette=CreatePalette(pPal); //产生逻辑调色板,hPalette是一个全局变量
我不知道需不需要调色板,求指教!!!
代码如下,有什么错误?
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc,hMemDC;
////////////////////////////读文件///////////////////////////
BITMAPFILEHEADER bf;
BITMAPINFOHEADER bi; FILE *fp;
char *buf; if((fp = fopen("E:\\sss.bmp","r")) == NULL)
{
//MessageBox(hWnd,(LPCWSTR)"Filec:\\test.bmpnotfound!",(LPCWSTR)"Error
Message",MB_OK|MB_ICONEXCLAMATION);
return FALSE;//打开文件错误,返回
}
fread(&bf,sizeof(bf),1,fp);//将BITMAPFILEHEADER结构从文件中读出,填写到bf中
fread(&bi,sizeof(bi),1,fp);//将BITMAPINFOHEADER结构从文件中读出,填写到bi中
int ImageSize = bi.biWidth * bi.biHeight * 4;
buf = new char[ImageSize];//将实际图片数据从文件中读出
fread(buf,ImageSize,1,fp); HDC hDc;
HBITMAP hBitmap;
HPALETTE hPalette; //没有用到调色板,要产生一个逻辑调色板
LOGPALETTE *pPal; //指向逻辑调色板结构的指针
hPalette=CreatePalette(pPal); //产生逻辑调色板,hPalette是一个全局变量 hDc = GetDC(hWnd); //获得设备上下文句柄
hBitmap = CreateDIBitmap(hDc,(LPBITMAPINFOHEADER)&bf,CBM_INIT,(LPSTR)buf,(LPBITMAPINFO)&bf,DIB_RGB_COLORS);//产生位图句柄
// ReleaseDC(hWnd,hDc); //释放设备上下文
///////////////////////////////////////////////////////////////////////////
//switch (message)
//{
//case WM_COMMAND:
// wmId = LOWORD(wParam);
// wmEvent = HIWORD(wParam);
// // 分析菜单选择:
// switch (wmId)
// {
// case IDM_ABOUT:
// DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
// break;
// case IDM_EXIT:
// DestroyWindow(hWnd);
// break;
// default:
// return DefWindowProc(hWnd, message, wParam, lParam);
// }
// break;
//case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);//获得屏幕设备上下文
// TODO: 在此添加任意绘图代码...
////////////////////////////////////////////////////////////////////////
if(hBitmap)//hBitmap一开始是NULL,当不为NULL时表示有图
{
hMemDC = CreateCompatibleDC(hdc);//建立一个内存设备上下文
}
SelectObject(hMemDC,hBitmap);//将位图选入内存设备上下文
BitBlt(hdc,0,0,bi.biWidth,bi.biHeight,hMemDC,0,0,SRCCOPY);//显示位图
DeleteDC(hMemDC);//释放内存设备上下文
///////////////////////////////////////////////////////////////////////////////////
EndPaint(hWnd, &ps);
/*break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}*/
return 0;
}
其中这三句是我后来加的
HPALETTE hPalette; //没有用到调色板,要产生一个逻辑调色板
LOGPALETTE *pPal; //指向逻辑调色板结构的指针
hPalette=CreatePalette(pPal); //产生逻辑调色板,hPalette是一个全局变量
我不知道需不需要调色板,求指教!!!
解决方案 »
- keybd_event模拟按键
- 动态窗口显示问题 AnimateWindow 调用失败!
- 我用vc+opengl,想实现飞机动态穿云,飞机已实现,云弄不出来。
- 高手急救啊!Word二次开发,事件处理 (注:Autmation开发,不是COM)
- 文件遍历和注册表遍历的问题
- 怎样清空listBox里的所有项?
- 怎么将一个文件类型与一个exe关联起来
- 哪位高手有 win CE上开发的经验,给小弟传授传授!一定给分!
- 斑竹大人 我有30分的可用分 怎么问问题只能给(0--0)分呀?真奇怪
- 请教在VC的MFC编程中,如何在serialize函数中加入等待按下按钮的功能
- 用GDIplus画小方块,怎么样让这些小方块都在一个外面的大的椭圆里?
- 关于程序的一个问题
case WM_PAINT:// 被注释注释掉了 ?
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc,hMemDC;
////////////////////////////读文件///////////////////////////
BITMAPFILEHEADER bf;
BITMAPINFOHEADER bi; FILE *fp;
char *buf; if((fp = fopen("E:\\sss.bmp","r")) == NULL)
{
return FALSE;//打开文件错误,返回
}
fread(&bf,sizeof(bf),1,fp);//将BITMAPFILEHEADER结构从文件中读出,填写到bf中
fread(&bi,sizeof(bi),1,fp);//将BITMAPINFOHEADER结构从文件中读出,填写到bi中
int ImageSize = bi.biWidth * bi.biHeight * 4;
buf = new char[ImageSize];//将实际图片数据从文件中读出
fread(buf,ImageSize,1,fp); HDC hDc;
HBITMAP hBitmap; BITMAPINFO bmi;
memset(&bmi,0,sizeof(BITMAPINFO));
bmi.bmiHeader = bi; hDc = GetDC(hWnd); //获得设备上下文句柄
hBitmap = CreateDIBitmap(hDc,(LPBITMAPINFOHEADER)&bi,CBM_INIT,(LPSTR)buf,(LPBITMAPINFO)&bmi,DIB_RGB_COLORS);//产生位图句柄 //int a = GetLastError();
//ReleaseDC(hWnd,hDc); //释放设备上下文
//hdc = BeginPaint(hWnd, &ps); //获得屏幕设备上下文
//if(hBitmap)//hBitmap一开始是NULL,当不为NULL时表示有图
//{
// hMemDC = CreateCompatibleDC(hdc);//建立一个内存设备上下文
//}
//SelectObject(hMemDC,hBitmap);//将位图选入内存设备上下文
//BitBlt(hdc,0,0,bi.biWidth,bi.biHeight,hMemDC,0,0,SRCCOPY);//显示位图
//DeleteDC(hMemDC);//释放内存设备上下文
//EndPaint(hWnd, &ps);///////////////////////////////////////////////////////////////////////////
switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// 分析菜单选择:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);//获得屏幕设备上下文
// TODO: 在此添加任意绘图代码...
////////////////////////////////////////////////////////////////////////
if(hBitmap)//hBitmap一开始是NULL,当不为NULL时表示有图
{
hMemDC = CreateCompatibleDC(hdc);//建立一个内存设备上下文
}
SelectObject(hMemDC,hBitmap);//将位图选入内存设备上下文
BitBlt(hdc,0,0,bi.biWidth,bi.biHeight,hMemDC,0,0,SRCCOPY);//显示位图
DeleteDC(hMemDC);//释放内存设备上下文
///////////////////////////////////////////////////////////////////////////////////
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}就是这个代码,我在switch语句之前先将BMP读取,读取之后我要将它显示出来,就将显示的代码加入了case WM_PAINT中,但是我调试的时候,程序在switch语句之后直接到了default,根本没有进入case WM_PAINT中,我不知道是什么原因,求指点