2017-03-14 5 views
-1

最近では、ユーザーが外部ディレクトリから.bmpファイルをロードできるようにアプリケーションを取得できました。アプリケーションは画像をうまく読み込みますが、ユーザーが複数の画像をハイライト表示した場合、LoadImage()関数は不平を言っています。複数のファイルを一度に取得しているため、正しく読み込む方法がわからないためです。 (多分)。ここで複数のビットマップを読み込むことができません - WinAPI

は私のInit関数は

void InitialiseDialog(HWND hwnd) 
{ 
    ZeroMemory(&ofn, sizeof(ofn)); 
    ofn.lStructSize = sizeof(OPENFILENAME); 
    ofn.hInstance = GetModuleHandle(NULL); 
    ofn.lpstrCustomFilter = NULL; 
    ofn.nMaxCustFilter = 0; 
    ofn.nFilterIndex = 0; 
    ofn.nMaxFile = MAX_PATH; 

    ofn.hwndOwner = hwnd; 
    ofn.lpstrFile = file; 
    ofn.lpstrFilter = TEXT("Bitmap Files (*.bmp)\0*.bmp\0\0"); 
    ofn.lpstrFileTitle = NULL; 
    ofn.nMaxFileTitle = MAX_PATH; 
    ofn.lpstrInitialDir = NULL; 
    ofn.lpstrTitle = NULL; 
    ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_ALLOWMULTISELECT; 
    ofn.nFileOffset = 0; 
    ofn.nFileExtension = 0; 
    ofn.lpstrDefExt = NULL; 
    ofn.lCustData = 0L; 
    ofn.lpfnHook = NULL; 
    ofn.lpTemplateName = NULL; 
} 

だとここで私はビットマップをロードし、物事を呼んでいる方法は次のとおりです。

bool LoadAndBlitBitmap(LPCWSTR myFile, HDC hWinDC) 
{ 
    // Load the bitmap image file 
    hBitmap = (HBITMAP)::LoadImage(NULL, myFile, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); 

    // Verify that the image was loaded 
    if (hBitmap == NULL) { 
     ::MessageBox(NULL, L"LoadImage Failed", L"Error", MB_OK); 
     return false; 
    } 

    // Create a device context that is compatible with the window 
    HDC hLocalDC; 
    hLocalDC = ::CreateCompatibleDC(hWinDC); 
    // Verify that the device context was created 
    if (hLocalDC == NULL) { 
     ::MessageBox(NULL, L"CreateCompatibleDC Failed", L"Error", MB_OK); 
     return false; 
    } 

    // Get the bitmap's parameters and verify the get 
    BITMAP qBitmap; 
    int iReturn = GetObject(reinterpret_cast<HGDIOBJ>(hBitmap), sizeof(BITMAP), 
     reinterpret_cast<LPVOID>(&qBitmap)); 
    if (!iReturn) { 
     ::MessageBox(NULL, L"GetObject Failed", L"Error", MB_OK); 
     return false; 
    } 

    // Select the loaded bitmap into the device context 
    HBITMAP hOldBmp = (HBITMAP)::SelectObject(hLocalDC, hBitmap); 
    if (hOldBmp == NULL) { 
     ::MessageBox(NULL, L"SelectObject Failed", L"Error", MB_OK); 
     return false; 
    } 

    // Blit the dc which holds the bitmap onto the window's dc 
    BOOL qRetBlit = ::BitBlt(hWinDC, 0, 0, qBitmap.bmWidth, qBitmap.bmHeight, 
     hLocalDC, 0, 0, SRCCOPY); 
    if (!qRetBlit) { 
     ::MessageBox(NULL, L"Blit Failed", L"Error", MB_OK); 
     return false; 
    } 

    // Unitialize and deallocate resources 
    ::SelectObject(hLocalDC, hOldBmp); 
    ::DeleteDC(hLocalDC); 
    ::DeleteObject(hBitmap); 
    return true; 
} 

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    int wmId, wmEvent; 
    PAINTSTRUCT ps; 

    switch (message) 
    { 
    case WM_CREATE: 
     InitialiseDialog(hWnd); 
     return 0; 

    case WM_COMMAND: 
     wmId = LOWORD(wParam); 
     wmEvent = HIWORD(wParam); 

     // Parse the menu selections: 
     switch (wmId) 
     { 
     case ID_FILE_LOADIMAGES: 
      if (GetOpenFileName(&ofn)) 
      { 
       g_bhBitmap = !g_bhBitmap; 
      } 

      InvalidateRect(hWnd, NULL, TRUE); 
      return 0; 

      break; 
     case ID_FILE_LOADAUDIO: 
      DestroyWindow(hWnd); 
      break; 
     case ID_FILE_EXIT: 
      DestroyWindow(hWnd); 
      break; 
     default: 
      return DefWindowProc(hWnd, message, wParam, lParam); 
     } 
    case WM_PAINT: 
     hdc = BeginPaint(hWnd, &ps); 

     if (g_bhBitmap) 
     { 
      LoadAndBlitBitmap(file, hdc); // <-- Something not right about this...? 
     } 

     EndPaint(hWnd, &ps); 
     break; 
    case WM_DESTROY: 

出力1(< - Linkはとても右に新しいタブを開きません。出力を確認するには、新しいタブをクリックして開きます。実際にはエラーメッセージです...)

私のクエリを読んでいただきありがとうございます。私はあなたが私に与えることができるどんな助けにも大いに感謝します:)バイバイ。

編集:ここではいくつかの変数の定義は以下のとおりです。

// Global Variables 
HINSTANCE g_hInst; 
HBITMAP hBitmap; 
HDC hdc; 
static OPENFILENAME ofn; 
bool g_bhBitmap = false; 
wchar_t file[1024]; 
+0

デバッガを使用して、失敗しているMessageBoxにブレークポイントを設定すると、myFileの値を確認できますか? – Neil

+0

ここで 'file'が定義されています。値は – sp2danny

+0

です。' LoadImage'が 'myFile'文字列で失敗した後に' GetLastError'を表示すると便利です。 – RbMm

答えて

0

私の最初の提案は、フラグからOFN_ALLOWMULTISELECTを取り除くことであろう。

このままにしておくと、複数のファイルを正しく選択したユーザーのケースを処理する必要があります。マニュアルから

OFN_ALLOWMULTISELECT

ファイル名]リストボックスは複数選択することができます。

ユーザーが複数のファイルを選択した場合、lpstrFileバッファは、 現在のディレクトリへのパスの後に、 選択ファイルのファイル名を返します。

nFileOffsetメンバは、最初のファイル名 のオフセット(バイト単位または文字単位)で、nFileExtensionメンバは使用されません。

ディレクトリとファイル名の文字列はNULLで区切られ、最後のファイル名の後ろには のNULL文字が追加されます。

あなたは

hBitmap = (HBITMAP)::LoadImage(NULL, myFile, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); 

にあなたは、本質的にビットマップとしてディレクトリをロードしようとしていることを送信します。その代わりに、選択ごとに個別にファインネームを作成し、それらを別々にロードする必要があります。

+0

迅速な対応をありがとうございました。なぜなら、ユーザーに複数のイメージをロードできるようにしたいからです。OFN_ALLOWMULTISELECTが必要です。どのように選択ごとに個別のファイル名を作成することができますか?私のWinAPIの知識はそれほど高度ではありません。アプリケーションに何か他のことができるように、この基本的な機能を実現したいだけです。アイデアは、マルチスレッドを使用して.bmpファイルを同時にロードするアプリケーションを作成することです。 – Jason

+0

'strcat'が1つのオプションになります –

+0

あまりにも厄介なことがないなら、おそらく私に例を教えてください。私は本当にそれを置く方法や場所を知らない:( – Jason

関連する問題