2012-01-11 5 views
0

私はここで新しいです、私はC#でより適合しています。Win32 C++:openfilenameを使用してビットマップファイルを表示する

したがって、私は現在、このようなジレンマにC++の専門家の助けを必要としています。

以下に記載されているのは、私が完了するために必要と考えるコードスニペットだけですが、それでもなお達成されるべきと考えています。

#include "stdafx.h" 
#include "winmain.h" 
#include "Resource.h" 
#include <stdio.h> 
#include <CommDlg.h> 
#include <windows.h> 

OPENFILENAME ofn; 
TCHAR szFile[260]; 

switch (message) 
    { 
    case WM_COMMAND: 
     wmId = LOWORD(wParam); 
     wmEvent = HIWORD(wParam); 
     // Parse the menu selections: 
     switch (wmId) 
     { 
           case ID_FILE_LOADBITMAP: 
      bBitmap = !bBitmap; 
      InvalidateRect(hWnd,0,TRUE); 
      break; 
    default: 
     return DefWindowProc(hWnd, message, wParam, lParam); 
    } 

case WM_PAINT: 
     hdc = BeginPaint(hWnd, &ps); 
     // TODO: Add any drawing code here... 
if(bBitmap) 
     { 
     ZeroMemory(&ofn, sizeof(ofn)); 
     ofn.lStructSize = sizeof(ofn); 
     ofn.hwndOwner = hWnd; 
     ofn.lpstrFile = szFile; 
     // 
     // Set lpstrFile[0] to '\0' so that GetOpenFileName does not 
     // use the contents of szFile to initialize itself. 
     // 
     ofn.lpstrFile[0] = '\0'; 
     ofn.nMaxFile = sizeof(szFile); 
     ofn.nFilterIndex = 1; 
     ofn.lpstrFileTitle = NULL; 
     ofn.nMaxFileTitle = 0; 
     ofn.lpstrInitialDir = NULL; 
     ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; 

     // Display the Open dialog box. 

     if (GetOpenFileName(&ofn)==TRUE) 
      hf = CreateFile(ofn.lpstrFile, GENERIC_READ, 
       0, (LPSECURITY_ATTRIBUTES) NULL, 
       OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 
       (HANDLE) NULL); 

    LoadBitmap(__T("F-35C.bmp"), hdc); 

     EndPaint(hWnd, &ps); 
     break; 
     } 

あなたが見ることができるように、私は私の場合メニューをクリックすると:それはちょうどopenfiledialogをロードし、私はWindowsで表示せずにしたいファイルを選択しますLoadBitmap

、それがすべてです。私が実際にしたいのは、ファイルパスを関数( "F-35C.bmp")でハードコーディングするのではなく、LoadBitmap関数にロードすることです。

また、ofn.lpStrFileにファイルパスがありますがofn.lpStrFileで__T(「F-35C.bmp」)を交換するにもかかわらず、ビットマップファイルをロードすることができません。

として以下LoadBitMap関数の機能を示しています。

bool LoadBitmap(LPCWSTR szFileName, HDC hWinDC) 
{ 
    // Load the bitmap image file 
    HBITMAP hBitmap; 
    hBitmap = (HBITMAP)::LoadImage(NULL, szFileName, IMAGE_BITMAP, 0, 0, 
     LR_LOADFROMFILE); 
    // Verify that the image was loaded 
    if (hBitmap == NULL) { 
     ::MessageBox(NULL, __T("LoadImage Failed"), __T("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, __T("CreateCompatibleDC Failed"), __T("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, __T("GetObject Failed"), __T("Error"), MB_OK); 
     return false; 
    } 

    // Select the loaded bitmap into the device context 
    HBITMAP hOldBmp = (HBITMAP)::SelectObject(hLocalDC, hBitmap); 
    if (hOldBmp == NULL) { 
     ::MessageBox(NULL, __T("SelectObject Failed"), __T("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, __T("Blit Failed"), __T("Error"), MB_OK); 
     return false; 
    } 

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

に追加するには、私はWin32アプリケーション(コンソールではない)でMicrosoft Visual Studio 2010 Developerバージョンを使用しています。

+0

実際の質問は何ですか?私はあなたのポストに疑問符を見ない。たぶん、あなたの問題がどこで指定されているのかを正確に強調するべきです。 – Xeo

+1

あなたのコードはできるだけ短く、問題はまだ残っているはずですが、hf = CreateFile(...)はユーザーからファイル名を取得した後です。共有モードに互換性がない場合、ビットマップの読み込みが失敗する可能性があります。 – tinman

+0

コメントありがとうございました。 問題は:現在、ハードコードされた "F-35C.bmp"をOpenFileNameのlpStrFileに置き換えたいとします。 しかし、うまくいきません。もう一度申し訳ありません。 – Newbie

答えて

1

あなたはLoadBitmap()のパラメータを後方に持っています。これはMSDNからです:

HBITMAP LoadBitmap(
    __in HINSTANCE hInstance, 
    __in LPCTSTR lpBitmapName 
); 

私はまた、あなたが関数呼び出しのために__T()マクロであなたのファイル名をラップする必要がないことをかなり確信しています。

+0

彼が呼び出すLoadBitmap()は自分のコードであり、Win32 APIではありません。 – tinman

+0

こんにちは!本当にありがとう、私もそれを実現しました! – Newbie

+0

- tinman、LoadBitmap関数は私のものではありませんでした。どこか他の場所から関数を取り出していましたが、とにかく、私を助けてくれた皆さんに本当に感謝しています!ありがとうございました! – Newbie

1

GetOpenFileNameの呼び出しの直後にファイルを開き、CreateFileのdwShareModeパラメータが0(共有は許可されていません)に設定されていて、得られたハンドル(hf )。これにより、呼び出し時にファイルが共有されずに開いているため、LoadImage呼び出しが失敗します。 解決方法:このコードでは使用できないため、CreateFile呼び出しを削除するか、LoadBitmapを呼び出す前にハンドルを閉じます。

1

WM_PAINTの中には、プログラムの実行中に何度も何度も呼ばれることはありません。

ビットマップを一度ロードし、HBITMAPの周りを維持してください。ペイントコードは、HBITMAPで始まります。

関連する問題