当前位置:Gxlcms > 数据库问题 > 第15章 设备相关位图_15.3 DIB和DDB的结合

第15章 设备相关位图_15.3 DIB和DDB的结合

时间:2021-07-01 10:21:17 帮助过:1人阅读

15.3.1 从DIB创建DDB

(1)hBitmap =CreateDIBitmap(…)——注意这名称会误导,实际上创建的是DDB

参数

说明

hdc

设备环境句柄,可以为NULL。

pInfoHdr

指向DIB信息头的指针,即BITMAPINFOHEADER

fInit

0或CBM_INIT。CBM_INIT指定用后面3个参数来初始化DDB中的像素位

pBits

DIB像素位的指针

pInfo

DIB信息指针,即BITMAPINFO(包含BITMAPINFOHEADER和颜色表)

fClrUse

颜色使用标志位:DIB_RGB_COLORS(0)或DIB_PAL_COLORS(1)

注意:①返回值:跟CreateBitmap一样都返回一个GDI位图对象,可以直接选入DC中,并在上面绘图,以改变像素位。

     ②名称会误导,它是从一个DIB中创建一个DDB。

(2)CreateDIBitmap函数内部大致的代码实现

  1. HBITMAP CreateDIBitmap(HDC hdc, CONST BITMAPINFOHEADER*<span style="color: #000000;"> pbmih,
  2. DWORD fInit, CONST VOID</span>* pBits,CONST BITMAPINFO*<span style="color: #000000;"> pbmi, UINT fUsage)
  3. {
  4. HBITMAP hBitmap;
  5. HDC hdc,hdcMem;
  6. </span><span style="color: #0000ff;">int</span><span style="color: #000000;"> cx, cy, iBitCount;
  7. </span><span style="color: #008000;">//</span><span style="color: #008000;">从第2个参数读取DIB信息头的信息</span>
  8. <span style="color: #0000ff;">if</span> (pbmih->biSize == <span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(BITMAPCOREHEADER))
  9. {
  10. cx </span>= ((PBITMAPCOREHEADER)pbmih)-><span style="color: #000000;">bcWidth;
  11. cy </span>= ((PBITMAPCOREHEADER)pbmih)-><span style="color: #000000;">bcHeight;
  12. iBitCount </span>= ((PBITMAPCOREHEADER)pbmih)-><span style="color: #000000;">bcBitCount;
  13. }
  14. </span><span style="color: #0000ff;">else</span><span style="color: #000000;">
  15. {
  16. cx </span>= pbmih-><span style="color: #000000;">biWidth;
  17. cy </span>= pbmih-><span style="color: #000000;">biHeight;
  18. iBitCount </span>= pbmih-><span style="color: #000000;">biBitCount;
  19. }
  20. </span><span style="color: #008000;">//</span><span style="color: #008000;">创建DDB</span>
  21. <span style="color: #0000ff;">if</span><span style="color: #000000;"> (hdc)
  22. hBitmap </span>=<span style="color: #000000;"> CreateCompatibleBitmap(hdc, cx, cy);
  23. </span><span style="color: #0000ff;">else</span><span style="color: #000000;">
  24. hBitmap </span>= CreateBitmap(cx, cy, <span style="color: #800080;">1</span>, <span style="color: #800080;">1</span>, NULL);<span style="color: #008000;">//</span><span style="color: #008000;">单色位图
  25. </span><span style="color: #008000;">//</span><span style="color: #008000;">后面4个参数是用来初始化DDB的</span>
  26. <span style="color: #0000ff;">if</span> (fInit ==<span style="color: #000000;"> CBM_INIT)
  27. {
  28. hdcMem </span>=<span style="color: #000000;"> CreateCompatibleDC(hdc);
  29. SelectObject(hdcMem, hBitmap);
  30. </span><span style="color: #008000;">//</span><span style="color: #008000;">在内存位图表面绘图,注意这里是DDB位图,己被选入内存DC</span><span style="color: #000000;">
  31. SetDIBitsToDevice(hdcMem, </span><span style="color: #800080;">0</span>, <span style="color: #800080;">0</span>, cx, cy, <span style="color: #800080;">0</span>, <span style="color: #800080;">0</span>, <span style="color: #800080;">0</span><span style="color: #000000;">, cy, pBits, pbmi, fUsage);
  32. DeleteDC(hdcMem);
  33. }
  34. </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> hBitmap;
  35. }</span>

 

(3)应用举例

  ①创建单色GDI位图:hBitmap =CreateDIBitmap(NULL,pbmih,0,NULL,NULL,0);

  ②DC兼容位图:hBitmap = CreateDIBitmap(hdc,pbmih,0,NULL,NULL,0);//未初始化

(4)当CreateDIBitmap时未初始化像素位,后期可调用SetDIBits初始化DDB像素位

参数

说明

hdc

设备环境句柄,当DIB_PAL_COLORS时才需要设备hdc

hBitmap

要设置像素位的位图句柄

yScan

要转换的第一行扫描线

cyScans

扫描线的行数

pBits

将该像素位设给hBitmap的像素位。

pInfo

指向DIB信息头的指针

fClrUse

颜色使用标志

【DIBCONV程序】

技术分享

  1. <span style="color: #008000;">/*</span><span style="color: #008000;">------------------------------------------------------------
  2. DIBCONV.C --Converts a DIB to a DDB
  3. (c) Charles Petzold, 1998
  4. ------------------------------------------------------------</span><span style="color: #008000;">*/</span><span style="color: #000000;">
  5. #include </span><windows.h><span style="color: #000000;">
  6. #include </span><span style="color: #800000;">"</span><span style="color: #800000;">resource.h</span><span style="color: #800000;">"</span><span style="color: #000000;">
  7. LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
  8. </span><span style="color: #0000ff;">static</span> TCHAR szAppName[] = TEXT(<span style="color: #800000;">"</span><span style="color: #800000;">DibConv</span><span style="color: #800000;">"</span><span style="color: #000000;">);
  9. </span><span style="color: #0000ff;">int</span><span style="color: #000000;"> WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
  10. PSTR szCmdLine, </span><span style="color: #0000ff;">int</span><span style="color: #000000;"> iCmdShow)
  11. {
  12. HWND hwnd;
  13. MSG msg;
  14. WNDCLASSEX wndclass;
  15. HACCEL hAccel;
  16. wndclass.style </span>= CS_HREDRAW |<span style="color: #000000;"> CS_VREDRAW;
  17. wndclass.cbSize </span>= <span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(WNDCLASSEX);
  18. wndclass.lpfnWndProc </span>=<span style="color: #000000;"> WndProc;
  19. wndclass.cbClsExtra </span>= <span style="color: #800080;">0</span><span style="color: #000000;">;
  20. wndclass.cbWndExtra </span>= <span style="color: #800080;">0</span><span style="color: #000000;">;
  21. wndclass.hInstance </span>=<span style="color: #000000;"> hInstance;
  22. wndclass.hIcon </span>=<span style="color: #000000;"> LoadIcon(hInstance, szAppName);
  23. wndclass.hIconSm </span>=<span style="color: #000000;"> LoadIcon(hInstance, szAppName);
  24. wndclass.hCursor </span>=<span style="color: #000000;"> LoadCursor(NULL, IDC_ARROW);
  25. wndclass.hbrBackground </span>=<span style="color: #000000;"> (HBRUSH)GetStockObject(WHITE_BRUSH);
  26. wndclass.lpszMenuName </span>=<span style="color: #000000;"> szAppName;
  27. wndclass.lpszClassName </span>=<span style="color: #000000;"> szAppName;
  28. </span><span style="color: #0000ff;">if</span> (!RegisterClassEx(&<span style="color: #000000;">wndclass))
  29. {
  30. MessageBox(NULL, TEXT(</span><span style="color: #800000;">"</span><span style="color: #800000;">This program requires Windows NT!</span><span style="color: #800000;">"</span><span style="color: #000000;">),
  31. szAppName, MB_ICONERROR);
  32. </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">0</span><span style="color: #000000;">;
  33. }
  34. hwnd </span>= CreateWindow(szAppName, <span style="color: #008000;">//</span><span style="color: #008000;"> window class name</span>
  35. TEXT(<span style="color: #800000;">"</span><span style="color: #800000;">DIB to DDB Conversion</span><span style="color: #800000;">"</span>), <span style="color: #008000;">//</span><span style="color: #008000;"> window caption</span>
  36. WS_OVERLAPPEDWINDOW, <span style="color: #008000;">//</span><span style="color: #008000;"> window style</span>
  37. CW_USEDEFAULT, <span style="color: #008000;">//</span><span style="color: #008000;"> initial x position</span>
  38. CW_USEDEFAULT, <span style="color: #008000;">//</span><span style="color: #008000;"> initial y position</span>
  39. CW_USEDEFAULT, <span style="color: #008000;">//</span><span style="color: #008000;"> initial x size</span>
  40. CW_USEDEFAULT, <span style="color: #008000;">//</span><span style="color: #008000;"> initial y size</span>
  41. NULL, <span style="color: #008000;">//</span><span style="color: #008000;"> parent window handle</span>
  42. NULL, <span style="color: #008000;">//</span><span style="color: #008000;"> window menu handle</span>
  43. hInstance, <span style="color: #008000;">//</span><span style="color: #008000;"> program instance handle</span>
  44. NULL); <span style="color: #008000;">//</span><span style="color: #008000;"> creation parameters</span>
  45. <span style="color: #000000;">
  46. ShowWindow(hwnd, iCmdShow);
  47. UpdateWindow(hwnd);
  48. hAccel </span>=<span style="color: #000000;"> LoadAccelerators(hInstance, szAppName);
  49. </span><span style="color: #0000ff;">while</span> (GetMessage(&msg, NULL, <span style="color: #800080;">0</span>, <span style="color: #800080;">0</span><span style="color: #000000;">))
  50. {
  51. </span><span style="color: #0000ff;">if</span> (!TranslateAccelerator(hwnd, hAccel, &<span style="color: #000000;">msg))
  52. {
  53. TranslateMessage(</span>&<span style="color: #000000;">msg);
  54. DispatchMessage(</span>&<span style="color: #000000;">msg);
  55. }
  56. }
  57. </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> msg.wParam;
  58. }
  59. HBITMAP CreateBitmapObjectFromDibFile(HDC hdc, PTSTR szFileName)
  60. {
  61. HBITMAP hBitmap;
  62. BITMAPFILEHEADER</span>*<span style="color: #000000;"> pbmfh;
  63. BOOL bSuccess;
  64. HANDLE hFile;
  65. DWORD dwFileSize, dwHighSize, dwBytesRead;
  66. </span><span style="color: #008000;">//</span><span style="color: #008000;">打开位图,可读可写</span>
  67. hFile =<span style="color: #000000;"> CreateFile(szFileName, GENERIC_READ, FILE_SHARE_READ, NULL,
  68. OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL);
  69. </span><span style="color: #0000ff;">if</span> (hFile ==<span style="color: #000000;"> INVALID_HANDLE_VALUE)
  70. </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> NULL;
  71. </span><span style="color: #008000;">//</span><span style="color: #008000;">读入整个文件</span>
  72. dwFileSize = GetFileSize(hFile, &<span style="color: #000000;">dwHighSize);
  73. </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (dwHighSize)
  74. {
  75. CloseHandle(hFile);
  76. </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> NULL;
  77. }
  78. pbmfh </span>= <span style="color: #0000ff;">malloc</span><span style="color: #000000;">(dwFileSize);
  79. </span><span style="color: #0000ff;">if</span> (!<span style="color: #000000;">pbmfh)
  80. {
  81. CloseHandle(hFile);
  82. </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> NULL;
  83. }
  84. bSuccess </span>= ReadFile(hFile, pbmfh, dwFileSize, &<span style="color: #000000;">dwBytesRead, NULL);
  85. CloseHandle(hFile);
  86. </span><span style="color: #008000;">//</span><span style="color: #008000;">检验是否是位图</span>
  87. <span style="color: #0000ff;">if</span> (!bSuccess || (dwBytesRead != dwFileSize) || (pbmfh->bfType != *(WORD*)<span style="color: #800000;">"</span><span style="color: #800000;">BM</span><span style="color: #800000;">"</span><span style="color: #000000;">))
  88. {
  89. </span><span style="color: #0000ff;">free</span><span style="color: #000000;">(pbmfh);
  90. </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> NULL;
  91. }
  92. </span><span style="color: #008000;">//</span><span style="color: #008000;">创建DDB——注意,这里读入整个文件,并从该DIB文件读入信息头、像素位等信息</span>
  93. hBitmap = CreateDIBitmap(hdc, (BITMAPINFOHEADER*)(pbmfh + <span style="color: #800080;">1</span><span style="color: #000000;">),
  94. CBM_INIT,
  95. (BYTE</span>*)pbmfh + pbmfh-><span style="color: #000000;">bfOffBits,
  96. (BITMAPINFO</span>*)(pbmfh + <span style="color: #800080;">1</span><span style="color: #000000;">),
  97. DIB_RGB_COLORS);
  98. </span><span style="color: #0000ff;">free</span><span style="color: #000000;">(pbmfh);
  99. </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> hBitmap;
  100. }
  101. LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  102. {
  103. </span><span style="color: #0000ff;">static</span> TCHAR szFilter[] = TEXT(<span style="color: #800000;">"</span><span style="color: #800000;">Bitmap File(*.bmp)\0*.bmp\0</span><span style="color: #800000;">"</span><span style="color: #000000;">)
  104. TEXT(</span><span style="color: #800000;">"</span><span style="color: #800000;">All Files(*.*)\0*.*\0\0</span><span style="color: #800000;">"</span><span style="color: #000000;">);
  105. </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> TCHAR szFileName[MAX_PATH], szTitleName[MAX_PATH];
  106. </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> cxClient, cyClient;
  107. </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> HBITMAP hBitmap;
  108. HDC hdc, hdcMem;
  109. PAINTSTRUCT ps;
  110. BITMAP bitmap;
  111. </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> OPENFILENAME ofn;
  112. </span><span style="color: #0000ff;">switch</span><span style="color: #000000;"> (message)
  113. {
  114. </span><span style="color: #0000ff;">case</span><span style="color: #000000;"> WM_CREATE:
  115. memset(</span>&ofn, <span style="color: #800080;">0</span>, <span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(OPENFILENAME));
  116. ofn.lStructSize </span>= <span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(OPENFILENAME);
  117. ofn.hwndOwner </span>=<span style="color: #000000;"> hwnd;
  118. ofn.lpstrFilter </span>=<span style="color: #000000;"> szFilter;
  119. ofn.lpstrFile </span>=<span style="color: #000000;"> szFileName;
  120. ofn.nMaxFile </span>=<span style="color: #000000;"> MAX_PATH;
  121. ofn.lpstrTitle </span>=<span style="color: #000000;"> szTitleName;
  122. ofn.nMaxFileTitle </span>=<span style="color: #000000;"> MAX_PATH;
  123. ofn.lpstrDefExt </span>= TEXT(<span style="color: #800000;">"</span><span style="color: #800000;">*.bmp</span><span style="color: #800000;">"</span><span style="color: #000000;">);
  124. </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">0</span><span style="color: #000000;">;
  125. </span><span style="color: #0000ff;">case</span><span style="color: #000000;"> WM_SIZE:
  126. cxClient </span>=<span style="color: #000000;"> LOWORD(lParam);
  127. cyClient </span>=<span style="color: #000000;"> HIWORD(lParam);
  128. </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">0</span><span style="color: #000000;">;
  129. </span><span style="color: #0000ff;">case</span><span style="color: #000000;"> WM_COMMAND:
  130. </span><span style="color: #0000ff;">switch</span><span style="color: #000000;"> (LOWORD(wParam))
  131. {
  132. </span><span style="color: #0000ff;">case</span><span style="color: #000000;"> IDM_FILE_OPEN:
  133. </span><span style="color: #008000;">//</span><span style="color: #008000;">显示打开对话框</span>
  134. <span style="color: #0000ff;">if</span> (!GetOpenFileName(&<span style="color: #000000;">ofn))
  135. </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">0</span><span style="color: #000000;">;
  136. </span><span style="color: #008000;">//</span><span style="color: #008000;">删除己经打开的位图</span>
  137. <span style="color: #0000ff;">if</span><span style="color: #000000;"> (hBitmap)
  138. {
  139. DeleteObject(hBitmap);
  140. hBitmap </span>=<span style="color: #000000;"> NULL;
  141. }
  142. SetCursor(LoadCursor(NULL, IDC_WAIT));
  143. ShowCursor(TRUE);
  144. </span><span style="color: #008000;">//</span><span style="color: #008000;">从DIB位图文件中创建DDB</span>
  145. hdc =<span style="color: #000000;"> GetDC(hwnd);
  146. hBitmap </span>=<span style="color: #000000;"> CreateBitmapObjectFromDibFile(hdc, szFileName);
  147. ReleaseDC(hwnd, hdc);
  148. ShowCursor(FALSE);
  149. SetCursor(LoadCursor(NULL, IDC_ARROW));
  150. </span><span style="color: #008000;">//</span><span style="color: #008000;">更新客户区内容</span>
  151. <span style="color: #000000;"> InvalidateRect(hwnd, NULL, TRUE);
  152. </span><span style="color: #008000;">//</span><span style="color: #008000;">错误提示</span>
  153. <span style="color: #0000ff;">if</span> (hBitmap ==<span style="color: #000000;"> NULL)
  154. {
  155. MessageBox(hwnd, TEXT(</span><span style="color: #800000;">"</span><span style="color: #800000;">Cannot load DIB file</span><span style="color: #800000;">"</span>), szAppName, MB_OK |<span style="color: #000000;"> MB_ICONEXCLAMATION);
  156. }
  157. </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">0</span><span style="color: #000000;">;
  158. }
  159. </span><span style="color: #0000ff;">break</span><span style="color: #000000;">;
  160. </span><span style="color: #0000ff;">case</span><span style="color: #000000;"> WM_PAINT:
  161. hdc </span>= BeginPaint(hwnd, &<span style="color: #000000;">ps);
  162. </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (hBitmap)
  163. {
  164. GetObject(hBitmap, </span><span style="color: #0000ff;">sizeof</span>(BITMAP), &<span style="color: #000000;">bitmap);
  165. hdcMem </span>=<span style="color: #000000;"> CreateCompatibleDC(hdc);
  166. SelectObject(hdcMem, hBitmap);
  167. BitBlt(hdc, </span><span style="color: #800080;">0</span>, <span style="color: #800080;">0</span>, bitmap.bmWidth, bitmap.bmHeight, hdcMem, <span style="color: #800080;">0</span>, <span style="color: #800080;">0</span><span style="color: #000000;">, SRCCOPY);
  168. DeleteDC(hdcMem);
  169. }
  170. EndPaint(hwnd, </span>&<span style="color: #000000;">ps);
  171. </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">0</span><span style="color: #000000;">;
  172. </span><span style="color: #0000ff;">case</span><span style="color: #000000;"> WM_DESTROY:
  173. </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (hBitmap)
  174. DeleteObject(hBitmap);
  175. PostQuitMessage(</span><span style="color: #800080;">0</span><span style="color: #000000;">);
  176. </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">0</span><span style="color: #000000;">;
  177. }
  178. </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> DefWindowProc(hwnd, message, wParam, lParam);
  179. }</span>

//resource.h

  1. <span style="color: #008000;">//</span><span style="color: #008000;">{{NO_DEPENDENCIES}}
  2. </span><span style="color: #008000;">//</span><span style="color: #008000;"> Microsoft Visual C++ 生成的包含文件。
  3. </span><span style="color: #008000;">//</span><span style="color: #008000;"> 供 DIBConv.rc 使用
  4. </span><span style="color: #008000;">//
  5. </span><span style="color: #0000ff;">#define</span> IDM_FILE_OPEN 40001
  6. <span style="color: #008000;">//</span><span style="color: #008000;"> Next default values for new objects
  7. </span><span style="color: #008000;">//</span>
  8. <span style="color: #000000;">#ifdef APSTUDIO_INVOKED
  9. #ifndef APSTUDIO_READONLY_SYMBOLS
  10. </span><span style="color: #0000ff;">#define</span> _APS_NEXT_RESOURCE_VALUE 103
  11. <span style="color: #0000ff;">#define</span> _APS_NEXT_COMMAND_VALUE 40004
  12. <span style="color: #0000ff;">#define</span> _APS_NEXT_CONTROL_VALUE 1001
  13. <span style="color: #0000ff;">#define</span> _APS_NEXT_SYMED_VALUE 101
  14. <span style="color: #0000ff;">#endif</span>
  15. <span style="color: #0000ff;">#endif</span>

//DibConv.rc

  1. <span style="color: #008000;">//</span><span style="color: #008000;"> Microsoft Visual C++ generated resource script.
  2. </span><span style="color: #008000;">//
  3. </span>#include <span style="color: #800000;">"</span><span style="color: #800000;">resource.h</span><span style="color: #800000;">"</span>
  4. <span style="color: #0000ff;">#define</span> APSTUDIO_READONLY_SYMBOLS
  5. <span style="color: #808080;">///////////////////////////////////////////////////////////////////////////</span><span style="color: #008000;">//</span>
  6. <span style="color: #008000;">//</span>
  7. <span style="color: #008000;">//</span><span style="color: #008000;"> Generated from the TEXTINCLUDE 2 resource.
  8. </span><span style="color: #008000;">//
  9. </span>#include <span style="color: #800000;">"</span><span style="color: #800000;">winres.h</span><span style="color: #800000;">"</span>
  10. <span style="color: #808080;">///////////////////////////////////////////////////////////////////////////</span><span style="color: #008000;">//</span>
  11. <span style="color: #0000ff;">#undef</span> APSTUDIO_READONLY_SYMBOLS
  12. <span style="color: #808080;">///////////////////////////////////////////////////////////////////////////</span><span style="color: #008000;">//</span>
  13. <span style="color: #008000;">//</span><span style="color: #008000;"> 中文(简体,中国) resources</span>
  14. <span style="color: #0000ff;">#if</span> !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)<span style="color: #000000;">
  15. LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
  16. #ifdef APSTUDIO_INVOKED
  17. </span><span style="color: #808080;">///////////////////////////////////////////////////////////////////////////</span><span style="color: #008000;">//</span>
  18. <span style="color: #008000;">//</span>
  19. <span style="color: #008000;">//</span><span style="color: #008000;"> TEXTINCLUDE
  20. </span><span style="color: #008000;">//
  21. </span><span style="color: #800080;">1</span><span style="color: #000000;"> TEXTINCLUDE
  22. BEGIN
  23. </span><span style="color: #800000;">"</span><span style="color: #800000;">resource.h\0</span><span style="color: #800000;">"</span><span style="color: #000000;">
  24. END
  25. </span><span style="color: #800080;">2</span><span style="color: #000000;"> TEXTINCLUDE
  26. BEGIN
  27. </span><span style="color: #800000;">"</span><span style="color: #800000;">#include </span><span style="color: #800000;">""</span><span style="color: #800000;">winres.h</span><span style="color: #800000;">""</span><span style="color: #800000;">\r\n</span><span style="color: #800000;">"</span>
  28. <span style="color: #800000;">"</span><span style="color: #800000;">\0</span><span style="color: #800000;">"</span><span style="color: #000000;">
  29. END
  30. </span><span style="color: #800080;">3</span><span style="color: #000000;"> TEXTINCLUDE
  31. BEGIN
  32. </span><span style="color: #800000;">"</span><span style="color: #800000;">\r\n</span><span style="color: #800000;">"</span>
  33. <span style="color: #800000;">"</span><span style="color: #800000;">\0</span><span style="color: #800000;">"</span><span style="color: #000000;">
  34. END
  35. </span><span style="color: #0000ff;">#endif</span> <span style="color: #008000;">//</span><span style="color: #008000;"> APSTUDIO_INVOKED</span>
  36. <span style="color: #808080;">///////////////////////////////////////////////////////////////////////////</span><span style="color: #008000;">//</span>
  37. <span style="color: #008000;">//</span>
  38. <span style="color: #008000;">//</span><span style="color: #008000;"> Menu
  39. </span><span style="color: #008000;">//
  40. </span><span style="color: #000000;">DIBCONV MENU
  41. BEGIN
  42. POPUP </span><span style="color: #800000;">"</span><span style="color: #800000;">&File</span><span style="color: #800000;">"</span><span style="color: #000000;">
  43. BEGIN
  44. MENUITEM </span><span style="color: #800000;">"</span><span style="color: #800000;">&Open...\tCtrl+O</span><span style="color: #800000;">"</span><span style="color: #000000;">, IDM_FILE_OPEN
  45. END
  46. END
  47. </span><span style="color: #808080;">///////////////////////////////////////////////////////////////////////////</span><span style="color: #008000;">//</span>
  48. <span style="color: #008000;">//</span>
  49. <span style="color: #008000;">//</span><span style="color: #008000;"> Accelerator
  50. </span><span style="color: #008000;">//
  51. </span><span style="color: #000000;">DIBCONV ACCELERATORS
  52. BEGIN
  53. </span><span style="color: #800000;">"</span><span style="color: #800000;">^O</span><span style="color: #800000;">"</span><span style="color: #000000;">, IDM_FILE_OPEN, ASCII, NOINVERT
  54. END
  55. </span><span style="color: #0000ff;">#endif</span> <span style="color: #008000;">//</span><span style="color: #008000;"> 中文(简体,中国) resources</span>
  56. <span style="color: #808080;">///////////////////////////////////////////////////////////////////////////</span><span style="color: #008000;">//</span>
  57. <span style="color: #000000;">#ifndef APSTUDIO_INVOKED
  58. </span><span style="color: #808080;">///////////////////////////////////////////////////////////////////////////</span><span style="color: #008000;">//</span>
  59. <span style="color: #008000;">//</span>
  60. <span style="color: #008000;">//</span><span style="color: #008000;"> Generated from the TEXTINCLUDE 3 resource.
  61. </span><span style="color: #008000;">//
  62. </span><span style="color: #808080;">///////////////////////////////////////////////////////////////////////////</span><span style="color: #008000;">//</span>
  63. <span style="color: #0000ff;">#endif</span> <span style="color: #008000;">//</span><span style="color: #008000;"> not APSTUDIO_INVOKED</span>

15.3.2 从DDB到DIB

(1)GetDIBits函数——将DDB转成DIB(即从hBitmap中获得pInfo,pBits等信息)

参数

说明

hdc

设备环境句柄

hBitmap

要获取像素位的位图句柄

yScan

要转换的第一行扫描线

cyScans

扫描线的行数

pBits

将hBitmap的像素位读入该内存中。

pInfo

指向DIB信息头的指针

fClrUse

颜色使用标志

注意:

①这个函数并不是SetDIBits的简单逆运算而己。因为DIB转为设备相关的格式时,会有信息的丢失。

②实际上很少用到这个函数,因为如果有能拿hBitmap句柄,却没有位图数据信息的情况很少(如剪贴板),但剪贴板提供了自动转换为DIB的功能。

15.3.3 DIB 区块(DIB Section)

(1)DDB和DIB的区别

区别

DDB(Windows内部结构)

DIB(数据结构是己公布的)

颜色组织

必须是黑白或与实际输出设备一样的格式(不含颜色表,,像素值表示索引或黑白,因数据结构未公布,不能直接访问像素位)

采用几种颜色格式之一(可以有自己的颜色表,像素位可直接访问)

每行像素数

2的倍数

4的倍数

对象构成

一个GDI位图对象,要通过选入内存dc来更改像素位或绘图.用一个hBitmap位图句柄来表示。

使用方法:

//加载或创建DDB,而资源位图本身是DIB

hBitmap =LoadBitmap(…)

//创建兼容DC,因为是设备相关的。

hdcMem = CreateCompatibleDC(hdc);

//选入dc

SelectObject(hdc,hBitmap);

//画图,改变hBitmap像素位

Rectange(hdcMem…)

//显示到设备环境中

BitBlt(hdc,…,hdcMem…,SRCCOPY);

//删除等

DeleteDC(hdcMem);

 

是个文件或内存区域,内存结构与文件结构类似,可直接通过pBits更改像素位。

使用方法:

//读入位图文件

hFile = CreateFile(…);

//从文件中DIB位图读入整个或部分DIB的信息

//分配文件头内存,读入信息

pbmhf =malloc(…);//文件头

pbmi = malloc(…);//信息头

pBits = malloc(…); //像素位数据

//读入各部分的信息

ReadFile(hFile,&pbmhf,….)

//显示

SetDIBtoDevice(hdc,…);//输出,可以不需要内存兼容DC(因为设备无关)

存在形式

只能存在于内存中

可存在于内存或文件中

转换

可相互转换,但涉及设备无关的像素位与设备相关像素位的转换

 

(2)CreateDIBSection函数——返回的对象是个“杂种”:即是GDI位图对象(DDB),又更像DIB(有pBits和pInfo),意味着可以选入设备环境修改像素位,也可以直接修改像素位。

参数

说明

hdc

设备环境句柄,只有在fClrUse设为DIB_PAL_COLORS时才可以要设置hdc。当fClrUse设为DIB_RGB_COLORS时,hdc将被忽略。

pInfo

指向DIB信息的指针

fClrUse

颜色使用标志——DIB_RGB_COLORS或DIB_PAL_COLORS。

ppBits

指向像素位指针的指针。

1、该函数调用时,会把pBits设置成指向某个内存块的指针(该内存由系统管理,DeleteObject(hBitmap)时自动释放,调用函数时,实际上并未为该空间预留大小,只有在赋值时,才会占用空间,我们的程序也不需要自己为pBits分配空间),在调用该函数完后,程序可以从DIB文件中读入像素位到pBits指向的这块内存里。

2、可以将位图选入内存设备中,然后用GDI在上面绘图,其结果反映在由pBits指向的DIB像素位中,但因GDI采用批量处理,所以绘图结束后,要调用GDIFlush,以便真正的保存起来,也可以“手工”地访问像素位。

hSection

文件映射对象句柄

dwOffSet

像素位数据在上述对象中的偏移。MSDN指出,这个参数必须是4的倍数。

注意:创建出来的位图对象,是每行的字节数是4的倍数,也就是更像DIB。

 

(3)应用举例

 

  1. <span style="color: #008000;">   /*</span><span style="color: #008000;">创建384*256像素的DIB,每个像素为24位</span><span style="color: #008000;">*/</span><span style="color: #000000;">
  2. BITMAPINFOHEADER bmih;
  3. BYTE</span>*<span style="color: #000000;"> pBits;
  4. HBITMAP hBitmap;
  5. bmih.biSize </span>= <span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(BITMAPINFOHEADER);
  6. bmih.biWidth </span>= <span style="color: #800080;">384</span><span style="color: #000000;">;
  7. bmih.biHeight </span>= <span style="color: #800080;">256</span><span style="color: #000000;">;
  8. bmih.biPlanes </span>= <span style="color: #800080;">1</span><span style="color: #000000;">;
  9. bmih.biBitCount </span>= <span style="color: #800080;">24</span><span style="color: #000000;">;
  10. bmih.biCompression </span>=<span style="color: #000000;"> BI_RGB;
  11. bmih.biSizeImage </span>= <span style="color: #800080;">0</span><span style="color: #000000;">;
  12. bmih.biXPelsPerMeter </span>= <span style="color: #800080;">0</span><span style="color: #000000;">;
  13. bmih.biYPelsPerMeter </span>= <span style="color: #800080;">0</span><span style="color: #000000;">;
  14. bmih.biClrUsed </span>= <span style="color: #800080;">0</span><span style="color: #000000;">;
  15. bmih.biClrImportant </span>= <span style="color: #800080;">0</span><span style="color: #000000;">;<br>
  16. </span><span style="color: #008000;">/*</span><span style="color: #008000;">
  17. 1、因24位,没颜色表,所以可以直接将bmih指针转为BITMAPINFO指针。
  18. 2、初始时pBits等于NULL,该函数会把pBits指针掰过来指向由系统维护的某内存块,我们的程序不必为pBits分配空间大小,在赋值是操作系统会自行分配,删除位图对象后该空间也会自行释放,程序不必自己释放。
  19. </span><span style="color: #008000;">*/</span><span style="color: #000000;">
  20. hBitmap </span>= CreateDIBSection(NULL, (BITMAPINFO*)&bmih, <span style="color: #800080;">0</span>, &pBits, NULL, <span style="color: #800080;">0</span><span style="color: #000000;">);
  21. <br> </span><span style="color: #008000;">//</span><span style="color: #008000;">从DIB文件中读入像素位到pBits中。</span><span style="color: #000000;">
  22. ReadFile(hFile, </span>&pBits, ...);

(4)获取DIB区块信息——GetObject(hBitmap,sizeof(DIBSECTION),&dibsection);

DIBSECTION字段

含义

BITMAP dsBm

BITMAP结构

BITMAPINFOHEADER dsBmih

DIB信息头

DWORD    dsBitfields[3]

颜色遮罩

HANDLE   dshSection

文件映射对象句柄

DWORD    dsOffset

像素位数据的位移

注意:

1、该函数只能用在CreateDIBSection创建的位图对象,不能用在其他创建位图的函数返回的句柄上。

2、CreateDIBSection也可以通过GetObject(hBitmap,sizeof(BITMAP),&bm)返回位图信息。

3、该结构体不包括颜色表,如果用获得颜色表,可以将位图选入内存DC后,调用GetDIBColorTable来获得。

 

(5)DIB显示到屏幕——必须从设备无关的像素转换到设备相关的像素

函数

格式转换时机

SetDIBitsToDevice

StretchDIBits

发生在函数中

CreateDIBitmap

SetDIBits

1、未设置CBM_INIT时,发生在用 BitBlt或StretchBlt显示的时候或SetDIBits时

2、设置CBM_INIT时:发生在CreateDIBitmap函数中

CreateDIBSection创建区块

发生在用BitBlt或StretchBlt显示函数中。(注意:CreateDIBSection返回句柄实际上是DIB,但可以用BitBlt和StretchBlt函数显示),再次说明该返回值是个杂种,兼有DDB和DIB的特点。

(6)文件映射选项——CreateDIBSection的最后两个参数

①文件映射:把文件当作是己经存在于内存中,可以通过内存指针来访问,但并不需要把文件完全放到内存中。

②这项技术可减少内存需要。DIB像素位可保存在磁盘上,但却可以像内存一样的访问。但像素位必须保存在另外的文件中,不能是实际DIB文件的一部分。

  hFile = CreateFile(szFileName,…);

  …… //读入文件头(BITMAPFILEINFO)和信息头(BITMAPINFOHEADER)

  hFileMap = CreateFileMapping(hFile,NULL,PAGE_READWRITE,0,0,NULL);

  hBitmap = CreateDIBSection(NULL,pbmi,DIB_RGB_COLORS,&pBits,

  hFileMap,bmfh.bfOffBits);//bfOffBits永远不会是4的倍数!

                                         //与MSDN要求不符,该代码不能用。


【DIBSecion程序】
效果图

技术分享

  1. <span style="color: #008000;">/*</span><span style="color: #008000;">------------------------------------------------------------
  2. DIBSECTION.C --Displays a DIB Section in the Client area
  3. (c) Charles Petzold, 1998
  4. ------------------------------------------------------------</span><span style="color: #008000;">*/</span><span style="color: #000000;">
  5. #include </span><windows.h><span style="color: #000000;">
  6. #include </span><span style="color: #800000;">"</span><span style="color: #800000;">resource.h</span><span style="color: #800000;">"</span><span style="color: #000000;">
  7. LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
  8. </span><span style="color: #0000ff;">static</span> TCHAR szAppName[] = TEXT(<span style="color: #800000;">"</span><span style="color: #800000;">DibSection</span><span style="color: #800000;">"</span><span style="color: #000000;">);
  9. </span><span style="color: #0000ff;">int</span><span style="color: #000000;"> WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
  10. PSTR szCmdLine, </span><span style="color: #0000ff;">int</span><span style="color: #000000;"> iCmdShow)
  11. {
  12. HWND hwnd;
  13. MSG msg;
  14. WNDCLASSEX wndclass;
  15. HACCEL hAccel;
  16. wndclass.style </span>= CS_HREDRAW |<span style="color: #000000;"> CS_VREDRAW;
  17. wndclass.cbSize </span>= <span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(WNDCLASSEX);
  18. wndclass.lpfnWndProc </span>=<span style="color: #000000;"> WndProc;
  19. wndclass.cbClsExtra </span>= <span style="color: #800080;">0</span><span style="color: #000000;">;
  20. wndclass.cbWndExtra </span>= <span style="color: #800080;">0</span><span style="color: #000000;">;
  21. wndclass.hInstance </span>=<span style="color: #000000;"> hInstance;
  22. wndclass.hIcon </span>=<span style="color: #000000;"> LoadIcon(hInstance, szAppName);
  23. wndclass.hIconSm </span>=<span style="color: #000000;"> LoadIcon(hInstance, szAppName);
  24. wndclass.hCursor </span>=<span style="color: #000000;"> LoadCursor(NULL, IDC_ARROW);
  25. wndclass.hbrBackground </span>=<span style="color: #000000;"> (HBRUSH)GetStockObject(WHITE_BRUSH);
  26. wndclass.lpszMenuName </span>=<span style="color: #000000;"> szAppName;
  27. wndclass.lpszClassName </span>=<span style="color: #000000;"> szAppName;
  28. </span><span style="color: #0000ff;">if</span> (!RegisterClassEx(&<span style="color: #000000;">wndclass))
  29. {
  30. MessageBox(NULL, TEXT(</span><span style="color: #800000;">"</span><span style="color: #800000;">This program requires Windows NT!</span><span style="color: #800000;">"</span><span style="color: #000000;">),
  31. szAppName, MB_ICONERROR);
  32. </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">0</span><span style="color: #000000;">;
  33. }
  34. hwnd </span>= CreateWindow(szAppName, <span style="color: #008000;">//</span><span style="color: #008000;"> window class name</span>
  35. TEXT(<span style="color: #800000;">"</span><span style="color: #800000;">DIB Section Display</span><span style="color: #800000;">"</span>), <span style="color: #008000;">//</span><span style="color: #008000;"> window caption</span>
  36. WS_OVERLAPPEDWINDOW, <span style="color: #008000;">//</span><span style="color: #008000;"> window style</span>
  37. CW_USEDEFAULT, <span style="color: #008000;">//</span><span style="color: #008000;"> initial x position</span>
  38. CW_USEDEFAULT, <span style="color: #008000;">//</span><span style="color: #008000;"> initial y position</span>
  39. CW_USEDEFAULT, <span style="color: #008000;">//</span><span style="color: #008000;"> initial x size</span>
  40. CW_USEDEFAULT, <span style="color: #008000;">//</span><span style="color: #008000;"> initial y size</span>
  41. NULL, <span style="color: #008000;">//</span><span style="color: #008000;"> parent window handle</span>
  42. NULL, <span style="color: #008000;">//</span><span style="color: #008000;"> window menu handle</span>
  43. hInstance, <span style="color: #008000;">//</span><span style="color: #008000;"> program instance handle</span>
  44. NULL); <span style="color: #008000;">//</span><span style="color: #008000;"> creation parameters</span>
  45. <span style="color: #000000;">
  46. ShowWindow(hwnd, iCmdShow);
  47. UpdateWindow(hwnd);
  48. hAccel </span>=<span style="color: #000000;"> LoadAccelerators(hInstance, szAppName);
  49. </span><span style="color: #0000ff;">while</span> (GetMessage(&msg, NULL, <span style="color: #800080;">0</span>, <span style="color: #800080;">0</span><span style="color: #000000;">))
  50. {
  51. </span><span style="color: #0000ff;">if</span> (!TranslateAccelerator(hwnd, hAccel, &<span style="color: #000000;">msg))
  52. {
  53. TranslateMessage(</span>&<span style="color: #000000;">msg);
  54. DispatchMessage(</span>&<span style="color: #000000;">msg);
  55. }
  56. }
  57. </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> msg.wParam;
  58. }
  59. HBITMAP CreateDibSectionFromDibFile(PTSTR szFileName)
  60. {
  61. HBITMAP hBitmap;
  62. BITMAPFILEHEADER bmfh;
  63. BITMAPINFO</span>*<span style="color: #000000;"> pbmi;
  64. BYTE</span>*<span style="color: #000000;"> pBits;
  65. BOOL bSuccess;
  66. HANDLE hFile;
  67. DWORD dwInfoSize, dwBytesRead;
  68. </span><span style="color: #008000;">//</span><span style="color: #008000;">打开位图,可读可写</span>
  69. hFile =<span style="color: #000000;"> CreateFile(szFileName, GENERIC_READ, FILE_SHARE_READ, NULL,
  70. OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL);
  71. </span><span style="color: #0000ff;">if</span> (hFile ==<span style="color: #000000;"> INVALID_HANDLE_VALUE)
  72. </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> NULL;
  73. </span><span style="color: #008000;">//</span><span style="color: #008000;">与前一个程序(DIBConv)不同,这里不读入整个文件,而是只读取文件头</span>
  74. bSuccess = ReadFile(hFile, &bmfh, <span style="color: #0000ff;">sizeof</span>(BITMAPFILEHEADER), &<span style="color: #000000;">dwBytesRead, NULL);
  75. </span><span style="color: #0000ff;">if</span> (!bSuccess || (dwBytesRead != <span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(BITMAPFILEHEADER))
  76. </span>|| (bmfh.bfType != *(WORD*)<span style="color: #800000;">"</span><span style="color: #800000;">BM</span><span style="color: #800000;">"</span><span style="color: #000000;">))
  77. {
  78. CloseHandle(hFile);
  79. </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> NULL;
  80. }
  81. </span><span style="color: #008000;">//</span><span style="color: #008000;">为BITMAPINFO分配内存,并读入数据</span>
  82. dwInfoSize = bmfh.bfOffBits - <span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(BITMAPFILEHEADER);
  83. pbmi </span>= <span style="color: #0000ff;">malloc</span><span style="color: #000000;">(dwInfoSize);
  84. bSuccess </span>= ReadFile(hFile, pbmi, dwInfoSize, &<span style="color: #000000;">dwBytesRead, NULL);
  85. </span><span style="color: #008000;">//</span><span style="color: #008000;">创建DDB——函数调用后,pBits指针会被掰向,一个存放像素数的内存,该内存由系统维护。</span>
  86. hBitmap = CreateDIBSection(NULL, pbmi, DIB_RGB_COLORS, &pBits, NULL, <span style="color: #800080;">0</span><span style="color: #000000;">);
  87. </span><span style="color: #008000;">//</span><span style="color: #008000;">为像素位内存写入像素数据</span>
  88. ReadFile(hFile, pBits, bmfh.bfSize - bmfh.bfOffBits, &<span style="color: #000000;">dwBytesRead, NULL);
  89. </span><span style="color: #0000ff;">free</span><span style="color: #000000;">(pbmi);
  90. CloseHandle(hFile);
  91. </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> hBitmap;
  92. }
  93. LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  94. {
  95. </span><span style="color: #0000ff;">static</span> TCHAR szFilter[] = TEXT(<span style="color: #800000;">"</span><span style="color: #800000;">Bitmap File(*.bmp)\0*.bmp\0</span><span style="color: #800000;">"</span><span style="color: #000000;">)
  96. TEXT(</span><span style="color: #800000;">"</span><span style="color: #800000;">All Files(*.*)\0*.*\0\0</span><span style="color: #800000;">"</span><span style="color: #000000;">);
  97. </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> TCHAR szFileName[MAX_PATH], szTitleName[MAX_PATH];
  98. </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> cxClient, cyClient;
  99. </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> HBITMAP hBitmap;
  100. HDC hdc, hdcMem;
  101. PAINTSTRUCT ps;
  102. BITMAP bitmap;
  103. </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> OPENFILENAME ofn;
  104. </span><span style="color: #0000ff;">switch</span><span style="color: #000000;"> (message)
  105. {
  106. </span><span style="color: #0000ff;">case</span><span style="color: #000000;"> WM_CREATE:
  107. memset(</span>&ofn, <span style="color: #800080;">0</span>, <span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(OPENFILENAME));
  108. ofn.lStructSize </span>= <span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(OPENFILENAME);
  109. ofn.hwndOwner </span>=<span style="color: #000000;"> hwnd;
  110. ofn.lpstrFilter </span>=<span style="color: #000000;"> szFilter;
  111. ofn.lpstrFile </span>=<span style="color: #000000;"> szFileName;
  112. ofn.nMaxFile </span>=<span style="color: #000000;"> MAX_PATH;
  113. ofn.lpstrTitle </span>=<span style="color: #000000;"> szTitleName;
  114. ofn.nMaxFileTitle </span>=<span style="color: #000000;"> MAX_PATH;
  115. ofn.lpstrDefExt </span>= TEXT(<span style="color: #800000;">"</span><span style="color: #800000;">*.bmp</span><span style="color: #800000;">"</span><span style="color: #000000;">);
  116. </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">0</span><span style="color: #000000;">;
  117. </span><span style="color: #0000ff;">case</span><span style="color: #000000;"> WM_SIZE:
  118. cxClient </span>=<span style="color: #000000;"> LOWORD(lParam);
  119. cyClient </span>=<span style="color: #000000;"> HIWORD(lParam);
  120. </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">0</span><span style="color: #000000;">;
  121. </span><span style="color: #0000ff;">case</span><span style="color: #000000;"> WM_COMMAND:
  122. </span><span style="color: #0000ff;">switch</span><span style="color: #000000;"> (LOWORD(wParam))
  123. {
  124. </span><span style="color: #0000ff;">case</span><span style="color: #000000;"> IDM_FILE_OPEN:
  125. </span><span style="color: #008000;">//</span><span style="color: #008000;">显示打开对话框</span>
  126. <span style="color: #0000ff;">if</span> (!GetOpenFileName(&<span style="color: #000000;">ofn))
  127. </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">0</span><span style="color: #000000;">;
  128. </span><span style="color: #008000;">//</span><span style="color: #008000;">删除己经打开的位图</span>
  129. <span style="color: #0000ff;">if</span><span style="color: #000000;"> (hBitmap)
  130. {
  131. DeleteObject(hBitmap);
  132. hBitmap </span>=<span style="color: #000000;"> NULL;
  133. }
  134. SetCursor(LoadCursor(NULL, IDC_WAIT));
  135. ShowCursor(TRUE);
  136. </span><span style="color: #008000;">//</span><span style="color: #008000;">从DIB位图文件中创建DDB(或DIB区块)</span>
  137. hdc =<span style="color: #000000;"> GetDC(hwnd);
  138. hBitmap </span>=<span style="color: #000000;"> CreateDibSectionFromDibFile(szFileName);
  139. ReleaseDC(hwnd, hdc);
  140. ShowCursor(FALSE);
  141. SetCursor(LoadCursor(NULL, IDC_ARROW));
  142. </span><span style="color: #008000;">//</span><span style="color: #008000;">更新客户区内容</span>
  143. <span style="color: #000000;"> InvalidateRect(hwnd, NULL, TRUE);
  144. </span><span style="color: #008000;">//</span><span style="color: #008000;">错误提示</span>
  145. <span style="color: #0000ff;">if</span> (hBitmap ==<span style="color: #000000;"> NULL)
  146. {
  147. MessageBox(hwnd, TEXT(</span><span style="color: #800000;">"</span><span style="color: #800000;">Cannot load DIB file</span><span style="color: #800000;">"</span>), szAppName, MB_OK |<span style="color: #000000;"> MB_ICONEXCLAMATION);
  148. }
  149. </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">0</span><span style="color: #000000;">;
  150. }
  151. </span><span style="color: #0000ff;">break</span><span style="color: #000000;">;
  152. </span><span style="color: #0000ff;">case</span><span style="color: #000000;"> WM_PAINT:
  153. hdc </span>= BeginPaint(hwnd, &<span style="color: #000000;">ps);
  154. </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (hBitmap)
  155. {
  156. GetObject(hBitmap, </span><span style="color: #0000ff;">sizeof</span>(BITMAP), &<span style="color: #000000;">bitmap);
  157. hdcMem </span>=<span style="color: #000000;"> CreateCompatibleDC(hdc);
  158. SelectObject(hdcMem, hBitmap);
  159. BitBlt(hdc, </span><span style="color: #800080;">0</span>, <span style="color: #800080;">0</span>, bitmap.bmWidth, bitmap.bmHeight, hdcMem, <span style="color: #800080;">0</span>, <span style="color: #800080;">0</span><span style="color: #000000;">, SRCCOPY);
  160. DeleteDC(hdcMem);
  161. }
  162. EndPaint(hwnd, </span>&<span style="color: #000000;">ps);
  163. </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">0</span><span style="color: #000000;">;
  164. </span><span style="color: #0000ff;">case</span><span style="color: #000000;"> WM_DESTROY:
  165. </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (hBitmap)
  166. DeleteObject(hBitmap);
  167. PostQuitMessage(</span><span style="color: #800080;">0</span><span style="color: #000000;">);
  168. </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">0</span><span style="color: #000000;">;
  169. }
  170. </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> DefWindowProc(hwnd, message, wParam, lParam);
  171. }</span>

//resource.h

  1. <span style="color: #008000;">//</span><span style="color: #008000;">{{NO_DEPENDENCIES}}
  2. </span><span style="color: #008000;">//</span><span style="color: #008000;"> Microsoft Visual C++ 生成的包含文件。
  3. </span><span style="color: #008000;">//</span><span style="color: #008000;"> 供 DIBSection.rc 使用
  4. </span><span style="color: #008000;">//
  5. </span><span style="color: #0000ff;">#define</span> IDM_FILE_OPEN 40001
  6. <span style="color: #008000;">//</span><span style="color: #008000;"> Next default values for new objects
  7. </span><span style="color: #008000;">//</span>
  8. <span style="color: #000000;">#ifdef APSTUDIO_INVOKED
  9. #ifndef APSTUDIO_READONLY_SYMBOLS
  10. </span><span style="color: #0000ff;">#define</span> _APS_NEXT_RESOURCE_VALUE 103
  11. <span style="color: #0000ff;">#define</span> _APS_NEXT_COMMAND_VALUE 40004
  12. <span style="color: #0000ff;">#define</span> _APS_NEXT_CONTROL_VALUE 1001
  13. <span style="color: #0000ff;">#define</span> _APS_NEXT_SYMED_VALUE 101
  14. <span style="color: #0000ff;">#endif</span>
  15. <span style="color: #0000ff;">#endif</span>

//DibSection.rc

  1. <span style="color: #008000;">//</span><span style="color: #008000;"> Microsoft Visual C++ generated resource script.
  2. </span><span style="color: #008000;">//
  3. </span>#include <span style="color: #800000;">"</span><span style="color: #800000;">resource.h</span><span style="color: #800000;">"</span>
  4. <span style="color: #0000ff;">#define</span> APSTUDIO_READONLY_SYMBOLS
  5. <span style="color: #808080;">///////////////////////////////////////////////////////////////////////////</span><span style="color: #008000;">//</span>
  6. <span style="color: #008000;">//</span>
  7. <span style="color: #008000;">//</span><span style="color: #008000;"> Generated from the TEXTINCLUDE 2 resource.
  8. </span><span style="color: #008000;">//
  9. </span>#include <span style="color: #800000;">"</span><span style="color: #800000;">winres.h</span><span style="color: #800000;">"</span>
  10. <span style="color: #808080;">///////////////////////////////////////////////////////////////////////////</span><span style="color: #008000;">//</span>
  11. <span style="color: #0000ff;">#undef</span> APSTUDIO_READONLY_SYMBOLS
  12. <span style="color: #808080;">///////////////////////////////////////////////////////////////////////////</span><span style="color: #008000;">//</span>
  13. <span style="color: #008000;">//</span><span style="color: #008000;"> 中文(简体,中国) resources</span>
  14. <span style="color: #0000ff;">#if</span> !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)<span style="color: #000000;">
  15. LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
  16. #ifdef APSTUDIO_INVOKED
  17. </span><span style="color: #808080;">///////////////////////////////////////////////////////////////////////////</span><span style="color: #008000;">//</span>
  18. <span style="color: #008000;">//</span>
  19. <span style="color: #008000;">//</span><span style="color: #008000;"> TEXTINCLUDE
  20. </span><span style="color: #008000;">//
  21. </span><span style="color: #800080;">1</span><span style="color: #000000;"> TEXTINCLUDE
  22. BEGIN
  23. </span><span style="color: #800000;">"</span><span style="color: #800000;">resource.h\0</span><span style="color: #800000;">"</span><span style="color: #000000;">
  24. END
  25. </span><span style="color: #800080;">2</span><span style="color: #000000;"> TEXTINCLUDE
  26. BEGIN
  27. </span><span style="color: #800000;">"</span><span style="color: #800000;">#include </span><span style="color: #800000;">""</span><span style="color: #800000;">winres.h</span><span style="color: #800000;">""</span><span style="color: #800000;">\r\n</span><span style="color: #800000;">"</span>
  28. <span style="color: #800000;">"</span><span style="color: #800000;">\0</span><span style="color: #800000;">"</span><span style="color: #000000;">
  29. END
  30. </span><span style="color: #800080;">3</span><span style="color: #000000;"> TEXTINCLUDE
  31. BEGIN
  32. </span><span style="color: #800000;">"</span><span style="color: #800000;">\r\n</span><span style="color: #800000;">"</span>
  33. <span style="color: #800000;">"</span><span style="color: #800000;">\0</span><span style="color: #800000;">"</span><span style="color: #000000;">
  34. END
  35. </span><span style="color: #0000ff;">#endif</span> <span style="color: #008000;">//</span><span style="color: #008000;"> APSTUDIO_INVOKED</span>
  36. <span style="color: #808080;">///////////////////////////////////////////////////////////////////////////</span><span style="color: #008000;">//</span>
  37. <span style="color: #008000;">//</span>
  38. <span style="color: #008000;">//</span><span style="color: #008000;"> Menu
  39. </span><span style="color: #008000;">//
  40. </span><span style="color: #000000;">DIBSECTION MENU
  41. BEGIN
  42. POPUP </span><span style="color: #800000;">"</span><span style="color: #800000;">&File</span><span style="color: #800000;">"</span><span style="color: #000000;">
  43. BEGIN
  44. MENUITEM </span><span style="color: #800000;">"</span><span style="color: #800000;">&Open...\tCtrl+O</span><span style="color: #800000;">"</span><span style="color: #000000;">, IDM_FILE_OPEN
  45. END
  46. END
  47. </span><span style="color: #808080;">///////////////////////////////////////////////////////////////////////////</span><span style="color: #008000;">//</span>
  48. <span style="color: #008000;">//</span>
  49. <span style="color: #008000;">//</span><span style="color: #008000;"> Accelerator
  50. </span><span style="color: #008000;">//
  51. </span><span style="color: #000000;">DIBSECTION ACCELERATORS
  52. BEGIN
  53. </span><span style="color: #800000;">"</span><span style="color: #800000;">^O</span><span style="color: #800000;">"</span><span style="color: #000000;">, IDM_FILE_OPEN, ASCII, NOINVERT
  54. END
  55. </span><span style="color: #0000ff;">#endif</span> <span style="color: #008000;">//</span><span style="color: #008000;"> 中文(简体,中国) resources</span>
  56. <span style="color: #808080;">///////////////////////////////////////////////////////////////////////////</span><span style="color: #008000;">//</span>
  57. <span style="color: #000000;">#ifndef APSTUDIO_INVOKED
  58. </span><span style="color: #808080;">///////////////////////////////////////////////////////////////////////////</span><span style="color: #008000;">//</span>
  59. <span style="color: #008000;">//</span>
  60. <span style="color: #008000;">//</span><span style="color: #008000;"> Generated from the TEXTINCLUDE 3 resource.
  61. </span><span style="color: #008000;">//
  62. </span><span style="color: #808080;">///////////////////////////////////////////////////////////////////////////</span><span style="color: #008000;">//</span>
  63. <span style="color: #0000ff;">#endif</span> <span style="color: #008000;">//</span><span style="color: #008000;"> not APSTUDIO_INVOKED</span>

 

第15章 设备相关位图_15.3 DIB和DDB的结合

标签:

人气教程排行