0

3 つのグローバル変数があります。

OPENFILENAME ofn;

TCHAR FileName[1024];

TCHAR Title[1024];

WM_CREATE で、ofn の情報を入力します。

static TCHAR filter[] = TEXT("Bitmap Files (*.BMP)\0*.bmp\0") \
    TEXT("All Files (*.*)\0*.*\0\0");

ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = hwnd;
ofn.hInstance = NULL;
ofn.lpstrFilter = filter;
ofn.lpstrCustomFilter = NULL;
ofn.nMaxCustFilter = 0;
ofn.nFilterIndex = 0;
ofn.lpstrFile = NULL;
ofn.nMaxFile = 1024;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 1024;
ofn.lpstrInitialDir = NULL;
ofn.lpstrTitle = NULL;
ofn.Flags = 0;
ofn.nFileOffset = 0;
ofn.nFileExtension = 0;
ofn.lpstrDefExt = TEXT("bmp");
ofn.lCustData = 0;
ofn.lpfnHook = NULL;
ofn.lpTemplateName = NULL;

WM_COMMAND with でcase ID_FILE_SAVE:、私は持っています

            case ID_FILE_SAVE:
                if (!SaveAsBmpDialog(hwnd, FileName, Title))
                    return 0;
                SaveAsBmp(FileName);
                return 0;

どこSaveAsBmpDialogですか

static bool SaveAsBmpDialog(HWND hwnd, TCHAR *fileName, TCHAR *title) 
{
ofn.hwndOwner = hwnd;
ofn.lpstrFile = fileName;
ofn.lpstrFileTitle = title;
ofn.Flags = NULL;

return GetSaveFileName(&ofn);
}

HDC をビットマップ ファイル (開くことができる) に保存することは正常に機能します。

しかし、WM_CHAR withwParam == 'p'では、私は持っています

SaveAsBmp(FileName);
return 0;

この関数SaveAsBmpDialogは、以前に一度に呼び出されたときに使用するため、FileName既にフルパスです。

しかし、開くことができないビットマップファイルを取得します。(最初にファイルを削除しても、ファイルは作成されますが、開くことはできません)。WriteFileファイルサイズは今まで通りですので、動作には問題ないと思いますSaveAsBmp

GetSaveFileName(&ofn)inなしでは機能しない理由がわかりませんWM_CHAR

私が望むのは、保存ダイアログなしで HDC を既存のファイルに保存することです。

ps: ではSaveAsBmp、私は持っています

HANDLE hFile = CreateFile(FileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

DWORD dwBytesWritten;

//SetFilePointer(hFile, 0, NULL, FILE_BEGIN);
WriteFile(hFile, &fileHeader, sizeof(BITMAPFILEHEADER), &dwBytesWritten, NULL);
WriteFile(hFile, &info.bmiHeader, sizeof(BITMAPINFOHEADER) + info.bmiHeader.biClrUsed * sizeof(RGBQUAD), &dwBytesWritten, NULL);
WriteFile(hFile, pPixels, (int) info.bmiHeader.biSizeImage, &dwBytesWritten, NULL);

CloseHandle(hFile);
4

0 に答える 0