PageRenderTime 42ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/Samples/Chap15/ShowDib1/DibFile.d

http://github.com/AndrejMitrovic/DWinProgramming
D | 135 lines | 104 code | 27 blank | 4 comment | 16 complexity | 72623900b05b70f95e6b84d1e4678e72 MD5 | raw file
  1. /+
  2. + Copyright (c) Charles Petzold, 1998.
  3. + Ported to the D Programming Language by Andrej Mitrovic, 2011.
  4. +/
  5. module DibFile;
  6. import core.memory;
  7. import std.utf;
  8. auto toUTF16z(S)(S s)
  9. {
  10. return toUTFz!(const(wchar)*)(s);
  11. }
  12. import core.sys.windows.windef;
  13. import core.sys.windows.winuser;
  14. import core.sys.windows.wingdi;
  15. import core.sys.windows.winbase;
  16. import core.sys.windows.commdlg;
  17. static OPENFILENAME ofn;
  18. void DibFileInitialize(HWND hwnd)
  19. {
  20. enum szFilter = "Bitmap Files (*.BMP)\0*.bmp\0All Files (*.*)\0*.*\0\0";
  21. ofn.lStructSize = (OPENFILENAME.sizeof);
  22. ofn.hwndOwner = hwnd;
  23. ofn.hInstance = NULL;
  24. ofn.lpstrFilter = szFilter;
  25. ofn.lpstrCustomFilter = NULL;
  26. ofn.nMaxCustFilter = 0;
  27. ofn.nFilterIndex = 0;
  28. ofn.lpstrFile = NULL; // Set in Open and Close functions
  29. ofn.nMaxFile = MAX_PATH;
  30. ofn.lpstrFileTitle = NULL; // Set in Open and Close functions
  31. ofn.nMaxFileTitle = MAX_PATH;
  32. ofn.lpstrInitialDir = NULL;
  33. ofn.lpstrTitle = NULL;
  34. ofn.Flags = 0; // Set in Open and Close functions
  35. ofn.nFileOffset = 0;
  36. ofn.nFileExtension = 0;
  37. ofn.lpstrDefExt = "bmp";
  38. ofn.lCustData = 0;
  39. ofn.lpfnHook = NULL;
  40. ofn.lpTemplateName = NULL;
  41. }
  42. BOOL DibFileOpenDlg(HWND hwnd, PTSTR pstrFileName, PTSTR pstrTitleName)
  43. {
  44. ofn.hwndOwner = hwnd;
  45. ofn.lpstrFile = pstrFileName;
  46. ofn.lpstrFileTitle = pstrTitleName;
  47. ofn.Flags = 0;
  48. return GetOpenFileName(&ofn);
  49. }
  50. BOOL DibFileSaveDlg(HWND hwnd, PTSTR pstrFileName, PTSTR pstrTitleName)
  51. {
  52. ofn.hwndOwner = hwnd;
  53. ofn.lpstrFile = pstrFileName;
  54. ofn.lpstrFileTitle = pstrTitleName;
  55. ofn.Flags = OFN_OVERWRITEPROMPT;
  56. return GetSaveFileName(&ofn);
  57. }
  58. BITMAPFILEHEADER* DibLoadImage(string pstrFileName)
  59. {
  60. BOOL bSuccess;
  61. DWORD dwFileSize, dwHighSize, dwBytesRead;
  62. HANDLE hFile;
  63. BITMAPFILEHEADER* pbmfh;
  64. hFile = CreateFile(pstrFileName.toUTF16z, GENERIC_READ, FILE_SHARE_READ, NULL,
  65. OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL);
  66. if (hFile == INVALID_HANDLE_VALUE)
  67. return NULL;
  68. dwFileSize = GetFileSize(hFile, &dwHighSize);
  69. if (dwHighSize)
  70. {
  71. CloseHandle(hFile);
  72. return NULL;
  73. }
  74. pbmfh = cast(typeof(pbmfh))GC.malloc(dwFileSize);
  75. if (!pbmfh)
  76. {
  77. CloseHandle(hFile);
  78. return NULL;
  79. }
  80. bSuccess = ReadFile(hFile, pbmfh, dwFileSize, &dwBytesRead, NULL);
  81. CloseHandle(hFile);
  82. if (!bSuccess || (dwBytesRead != dwFileSize)
  83. || (pbmfh.bfType != *cast(WORD*)"BM")
  84. || (pbmfh.bfSize != dwFileSize))
  85. {
  86. GC.free(pbmfh);
  87. return NULL;
  88. }
  89. return pbmfh;
  90. }
  91. BOOL DibSaveImage(PTSTR pstrFileName, BITMAPFILEHEADER* pbmfh)
  92. {
  93. BOOL bSuccess;
  94. DWORD dwBytesWritten;
  95. HANDLE hFile;
  96. hFile = CreateFile(pstrFileName, GENERIC_WRITE, 0, NULL,
  97. CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
  98. if (hFile == INVALID_HANDLE_VALUE)
  99. return FALSE;
  100. bSuccess = WriteFile(hFile, pbmfh, pbmfh.bfSize, &dwBytesWritten, NULL);
  101. CloseHandle(hFile);
  102. if (!bSuccess || (dwBytesWritten != pbmfh.bfSize))
  103. {
  104. DeleteFile(pstrFileName);
  105. return FALSE;
  106. }
  107. return TRUE;
  108. }