求一个显示BMP图片的完整源程序 RT 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 http://www.codeguru.com/Cpp/G-M/bitmap/article.php/c4903/ CxImagehttp://www.codeproject.com/bitmap/cximage.asp #include "stdafx.h"#include "resource.h"#include "stdio.h"#include "ddraw.h"#define MAX_LOADSTRING 100#define KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)#define _RGB16BIT565(r,g,b) ((b%32) + ((g%64) << 6) + ((r%32) << 11))#define DDRAW_INIT_STRUCT(ddstruct) { memset(&ddstruct,0,sizeof(ddstruct)); ddstruct.dwSize=sizeof(ddstruct); }HINSTANCE hInst;HWND g_hWnd;HDC hdc; TCHAR szTitle[MAX_LOADSTRING]; TCHAR szWindowClass[MAX_LOADSTRING]; ATOM MyRegisterClass(HINSTANCE hInstance);BOOL InitInstance(HINSTANCE, int);LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);int window_closed = 0; LPDIRECTDRAW lpdd = NULL; LPDIRECTDRAWSURFACE lpddsprimary = NULL;LPDIRECTDRAWSURFACE lpddsback = NULL; DDSURFACEDESC ddsd; HBITMAP hBmp = NULL;RECT rectBmp;BITMAP bm;HDC hdcImage;BOOL InitGame();BOOL UpdateGame();BOOL DestroyGame();void DisplayFps();int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){ MSG msg; LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); LoadString(hInstance, IDC_GAMETEMP, szWindowClass, MAX_LOADSTRING); MyRegisterClass(hInstance); if (!InitInstance (hInstance, nCmdShow)) { return FALSE; } InitGame(); while(1) { if(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) { if(!GetMessage(&msg, NULL, 0, 0)) { break;; } TranslateMessage(&msg); DispatchMessage(&msg); } else { UpdateGame(); } } DestroyGame(); return msg.wParam;}ATOM MyRegisterClass(HINSTANCE hInstance){ WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = (WNDPROC)WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(hInstance, IDI_APPLICATION); wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = CreateSolidBrush(RGB(0,0,0)); wcex.lpszMenuName = NULL; wcex.lpszClassName = szWindowClass; wcex.hIconSm = LoadIcon(wcex.hInstance, IDI_APPLICATION); return RegisterClassEx(&wcex);}BOOL InitInstance(HINSTANCE hInstance, int nCmdShow){ HWND hWnd; hInst = hInstance; hWnd = CreateWindowEx(/*WS_EX_TOPMOST*/NULL,szWindowClass, szTitle, WS_POPUP|WS_VISIBLE, 0, 0, 800, 600, NULL, NULL, hInstance, NULL); if (!hWnd) { return FALSE; } g_hWnd = hWnd; hdc = GetDC(g_hWnd); ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return TRUE;}LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){ switch (message) { case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0;}BOOL InitGame(){ hBmp = (HBITMAP)LoadImage(NULL,"1.bmp",IMAGE_BITMAP,0,0,LR_DEFAULTSIZE|LR_DEFAULTCOLOR|LR_LOADFROMFILE); if(hBmp!=NULL) { GetObject(hBmp,sizeof(BITMAP),&bm); SetRect(&rectBmp,0,0,bm.bmWidth,bm.bmHeight); } if (FAILED(DirectDrawCreate(NULL, &lpdd, NULL))) return(0); if (FAILED(lpdd->SetCooperativeLevel(g_hWnd, DDSCL_FULLSCREEN | DDSCL_ALLOWMODEX | DDSCL_EXCLUSIVE | DDSCL_ALLOWREBOOT))) return(0); if (FAILED(lpdd->SetDisplayMode(800, 600, 16))) return(0); DDRAW_INIT_STRUCT(ddsd); ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT; ddsd.dwBackBufferCount = 1; ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_COMPLEX | DDSCAPS_FLIP; if (FAILED(lpdd->CreateSurface(&ddsd, &lpddsprimary, NULL))) return(0); ddsd.ddsCaps.dwCaps = DDSCAPS_BACKBUFFER; if (FAILED(lpddsprimary->GetAttachedSurface(&ddsd.ddsCaps, &lpddsback))) return(0); return TRUE;}BOOL DestroyGame(){ ::DeleteObject(hBmp); if (lpddsback) { lpddsback->Release(); lpddsback = NULL; } if (lpddsprimary) { lpddsprimary->Release(); lpddsprimary = NULL; } if (lpdd) { lpdd->Release(); lpdd = NULL; } return TRUE;}BOOL UpdateGame(){ if(KEYDOWN(VK_ESCAPE)) SendMessage(g_hWnd,WM_CLOSE,0,0); HDC hdc; DDSURFACEDESC ddsd; HRESULT hr; if(hBmp == NULL || lpddsback == NULL) return E_FAIL; lpddsback->Restore(); hdcImage = CreateCompatibleDC(NULL); SelectObject(hdcImage, hBmp); memset(&ddsd,0x0,sizeof(ddsd)); ddsd.dwSize = sizeof(ddsd); ddsd.dwFlags = DDSD_HEIGHT | DDSD_WIDTH; lpddsback->GetSurfaceDesc(&ddsd); if((hr = lpddsback->GetDC(&hdc)) == DD_OK) { StretchBlt(hdc, 0, 0, ddsd.dwWidth, ddsd.dwHeight, hdcImage, 0,0, bm.bmWidth,bm.bmHeight, SRCCOPY); lpddsback->ReleaseDC(hdc); } DisplayFps(); DeleteDC(hdcImage); if(FAILED(lpddsprimary->Flip(NULL, DDFLIP_WAIT))) { HRESULT ddrval; if(lpddsprimary) ddrval = lpddsprimary->Restore(); ddrval = lpddsback->Restore(); if(FAILED(ddrval)&&(ddrval != DDERR_IMPLICITLYCREATED)) return FALSE; } return TRUE;}void DisplayFps(){ static DWORD count = 0; static char s_FPS[80]=""; static DWORD FrameCount = GetTickCount(); DWORD FrameTime = GetTickCount(); DWORD FPSTime =FrameTime - FrameCount; if(FPSTime > 1000) { sprintf(s_FPS,"FPS: %d",count); FrameCount =FrameTime ; SetBkColor(hdcImage,RGB(0,0,0)); SetTextColor(hdcImage,RGB(100,100,100)); TextOut(hdcImage,10,10,s_FPS,strlen(s_FPS)); count = 0; } count++;} 在文档视图结构里面的view里面有OnDraw()函数吧CBitmap bitmap;HBITMAP hbitmap;hbitmap = ::LoadImage("*.bmp",IMAGE_BITMAP,NULL,LR_LOADFROMFILE);//可能有几个参数不对,查一下就好了OnDraw(CDC* pDC){ bitmap.attach(hbitmap); CDC memdc; CRect rect; GetClientRect(&rect); memdc.CreateCompatibleDC(pDC); memdc.SelectObject(&bitmap); pDC->BitBlt(0,0,rect.right,rect.bottom,&memdc,0,0,SRCCOPY);} 回复人: stoneywang(喜欢飞) :显示不出来啊! //CBitmap bitmap; //HANDLE hbitmap; //hbitmap = ::LoadImage(NULL, // "f:\\a1.bmp", // IMAGE_BITMAP, // NULL, // NULL, // LR_LOADFROMFILE); bitmap.LoadBitmap("f:\\a1.bmp"); CDC memdc; CRect rect; GetClientRect(&rect); memdc.CreateCompatibleDC(pDC); memdc.SelectObject(&bitmap); pDC->BitBlt(0,0,rect.right,rect.bottom,&memdc,0,0,SRCCOPY); bitmap.LoadBitmap("f:\\a1.bmp");如果要选择图片,应该使用LoadImage 就用LoadImage不行么?里面参数设置也很简单的,我是有点不记得了 VCKBASE上代码到是很多,不过还是看看相关知识的比较好 你可以用SetDIBToDevice()啊,这个函数很好用的。偶用的挺好的。 LoadImage與LoadBitmap都可以資源名稱的圖片,但僅僅LoadImage可以直接使用圖片的地址信息來讀取 具體代碼如下: // HDRAWDIB m_hDrawDIB;//#include <Vfw.h> m_hDrawDIB = DrawDibOpen(); // if(m_hDrawDIB) { DrawDibStart(m_hDrawDIB,25); } CBitmap bmp; BITMAP bitmap; HBITMAP hbitmap = NULL; CRect rect; GetClientRect(&rect); HDC dc = ::GetDC(m_hWnd); hbitmap = (HBITMAP)::LoadImage( AfxGetResourceHandle(), MAKEINTRESOURCE(IDB_PIC), IMAGE_BITMAP, 0, 0,////IDB_PIC未需要加載的資源 LR_CREATEDIBSECTION | LR_DEFAULTSIZE /*| LR_LOADFROMFILE*/ ); bmp.Attach(hbitmap); bmp.GetBitmap(&bitmap); BITMAPINFOHEADER hdr; ZeroMemory(&hdr,sizeof(BITMAPINFOHEADER)); hdr.biSize = sizeof(BITMAPINFOHEADER); hdr.biHeight = bitmap.bmHeight; hdr.biWidth = bitmap.bmWidth; hdr.biPlanes = 1; hdr.biBitCount = bitmap.bmBitsPixel; hdr.biCompression = BI_RGB; hdr.biSizeImage = 0;//bitmap.bmWidth*bitmap.bmHeight*(hdr.biBitCount >> 3); hdr.biXPelsPerMeter = 0; hdr.biYPelsPerMeter = 0; hdr.biClrUsed = 0; hdr.biClrImportant = 0; DrawDibDraw(m_hDrawDIB,dc, 0,0, rect.Width(), rect.Height(), &hdr, bitmap.bmBits, 0,0,-1, -1, DDF_SAME_HDC); bmp.Detach(); ::ReleaseDC(m_hWnd,dc); ::DeleteObject(hbitmap); OnDraw(CDC* pDC){ CBitmap bitmap; HBITMAP hbitmap; hbitmap = (HBITMAP)LoadImage(NULL,"*.bmp",IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_DEFAULTSIZE|LR_LOADFROMFILE); bitmap.attach(hbitmap); CDC memdc; CRect rect; GetClientRect(&rect); memdc.CreateCompatibleDC(pDC); memdc.SelectObject(&bitmap); pDC->BitBlt(0,0,rect.right,rect.bottom,&memdc,0,0,SRCCOPY);}这样绝对可以显示位图,要求不高的话,这个就将就着用把 能不能用代码实现移动任务栏? vc++网络游戏编程的难点是什么? CSocket.Create()失败 WHY? 关于COM中的异步方法... 哪位高手能帮我改进我的快速平移BMP图片(大型)的算法?进来看看?万分感谢! 请问如何用消息WM_CTLCOLOR来改变对话框中按钮(Button)的背景颜色? 救命啦::: 高手进!C++作用域不同造成的智能指针困惑 MFC中OnLButtonDown(UINT nFlags, CPoint point) 偶尔不响应 SetDlgCtrlID怎么使用? 关于View和Document关联的简单问题 在线急等~~ 内存泄露?
http://www.codeproject.com/bitmap/cximage.asp
#include "resource.h"
#include "stdio.h"
#include "ddraw.h"
#define MAX_LOADSTRING 100
#define KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)#define _RGB16BIT565(r,g,b) ((b%32) + ((g%64) << 6) + ((r%32) << 11))#define DDRAW_INIT_STRUCT(ddstruct) { memset(&ddstruct,0,sizeof(ddstruct)); ddstruct.dwSize=sizeof(ddstruct); }
HINSTANCE hInst;
HWND g_hWnd;
HDC hdc;
TCHAR szTitle[MAX_LOADSTRING];
TCHAR szWindowClass[MAX_LOADSTRING]; ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);int window_closed = 0; LPDIRECTDRAW lpdd = NULL;
LPDIRECTDRAWSURFACE lpddsprimary = NULL;
LPDIRECTDRAWSURFACE lpddsback = NULL;
DDSURFACEDESC ddsd;
HBITMAP hBmp = NULL;
RECT rectBmp;
BITMAP bm;
HDC hdcImage;
BOOL InitGame();
BOOL UpdateGame();
BOOL DestroyGame();
void DisplayFps();
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
MSG msg;
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_GAMETEMP, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance);
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}
InitGame();
while(1)
{
if(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
{
if(!GetMessage(&msg, NULL, 0, 0))
{
break;;
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
UpdateGame();
}
}
DestroyGame();
return msg.wParam;
}ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC)WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, IDI_APPLICATION);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = CreateSolidBrush(RGB(0,0,0));
wcex.lpszMenuName = NULL;
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, IDI_APPLICATION);
return RegisterClassEx(&wcex);
}BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;
hInst = hInstance;
hWnd = CreateWindowEx(/*WS_EX_TOPMOST*/NULL,szWindowClass, szTitle, WS_POPUP|WS_VISIBLE,
0, 0, 800, 600, NULL, NULL, hInstance, NULL);
if (!hWnd)
{
return FALSE;
}
g_hWnd = hWnd;
hdc = GetDC(g_hWnd);
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}BOOL InitGame()
{
hBmp = (HBITMAP)LoadImage(NULL,"1.bmp",IMAGE_BITMAP,0,0,LR_DEFAULTSIZE|LR_DEFAULTCOLOR|LR_LOADFROMFILE);
if(hBmp!=NULL)
{
GetObject(hBmp,sizeof(BITMAP),&bm);
SetRect(&rectBmp,0,0,bm.bmWidth,bm.bmHeight);
}
if (FAILED(DirectDrawCreate(NULL, &lpdd, NULL)))
return(0);
if (FAILED(lpdd->SetCooperativeLevel(g_hWnd,
DDSCL_FULLSCREEN | DDSCL_ALLOWMODEX |
DDSCL_EXCLUSIVE | DDSCL_ALLOWREBOOT)))
return(0);
if (FAILED(lpdd->SetDisplayMode(800, 600, 16)))
return(0);
DDRAW_INIT_STRUCT(ddsd);
ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
ddsd.dwBackBufferCount = 1;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_COMPLEX | DDSCAPS_FLIP;
if (FAILED(lpdd->CreateSurface(&ddsd, &lpddsprimary, NULL)))
return(0);
ddsd.ddsCaps.dwCaps = DDSCAPS_BACKBUFFER;
if (FAILED(lpddsprimary->GetAttachedSurface(&ddsd.ddsCaps, &lpddsback)))
return(0);
return TRUE;
}BOOL DestroyGame()
{
::DeleteObject(hBmp);
if (lpddsback)
{
lpddsback->Release();
lpddsback = NULL;
}
if (lpddsprimary)
{
lpddsprimary->Release();
lpddsprimary = NULL;
}
if (lpdd)
{
lpdd->Release();
lpdd = NULL;
}
return TRUE;
}BOOL UpdateGame()
{
if(KEYDOWN(VK_ESCAPE))
SendMessage(g_hWnd,WM_CLOSE,0,0);
HDC hdc;
DDSURFACEDESC ddsd;
HRESULT hr;
if(hBmp == NULL || lpddsback == NULL)
return E_FAIL;
lpddsback->Restore();
hdcImage = CreateCompatibleDC(NULL);
SelectObject(hdcImage, hBmp);
memset(&ddsd,0x0,sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_HEIGHT | DDSD_WIDTH;
lpddsback->GetSurfaceDesc(&ddsd);
if((hr = lpddsback->GetDC(&hdc)) == DD_OK)
{
StretchBlt(hdc, 0, 0, ddsd.dwWidth, ddsd.dwHeight, hdcImage, 0,0, bm.bmWidth,bm.bmHeight, SRCCOPY);
lpddsback->ReleaseDC(hdc);
}
DisplayFps();
DeleteDC(hdcImage);
if(FAILED(lpddsprimary->Flip(NULL, DDFLIP_WAIT)))
{
HRESULT ddrval; if(lpddsprimary)
ddrval = lpddsprimary->Restore(); ddrval = lpddsback->Restore();
if(FAILED(ddrval)&&(ddrval != DDERR_IMPLICITLYCREATED))
return FALSE;
}
return TRUE;
}void DisplayFps()
{
static DWORD count = 0;
static char s_FPS[80]="";
static DWORD FrameCount = GetTickCount();
DWORD FrameTime = GetTickCount();
DWORD FPSTime =FrameTime - FrameCount;
if(FPSTime > 1000)
{
sprintf(s_FPS,"FPS: %d",count);
FrameCount =FrameTime ;
SetBkColor(hdcImage,RGB(0,0,0));
SetTextColor(hdcImage,RGB(100,100,100));
TextOut(hdcImage,10,10,s_FPS,strlen(s_FPS));
count = 0;
}
count++;
}
CBitmap bitmap;
HBITMAP hbitmap;
hbitmap = ::LoadImage("*.bmp",IMAGE_BITMAP,NULL,LR_LOADFROMFILE);//可能有几个参数不对,查一下就好了OnDraw(CDC* pDC)
{
bitmap.attach(hbitmap);
CDC memdc;
CRect rect;
GetClientRect(&rect);
memdc.CreateCompatibleDC(pDC);
memdc.SelectObject(&bitmap);
pDC->BitBlt(0,0,rect.right,rect.bottom,&memdc,0,0,SRCCOPY);
}
//CBitmap bitmap;
//HANDLE hbitmap;
//hbitmap = ::LoadImage(NULL,
// "f:\\a1.bmp",
// IMAGE_BITMAP,
// NULL,
// NULL,
// LR_LOADFROMFILE);
bitmap.LoadBitmap("f:\\a1.bmp"); CDC memdc;
CRect rect;
GetClientRect(&rect);
memdc.CreateCompatibleDC(pDC);
memdc.SelectObject(&bitmap);
pDC->BitBlt(0,0,rect.right,rect.bottom,&memdc,0,0,SRCCOPY);
// HDRAWDIB m_hDrawDIB;
//#include <Vfw.h>
m_hDrawDIB = DrawDibOpen(); //
if(m_hDrawDIB)
{
DrawDibStart(m_hDrawDIB,25);
} CBitmap bmp;
BITMAP bitmap;
HBITMAP hbitmap = NULL;
CRect rect; GetClientRect(&rect);
HDC dc = ::GetDC(m_hWnd);
hbitmap = (HBITMAP)::LoadImage( AfxGetResourceHandle(),
MAKEINTRESOURCE(IDB_PIC), IMAGE_BITMAP, 0, 0,////IDB_PIC未需要加載的資源
LR_CREATEDIBSECTION | LR_DEFAULTSIZE /*| LR_LOADFROMFILE*/ );
bmp.Attach(hbitmap);
bmp.GetBitmap(&bitmap);
BITMAPINFOHEADER hdr;
ZeroMemory(&hdr,sizeof(BITMAPINFOHEADER));
hdr.biSize = sizeof(BITMAPINFOHEADER);
hdr.biHeight = bitmap.bmHeight;
hdr.biWidth = bitmap.bmWidth;
hdr.biPlanes = 1;
hdr.biBitCount = bitmap.bmBitsPixel;
hdr.biCompression = BI_RGB;
hdr.biSizeImage = 0;//bitmap.bmWidth*bitmap.bmHeight*(hdr.biBitCount >> 3);
hdr.biXPelsPerMeter = 0;
hdr.biYPelsPerMeter = 0;
hdr.biClrUsed = 0;
hdr.biClrImportant = 0;
DrawDibDraw(m_hDrawDIB,dc,
0,0,
rect.Width(),
rect.Height(),
&hdr,
bitmap.bmBits,
0,0,-1,
-1,
DDF_SAME_HDC);
bmp.Detach();
::ReleaseDC(m_hWnd,dc);
::DeleteObject(hbitmap);
{
CBitmap bitmap;
HBITMAP hbitmap;
hbitmap = (HBITMAP)LoadImage(NULL,"*.bmp",IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_DEFAULTSIZE|LR_LOADFROMFILE);
bitmap.attach(hbitmap);
CDC memdc;
CRect rect;
GetClientRect(&rect);
memdc.CreateCompatibleDC(pDC);
memdc.SelectObject(&bitmap);
pDC->BitBlt(0,0,rect.right,rect.bottom,&memdc,0,0,SRCCOPY);
}这样绝对可以显示位图,要求不高的话,这个就将就着用把