2013-12-14 34 views
3

我正在寫一個函數,可以快速繪製我正在製作的遊戲的菜單圖像。我能夠繪製背景和文本塊就好了,但我無法在屏幕Win32應用程序。 HBITMAP LoadImage無法加載任何內容

bool menu::drawMenu(PAINTSTRUCT ps) 
{ 
HWND hWnd = GetActiveWindow(); 
HDC hdc = GetDC(hWnd), hdcMem; 

//Draw a new background 

HPEN blackPen = CreatePen(PS_SOLID, 1, RGB(0, 0, 0)); 
HBRUSH blackBrush = CreateSolidBrush(RGB(0, 0, 0)); 
SelectObject(hdc, blackPen); 
SelectObject(hdc, blackBrush); 
Rectangle(hdc, 0, 0, 1080, 720); 

//insert selection text 

TextOut(hdc, 30, 0, L"New Game", 8); 
TextOut(hdc, 30, 30, L"Exit Game", 9); 

//draw arrow sprite 

HBITMAP arrow = (HBITMAP)LoadImage(NULL, L"C:\\Users\\Tim\documents\\visual studio 2013\\Projects\\BoulderBisque\\BoulderBisque\\arrow.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); 
    DWORD lastError = GetLastError(); 
if (arrow == NULL) 
{ 
    TextOut(hdc, 0, 60, L"Image Load Failed", 17); 
    return false; 
} 
hdcMem = CreateCompatibleDC(hdc); 
if (hdcMem == NULL) 
{ 
    TextOut(hdc, 0, 90, L"Memory Creation Failed", 22); 
    return false; 
} 
SelectObject(hdcMem, arrow); 
BitBlt(hdc, 0, choice * 30, 16, 16, hdcMem, 0, 0, SRCCOPY); 

//cleanup 

ReleaseDC(hWnd, hdc); 
DeleteDC(hdcMem); 

return true; 
} 

截至目前箭頭是NULL創建位圖圖像,我得到了加載圖像失敗文本框。 我正在使用arrow.bmp的相對路徑,我也嘗試使用完整路徑,但也沒有工作。

你可能已經注意到這個函數在WndProc之外。其他一切都很好。 我試着在那裏運行它,但是arrow.bmp加載。

我做錯了什麼導致arrow.bmp爲NULL?我有其他方法我打算以類似的方式運行,所以讓這個函數運行真的是一個很大的幫助。

編輯*每當我給完整的路徑名稱它仍然無法加載。 也是這不是適當的代碼爲SO?這是我的第一個問題...

編輯** aditional'/'s沒有解決這個問題。

編輯***使用GetLastError函數,我發現錯誤代碼爲2,ERROR_FILE_NOT_FOUND

+1

始終使用文件的完整路徑。始終在SO問題中發佈正確的代碼。 –

+0

'GetActiveWindow'調用也似乎有點可疑。 –

+0

應該是「L」C:\\ Users \\ Tim \\ Documents \\ visual studio 2013 \\ Projects \\ BoulderBisque \\ BoulderBisque \\ arrow.bmp「'帶有更多'\\'東西。 –

回答

2

你早日問題的版本檢查的​​返回值,但然後做罷了。 documentation這樣說:

如果函數失敗,返回值是NULL。要獲得更多的錯誤信息,請致電GetLastError

所以,如果函數失敗,請致電GetLastError找出原因。當您這樣做時,您將獲得錯誤代碼ERROR_FILE_NOT_FOUND。這是非常確定的。您指定的文件名不存在。

請注意,該問題的最新更新中的代碼無條件地調用GetLastError。這是一個錯誤,在Stack Overflow上這個問題太頻繁了。該文件僅告訴您在​​的呼叫失敗時致電GetLastError。如果​​的呼叫成功,則返回GetLastError的值無意義。 Win32中的錯誤處理的處理方式與​​相同,但並非總是如此。所以你必須非常仔細地閱讀文檔。


也許來代替

C:\\Users\\Tim\documents\\... 

你的意思

C:\\Users\\Tim\\documents\\... 

OK,現在你已經得到了正確的路徑。撥打​​返回NULL,但GetLastError不再有用,並返回ERROR_SUCCESS。這本身很奇怪。

我認爲問題在於您的圖片使用的格式​​不理解。我把你的.bmp文件加載到Paint.net中,然後重新保存。一旦我這樣做,重新保存的圖像被成功加載。


而不是試圖從一個文件加載它,這將使圖像作爲資源鏈接並加載它更有意義。

+0

我的文件路徑一定有問題,因爲我試圖使用的文件確實存在。我確定它拼寫正確。我將它包含在Visual Studio的資源中以獲取確切的路徑。所以如果路徑是 C:\ Users \ Tim \ Documents \ Visual Studio 2013 \ Projects \ BoulderBisque \ BoulderBisque \ arrow.bmp 和相對路徑只是 arrow.bmp 第二個參數應該是什麼? – user1919573

+0

請仔細閱讀我的最新更新。 –

+0

好吧,當我編輯GetLastError中的一個'\'現在是0,這意味着它成功了,但箭頭仍然是NULL,所以它仍然失敗,當我通過調試器運行時它說箭頭是NULL,因爲 至於無條件地調用GetLastError,在我將這個問題分類之後,我會想到更聰明的做法。 – user1919573

相關問題