2013-04-02 119 views
1

该程序只显示一个空白窗口。窗口无法加载位图图像

我想将位图图像随机加载到屏幕上。我无法弄清楚这一点。即使我在这个程序中给图像赋予不同的名字,程序仍然执行时没有任何错误,并显示空白窗口。

请帮帮我!

#ifndef UNICODE 
#define UNICODE 
#endif 

/*have used unicode */ 

#include<Windows.h> 
#include<iostream> 
#include<time.h> 
using namespace std; 

bool gameover =FALSE; 
const wchar_t classname[] = L"My first procedure and main"; 
HWND window; 
HDC device; 
LRESULT CALLBACK WindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam); 


ATOM MyRegisterClass(HINSTANCE hInstance) 
{ 
    //set the new windows properties 
    WNDCLASS wc = {}; 

    wc.lpfnWndProc=(WNDPROC)WindowProc; 
    wc.hInstance=hInstance; 
    wc.style=CS_HREDRAW|CS_VREDRAW; 
    wc.hbrBackground=(HBRUSH)GetStockObject(COLOR_WINDOW +1); 
    wc.lpszClassName=classname; 

    return RegisterClass(&wc); 
} 

bool InitInstance(HINSTANCE hInstance,int nCmdShow) 
{ 
    //Create a new window 
    window=CreateWindowEx(0, 
          classname, 
          L"My Program", 
          WS_OVERLAPPEDWINDOW, 
          CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT, 
          NULL, 
          NULL, 
          hInstance, 
          NULL); 

    //Any error in creating the window ? 
    if(window==0) 
     return 0; 

    //Display the window 
    ShowWindow(window,nCmdShow); 
    UpdateWindow(window); 
    device=GetDC(window); 
    return 1; 
} 

bool Game_Init() 
{ 
    srand(time(NULL)); 
    return 1; 
} 

// This function handles the loading of bitmap image into the window 
void DrawBitmap(char *filename,int x,int y) 
{ 
    //Load the bitmap image 
    HBITMAP image=(HBITMAP)LoadImage(0,L"image.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); 
    BITMAP bm; 
    GetObject(image,sizeof(BITMAP),&bm); 
    HDC hdcdevice=CreateCompatibleDC(device); 
    SelectObject(hdcdevice,image); 
    BitBlt(device,x,y,bm.bmWidth,bm.bmHeight,hdcdevice,0,0,SRCCOPY); 

    //delete the device context and bitmap 
    DeleteDC(hdcdevice); 
    DeleteObject((HBITMAP)image); 
} 

void Game_Run() 
{ 
    if(gameover==true) 
     return; 
    RECT rect; 
    GetClientRect(window,&rect); 

    //draw bitmap at random location 
    int x=rand() % (rect.right-rect.left); 
    int y=rand() %(rect.bottom-rect.top); 

    DrawBitmap("image.bmp",x,y); 
} 

void Game_End() 
{ 
    //Free the device 
    ReleaseDC(window,device); 
} 

int WINAPI wWinMain(HINSTANCE hInstance,HINSTANCE,PWSTR PCmdLine,int nCmdShow) 
{ 
    //Register the class  
    MyRegisterClass(hInstance); 

    //Initialize application 
    if(!InitInstance(hInstance,nCmdShow)) 
     return 0; 

    //Declare variables 
    MSG msg ={ }; 

    //Initialize the game 
    if(!Game_Init()) 
     return 0; 

    //main message loop 
    while(!gameover) 
    { 
     if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) 
     { 
      TranslateMessage(&msg); 
      DispatchMessage(&msg); 
     } 
     Game_Run(); 
    } 
    Game_End(); 

    return msg.wParam; 
} 

//This is window procedure function for handling closing of windows. 
LRESULT CALLBACK WindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam) 
{ 
    switch(uMsg) 
    { 
     case WM_CLOSE: 
      if(MessageBox(hwnd,L"Do you want to close this window",NULL,MB_OKCANCEL)==IDOK)   
       gameover=true; 
      DestroyWindow(hwnd); 


    } 
    return DefWindowProc(hwnd,uMsg,wParam,lParam); 
} 

This is the output of my program

+0

我试图添加图像调试文件夹也不过 –

+0

如果程序显示一个空白窗口,它正在执行。你的问题的标题很混乱。 – Oswald

+4

要得到任何错误,你首先应该检查错误。或者,使用调试器并通过它检查所有返回值。 –

回答

3

传递给函数的LoadImage BMP文件的完整路径。同时检查LoadImage函数的返回值。

对于如。

HBITMAP image=(HBITMAP)LoadImage(0,L"c:\\wherever\\whatever\\image.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); 
if(image == NULL) 
    MessageBox(0, "Couldn't load the image", "Error", MB_OK); 
else 
    .... Whatever else ...... 

几乎可以肯定,您的LoadImage无法找到“image.bmp”,因此返回NULL。

+0

消息框弹出显示无法加载image.I尝试包括路径也但它不工作。 –

+0

@NaveenGabriel - 你可以复制粘贴你的确切LoadImage调用这里的路径? – user93353

+0

确定图像的值是0xcccccccc。它是什么意思? –

0

检查手柄的值,如“设备”和“图像”。

尝试并浏览代码,看看是否一切正常。

您也可以选择使用LoadBitmap()。

+0

我正在使用64位Windows 8操作系统。 –

+0

你的位图文件的格式是什么? – james82345

+0

它是一个8位位图吗? – james82345