2013-07-15 96 views
-1

看看这个代码,并请你告诉我,为什么当我编译它,我看到一个空白屏幕:我的LoadImage不工作 - 我需要知道为什么

#include <windows.h> 
#include <fstream.h> 
#include <stdlib.h> 

static char g_szClassName[] = "TEST"; 
static HINSTANCE g_hInst = NULL; 

int savenumber = 1; 
char savestring[] = "abc"; 

HWND hwnd; 
HDC hdcWindow; 
PAINTSTRUCT ps; 
RECT rc; 
//HBITMAP mario1,mario2,mario3,mario4,mario5,mario6, 
//  block1,block2,block3,scene1,scene1mask; 
HBITMAP scene1; 
BITMAP bm; 

LRESULT CALLBACK 
WndProc(HWND hwnd, UINT nMsg, WPARAM wParam, LPARAM lParam) 
{ 
     HBITMAP g_hbitmap = NULL; 

switch(nMsg) 
{ 
    case WM_CREATE: 
     g_hbitmap = (HBITMAP)LoadImage(GetModuleHandle(NULL), 
            "C:\\Users\\Onwer\\Desktop\\Cpp code Initiate\\Jacob       GRAPIC#3 cpp renewal!\\G3-Images\\scene.bmp", 
            IMAGE_BITMAP, 
            640, 
            320, 
            LR_LOADFROMFILE); 

     /* 
     mario1 = LoadBitmap(g_hInst, "MARIO1BMP"); 
     mario2 = LoadBitmap(g_hInst, "MARIO2BMP"); 
     mario3 = LoadBitmap(g_hInst, "MARIO3BMP"); 
     mario4 = LoadBitmap(g_hInst, "MARIO4BMP"); 
     mario5 = LoadBitmap(g_hInst, "MARIO5BMP"); 
     mario6 = LoadBitmap(g_hInst, "MARIO6BMP"); 
     block1 = LoadBitmap(g_hInst, "BLOCK1BMP"); 
     block2 = LoadBitmap(g_hInst, "BLCOK2BMP"); 
     block3 = LoadBitmap(g_hInst, "BLOCK3BMP"); 
     scene1 = LoadBitmap(g_hInst, "SCENE1BMP"); 
     scene1mask = LoadBitmap(g_hInst, "SCENE1MASKBMP"); 
     */ 
     scene1 = LoadBitmap(g_hInst, "SCENE1BMP"); 

    break; 
    case WM_TIMER: 
    break; 
    case WM_PAINT: 
     hdcWindow = BeginPaint(hwnd, &ps); 
     GetClientRect (hwnd, &rc); 

     drawScene (hdcWindow); 

     //DrawText(hdcWindow,"This Is a Test!", -1, &rc, 
     //DT_SINGLELINE | DT_TOP | DT_TOP); 

     EndPaint(hwnd, &ps);   
    break; 
    case WM_COMMAND: 
    break; 
    case WM_CLOSE: 
    DestroyWindow(hwnd); 
    break; 
    case WM_DESTROY: 

     /* 
     DeleteObject(mario1); 
     DeleteObject(mario2); 
     DeleteObject(mario3); 
     DeleteObject(mario4); 
     DeleteObject(mario5); 
     DeleteObject(mario6); 
     DeleteObject(block1); 
     DeleteObject(block2); 
     DeleteObject(block3); 
     */ 

     PostQuitMessage(0); 
    break; 
    default: 
    return DefWindowProc(hwnd, nMsg, wParam, lParam); 
} 

return 0; 
} 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
LPSTR lpCmdLine, int nCmdShow) 
{ 
ofstream SaveFile ("save.txt"); 
SaveFile << savenumber << '\n' << savestring; 

WNDCLASSEX WndClass; 
HWND hwndMain; 
MSG Msg; 
g_hInst = hInstance; 

WndClass.cbSize  = sizeof(WNDCLASSEX); 
WndClass.style   = 0; 
WndClass.lpfnWndProc = WndProc; 
WndClass.cbClsExtra = 0; 
WndClass.cbWndExtra = 0; 
WndClass.hInstance  = g_hInst; 
WndClass.hIcon   = LoadIcon(NULL, IDI_APPLICATION); 
WndClass.hCursor  = LoadCursor(NULL, IDC_ARROW); 
WndClass.hbrBackground = (HBRUSH)(COLOR_BTNFACE); 
WndClass.lpszMenuName = NULL; 
WndClass.lpszClassName = g_szClassName; 
WndClass.hIconSm  = LoadIcon(NULL, IDI_APPLICATION); 


if(!RegisterClassEx(&WndClass)) 
{ 
    MessageBox(0, "Window Registration Failed!", "Error!", 
    MB_ICONEXCLAMATION | MB_OK | MB_SYSTEMMODAL); 
    return 0; 
} 

hwnd = CreateWindowEx(
    WS_EX_CLIENTEDGE, 
    g_szClassName, 
    "TEST", 
    WS_OVERLAPPEDWINDOW, 
    //CW_USEDEFAULT, CW_USEDEFAULT, 677, 358, 
    CW_USEDEFAULT, CW_USEDEFAULT, 800, 500, 
    NULL, NULL, g_hInst, NULL); 


if(hwnd == NULL) 
{ 
    MessageBox(0, "Window Creation Failed!", "Error!", 
    MB_ICONEXCLAMATION | MB_OK | MB_SYSTEMMODAL); 
    return 0; 
} 

ShowWindow(hwnd, nCmdShow); 
UpdateWindow(hwnd); 

while(GetMessage(&Msg, NULL, 0, 0)) 
{ 
    TranslateMessage(&Msg); 
    DispatchMessage(&Msg); 
} 
return Msg.wParam; 
} 

我需要知道为什么没有按的LoadImage” t显示指定的图片。它甚至不应该?如果它不应该t:告诉我什么函数,我应该使用loadImage,这是C++的Windows.h的一部分。我正在使用Dev-C++编译器。

+0

'drawScene'中的代码被注释掉了。如果这就是你当前的实现方式,那么没有任何东西可以吸引到设备上。 –

+0

...是啊我知道这是从早些时候,我会删除... ...但IM特别谈论WM_CREATE内的LoadImage。实际上,我没有评论说这是无效的,因为里面的东西不起作用 - 所以如果你能告诉我如何让它工作,这将是很好的,但我不指望你。 –

+0

任何看到队长表现出色的人都应该知道,我刚刚删除了他提到的那个部分,因为它并不意味着在这里。谢谢。 –

回答

2

全部​​它是否加载图像,没有别的。如果您希望应用程序在窗口中绘制图像,则必须自己完成。

drawScene()的内容被注释掉(因为在编辑中被删除),并且您的WM_PAINT处理程序不执行任何绘图操作。 如果您的位图已成功加载,则在处理WM_PAINT消息时,您需要执行类似下面的操作。

hdcMemory = CreateCompatibleDC(hdcWindow); 

HGDIOBJ oldBitmap = SelectObject(hdcMemory, g_hbitmap); 
BitBlt(hdcWindow, 0, 0, 640, 320, hdcMemory, 0, 0, SRCCOPY); 
SelectObject(hdcMemory, oldBitmap); 

DeleteDC(hdcMemory); 
+0

多数民众赞成在伟大和所有,我知道它应该工作,我已经加载了一个图像以不同的方式之前,然后使用它(在不同的程序),它运作良好,但在这个程序中,我得到一个链接器错误对应于“SelectObject @ 8“,”BitBlt @ 32“和”DeleteDC @ 4“。 –

+0

我真的希望这个程序能够工作D:但是无论我使用那些东西时我做了什么,我都会收到Linker错误。 –

+0

您需要链接gdi32.lib库。检查你的项目设置,确保它在链接器配置中。 –

相关问题