3

変換する必要があります:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms646839(v=vs.85).aspx

lpstrFileTitle
Type: LPTSTR
The file name and extension (without path information) of the selected file. This member can be NULL.

MSVC++ 2012 Express では LPSTR と表示されていますが。

http://msdn.microsoft.com/en-us/library/windows/desktop/bb172802(v=vs.85).aspx

pSrcFile [in]
Type: LPCTSTR
Pointer to a string that specifies the filename. If the compiler settings require Unicode, the data type LPCTSTR resolves to LPCWSTR. Otherwise, the string data type resolves to LPCSTR. See Remarks.

これは非常にありがたいです。:)

char szFileName[MAX_PATH] = {0};
char szFileTitleName[MAX_PATH] = {0};
HRESULT hr = S_OK;
RtlZeroMemory(&gc.ofn, sizeof(gc.ofn));

gc.ofn.lStructSize      =   sizeof(gc.ofn);
gc.ofn.hwndOwner        =   hWnd;
gc.ofn.lpstrFilter      =   "All Image Files\0"              "*.bmp;*.dib;*.wdp;*.mdp;*.hdp;*.gif;*.png;*.jpg;*.jpeg;*.tif;*.ico\0"
"Windows Bitmap\0"               "*.bmp;*.dib\0"
"High Definition Photo\0"        "*.wdp;*.mdp;*.hdp\0"
"Graphics Interchange Format\0"  "*.gif\0"
"Portable Network Graphics\0"    "*.png\0"
"JPEG File Interchange Format\0" "*.jpg;*.jpeg\0"
"Tiff File\0"                    "*.tif\0"
"Icon\0"                         "*.ico\0"
"All Files\0"                    "*.*\0"
"\0";
gc.ofn.nMaxFileTitle = MAX_PATH;
gc.ofn.lpstrFileTitle = gc.szFileTitleName; // its a char
gc.ofn.lpstrFile       = szFileName;
gc.ofn.nMaxFile        = MAX_PATH;
gc.ofn.lpstrTitle      = "Open Image";
gc.ofn.Flags           = OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST;

if(GetOpenFileName(&gc.ofn)) {
gc.render_on = true;
}

.

D3DXCreateTextureFromFileEx (d3dDevice, gc.szFileTitleName , D3DX_DEFAULT_NONPOW2, D3DX_DEFAULT_NONPOW2, 0, 0,
        D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, D3DX_DEFAULT, D3DX_DEFAULT,
        colorkey, &init_map->image_info, NULL, &init_map->texture_buffer)

これは空白の画像になります。GetOpenFile の直後にメッセージ ボックスを使用してこれをテストしたところ、すばらしい結果が得られました。

MessageBoxA ( NULL , gc.ofn.lpstrFileTitle , "" , 0 );

しかし、D3DXCreateTextureFromFileEx の前では、めちゃくちゃです。

char を gc.szFileTitleName に格納するだけです。なぜ他の方法が範囲外になったのかわかりません...

4

2 に答える 2

5

LPCTSTRの単なるconstバージョンですLPTSTR。そのタイプの変換は標準の変換であるため、必要なものを取得するために明示的に何もする必要はありません。エラーは別の場所にあるはずです。

コードの一部を set でコンパイルし、一部を set でコンパイルしない限りUNICODE...

于 2012-12-28T19:36:37.330 に答える
1

GetOpenFileName()D3DXCreateTextureFromFileEx()、およびMessageBox()すべて-TCHARベースの文字列を処理しますが、実際にはTCHARコードで使用していません。代わりにこれを試してください:

TCHAR szFileName[MAX_PATH] = {0};
TCHAR szFileTitleName[MAX_PATH] = {0};
HRESULT hr = S_OK;
RtlZeroMemory(&gc.ofn, sizeof(gc.ofn));

gc.ofn.lStructSize      =   sizeof(gc.ofn);
gc.ofn.hwndOwner        =   hWnd;
gc.ofn.lpstrFilter      =   TEXT("All Image Files\0")              TEXT("*.bmp;*.dib;*.wdp;*.mdp;*.hdp;*.gif;*.png;*.jpg;*.jpeg;*.tif;*.ico\0")
                            TEXT("Windows Bitmap\0")               TEXT("*.bmp;*.dib\0")
                            TEXT("High Definition Photo\0")        TEXT("*.wdp;*.mdp;*.hdp\0")
                            TEXT("Graphics Interchange Format\0")  TEXT("*.gif\0")
                            TEXT("Portable Network Graphics\0")    TEXT("*.png\0")
                            TEXT("JPEG File Interchange Format\0") TEXT("*.jpg;*.jpeg\0")
                            TEXT("Tiff File\0")                    TEXT("*.tif\0")
                            TEXT("Icon\0")                         TEXT("*.ico\0")
                            TEXT("All Files\0")                    TEXT("*.*\0")
                            TEXT("\0");
gc.ofn.nMaxFileTitle = MAX_PATH;
gc.ofn.lpstrFileTitle = gc.szFileTitleName;
gc.ofn.lpstrFile       = szFileName;
gc.ofn.nMaxFile        = MAX_PATH;
gc.ofn.lpstrTitle      = TEXT("Open Image");
gc.ofn.Flags           = OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST;

if(GetOpenFileName(&gc.ofn)) {
    gc.render_on = true;
}

.

D3DXCreateTextureFromFileEx (d3dDevice, gc.szFileTitleName , D3DX_DEFAULT_NONPOW2, D3DX_DEFAULT_NONPOW2, 0, 0, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, D3DX_DEFAULT, D3DX_DEFAULT, colorkey, &init_map->image_info, NULL, &init_map->texture_buffer)

.

MessageBox(NULL, gc.ofn.lpstrFileTitle, TEXT(""), 0);
于 2012-12-28T21:53:28.527 に答える