时间:2021-07-01 10:21:17 帮助过:1人阅读
(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函数内部大致的代码实现
- HBITMAP CreateDIBitmap(HDC hdc, CONST BITMAPINFOHEADER*<span style="color: #000000;"> pbmih,
- DWORD fInit, CONST VOID</span>* pBits,CONST BITMAPINFO*<span style="color: #000000;"> pbmi, UINT fUsage)
- {
- HBITMAP hBitmap;
- HDC hdc,hdcMem;
- </span><span style="color: #0000ff;">int</span><span style="color: #000000;"> cx, cy, iBitCount;
- </span><span style="color: #008000;">//</span><span style="color: #008000;">从第2个参数读取DIB信息头的信息</span>
- <span style="color: #0000ff;">if</span> (pbmih->biSize == <span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(BITMAPCOREHEADER))
- {
- cx </span>= ((PBITMAPCOREHEADER)pbmih)-><span style="color: #000000;">bcWidth;
- cy </span>= ((PBITMAPCOREHEADER)pbmih)-><span style="color: #000000;">bcHeight;
- iBitCount </span>= ((PBITMAPCOREHEADER)pbmih)-><span style="color: #000000;">bcBitCount;
- }
- </span><span style="color: #0000ff;">else</span><span style="color: #000000;">
- {
- cx </span>= pbmih-><span style="color: #000000;">biWidth;
- cy </span>= pbmih-><span style="color: #000000;">biHeight;
- iBitCount </span>= pbmih-><span style="color: #000000;">biBitCount;
- }
- </span><span style="color: #008000;">//</span><span style="color: #008000;">创建DDB</span>
- <span style="color: #0000ff;">if</span><span style="color: #000000;"> (hdc)
- hBitmap </span>=<span style="color: #000000;"> CreateCompatibleBitmap(hdc, cx, cy);
- </span><span style="color: #0000ff;">else</span><span style="color: #000000;">
- 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;">单色位图
- </span><span style="color: #008000;">//</span><span style="color: #008000;">后面4个参数是用来初始化DDB的</span>
- <span style="color: #0000ff;">if</span> (fInit ==<span style="color: #000000;"> CBM_INIT)
- {
- hdcMem </span>=<span style="color: #000000;"> CreateCompatibleDC(hdc);
- SelectObject(hdcMem, hBitmap);
- </span><span style="color: #008000;">//</span><span style="color: #008000;">在内存位图表面绘图,注意这里是DDB位图,己被选入内存DC</span><span style="color: #000000;">
- 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);
- DeleteDC(hdcMem);
- }
- </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> hBitmap;
- }</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程序】
- <span style="color: #008000;">/*</span><span style="color: #008000;">------------------------------------------------------------
- DIBCONV.C --Converts a DIB to a DDB
- (c) Charles Petzold, 1998
- ------------------------------------------------------------</span><span style="color: #008000;">*/</span><span style="color: #000000;">
- #include </span><windows.h><span style="color: #000000;">
- #include </span><span style="color: #800000;">"</span><span style="color: #800000;">resource.h</span><span style="color: #800000;">"</span><span style="color: #000000;">
- LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
- </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;">);
- </span><span style="color: #0000ff;">int</span><span style="color: #000000;"> WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
- PSTR szCmdLine, </span><span style="color: #0000ff;">int</span><span style="color: #000000;"> iCmdShow)
- {
- HWND hwnd;
- MSG msg;
- WNDCLASSEX wndclass;
- HACCEL hAccel;
- wndclass.style </span>= CS_HREDRAW |<span style="color: #000000;"> CS_VREDRAW;
- wndclass.cbSize </span>= <span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(WNDCLASSEX);
- wndclass.lpfnWndProc </span>=<span style="color: #000000;"> WndProc;
- wndclass.cbClsExtra </span>= <span style="color: #800080;">0</span><span style="color: #000000;">;
- wndclass.cbWndExtra </span>= <span style="color: #800080;">0</span><span style="color: #000000;">;
- wndclass.hInstance </span>=<span style="color: #000000;"> hInstance;
- wndclass.hIcon </span>=<span style="color: #000000;"> LoadIcon(hInstance, szAppName);
- wndclass.hIconSm </span>=<span style="color: #000000;"> LoadIcon(hInstance, szAppName);
- wndclass.hCursor </span>=<span style="color: #000000;"> LoadCursor(NULL, IDC_ARROW);
- wndclass.hbrBackground </span>=<span style="color: #000000;"> (HBRUSH)GetStockObject(WHITE_BRUSH);
- wndclass.lpszMenuName </span>=<span style="color: #000000;"> szAppName;
- wndclass.lpszClassName </span>=<span style="color: #000000;"> szAppName;
- </span><span style="color: #0000ff;">if</span> (!RegisterClassEx(&<span style="color: #000000;">wndclass))
- {
- 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;">),
- szAppName, MB_ICONERROR);
- </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">0</span><span style="color: #000000;">;
- }
- hwnd </span>= CreateWindow(szAppName, <span style="color: #008000;">//</span><span style="color: #008000;"> window class name</span>
- 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>
- WS_OVERLAPPEDWINDOW, <span style="color: #008000;">//</span><span style="color: #008000;"> window style</span>
- CW_USEDEFAULT, <span style="color: #008000;">//</span><span style="color: #008000;"> initial x position</span>
- CW_USEDEFAULT, <span style="color: #008000;">//</span><span style="color: #008000;"> initial y position</span>
- CW_USEDEFAULT, <span style="color: #008000;">//</span><span style="color: #008000;"> initial x size</span>
- CW_USEDEFAULT, <span style="color: #008000;">//</span><span style="color: #008000;"> initial y size</span>
- NULL, <span style="color: #008000;">//</span><span style="color: #008000;"> parent window handle</span>
- NULL, <span style="color: #008000;">//</span><span style="color: #008000;"> window menu handle</span>
- hInstance, <span style="color: #008000;">//</span><span style="color: #008000;"> program instance handle</span>
- NULL); <span style="color: #008000;">//</span><span style="color: #008000;"> creation parameters</span>
- <span style="color: #000000;">
- ShowWindow(hwnd, iCmdShow);
- UpdateWindow(hwnd);
- hAccel </span>=<span style="color: #000000;"> LoadAccelerators(hInstance, szAppName);
- </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;">))
- {
- </span><span style="color: #0000ff;">if</span> (!TranslateAccelerator(hwnd, hAccel, &<span style="color: #000000;">msg))
- {
- TranslateMessage(</span>&<span style="color: #000000;">msg);
- DispatchMessage(</span>&<span style="color: #000000;">msg);
- }
- }
- </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> msg.wParam;
- }
- HBITMAP CreateBitmapObjectFromDibFile(HDC hdc, PTSTR szFileName)
- {
- HBITMAP hBitmap;
- BITMAPFILEHEADER</span>*<span style="color: #000000;"> pbmfh;
- BOOL bSuccess;
- HANDLE hFile;
- DWORD dwFileSize, dwHighSize, dwBytesRead;
- </span><span style="color: #008000;">//</span><span style="color: #008000;">打开位图,可读可写</span>
- hFile =<span style="color: #000000;"> CreateFile(szFileName, GENERIC_READ, FILE_SHARE_READ, NULL,
- OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL);
- </span><span style="color: #0000ff;">if</span> (hFile ==<span style="color: #000000;"> INVALID_HANDLE_VALUE)
- </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> NULL;
- </span><span style="color: #008000;">//</span><span style="color: #008000;">读入整个文件</span>
- dwFileSize = GetFileSize(hFile, &<span style="color: #000000;">dwHighSize);
- </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (dwHighSize)
- {
- CloseHandle(hFile);
- </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> NULL;
- }
- pbmfh </span>= <span style="color: #0000ff;">malloc</span><span style="color: #000000;">(dwFileSize);
- </span><span style="color: #0000ff;">if</span> (!<span style="color: #000000;">pbmfh)
- {
- CloseHandle(hFile);
- </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> NULL;
- }
- bSuccess </span>= ReadFile(hFile, pbmfh, dwFileSize, &<span style="color: #000000;">dwBytesRead, NULL);
- CloseHandle(hFile);
- </span><span style="color: #008000;">//</span><span style="color: #008000;">检验是否是位图</span>
- <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;">))
- {
- </span><span style="color: #0000ff;">free</span><span style="color: #000000;">(pbmfh);
- </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> NULL;
- }
- </span><span style="color: #008000;">//</span><span style="color: #008000;">创建DDB——注意,这里读入整个文件,并从该DIB文件读入信息头、像素位等信息</span>
- hBitmap = CreateDIBitmap(hdc, (BITMAPINFOHEADER*)(pbmfh + <span style="color: #800080;">1</span><span style="color: #000000;">),
- CBM_INIT,
- (BYTE</span>*)pbmfh + pbmfh-><span style="color: #000000;">bfOffBits,
- (BITMAPINFO</span>*)(pbmfh + <span style="color: #800080;">1</span><span style="color: #000000;">),
- DIB_RGB_COLORS);
- </span><span style="color: #0000ff;">free</span><span style="color: #000000;">(pbmfh);
- </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> hBitmap;
- }
- LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
- {
- </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;">)
- 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;">);
- </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> TCHAR szFileName[MAX_PATH], szTitleName[MAX_PATH];
- </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> cxClient, cyClient;
- </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> HBITMAP hBitmap;
- HDC hdc, hdcMem;
- PAINTSTRUCT ps;
- BITMAP bitmap;
- </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> OPENFILENAME ofn;
- </span><span style="color: #0000ff;">switch</span><span style="color: #000000;"> (message)
- {
- </span><span style="color: #0000ff;">case</span><span style="color: #000000;"> WM_CREATE:
- memset(</span>&ofn, <span style="color: #800080;">0</span>, <span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(OPENFILENAME));
- ofn.lStructSize </span>= <span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(OPENFILENAME);
- ofn.hwndOwner </span>=<span style="color: #000000;"> hwnd;
- ofn.lpstrFilter </span>=<span style="color: #000000;"> szFilter;
- ofn.lpstrFile </span>=<span style="color: #000000;"> szFileName;
- ofn.nMaxFile </span>=<span style="color: #000000;"> MAX_PATH;
- ofn.lpstrTitle </span>=<span style="color: #000000;"> szTitleName;
- ofn.nMaxFileTitle </span>=<span style="color: #000000;"> MAX_PATH;
- ofn.lpstrDefExt </span>= TEXT(<span style="color: #800000;">"</span><span style="color: #800000;">*.bmp</span><span style="color: #800000;">"</span><span style="color: #000000;">);
- </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">0</span><span style="color: #000000;">;
- </span><span style="color: #0000ff;">case</span><span style="color: #000000;"> WM_SIZE:
- cxClient </span>=<span style="color: #000000;"> LOWORD(lParam);
- cyClient </span>=<span style="color: #000000;"> HIWORD(lParam);
- </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">0</span><span style="color: #000000;">;
- </span><span style="color: #0000ff;">case</span><span style="color: #000000;"> WM_COMMAND:
- </span><span style="color: #0000ff;">switch</span><span style="color: #000000;"> (LOWORD(wParam))
- {
- </span><span style="color: #0000ff;">case</span><span style="color: #000000;"> IDM_FILE_OPEN:
- </span><span style="color: #008000;">//</span><span style="color: #008000;">显示打开对话框</span>
- <span style="color: #0000ff;">if</span> (!GetOpenFileName(&<span style="color: #000000;">ofn))
- </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">0</span><span style="color: #000000;">;
- </span><span style="color: #008000;">//</span><span style="color: #008000;">删除己经打开的位图</span>
- <span style="color: #0000ff;">if</span><span style="color: #000000;"> (hBitmap)
- {
- DeleteObject(hBitmap);
- hBitmap </span>=<span style="color: #000000;"> NULL;
- }
- SetCursor(LoadCursor(NULL, IDC_WAIT));
- ShowCursor(TRUE);
- </span><span style="color: #008000;">//</span><span style="color: #008000;">从DIB位图文件中创建DDB</span>
- hdc =<span style="color: #000000;"> GetDC(hwnd);
- hBitmap </span>=<span style="color: #000000;"> CreateBitmapObjectFromDibFile(hdc, szFileName);
- ReleaseDC(hwnd, hdc);
- ShowCursor(FALSE);
- SetCursor(LoadCursor(NULL, IDC_ARROW));
- </span><span style="color: #008000;">//</span><span style="color: #008000;">更新客户区内容</span>
- <span style="color: #000000;"> InvalidateRect(hwnd, NULL, TRUE);
- </span><span style="color: #008000;">//</span><span style="color: #008000;">错误提示</span>
- <span style="color: #0000ff;">if</span> (hBitmap ==<span style="color: #000000;"> NULL)
- {
- 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);
- }
- </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">0</span><span style="color: #000000;">;
- }
- </span><span style="color: #0000ff;">break</span><span style="color: #000000;">;
- </span><span style="color: #0000ff;">case</span><span style="color: #000000;"> WM_PAINT:
- hdc </span>= BeginPaint(hwnd, &<span style="color: #000000;">ps);
- </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (hBitmap)
- {
- GetObject(hBitmap, </span><span style="color: #0000ff;">sizeof</span>(BITMAP), &<span style="color: #000000;">bitmap);
- hdcMem </span>=<span style="color: #000000;"> CreateCompatibleDC(hdc);
- SelectObject(hdcMem, hBitmap);
- 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);
- DeleteDC(hdcMem);
- }
- EndPaint(hwnd, </span>&<span style="color: #000000;">ps);
- </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">0</span><span style="color: #000000;">;
- </span><span style="color: #0000ff;">case</span><span style="color: #000000;"> WM_DESTROY:
- </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (hBitmap)
- DeleteObject(hBitmap);
- PostQuitMessage(</span><span style="color: #800080;">0</span><span style="color: #000000;">);
- </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">0</span><span style="color: #000000;">;
- }
- </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> DefWindowProc(hwnd, message, wParam, lParam);
- }</span>
//resource.h
- <span style="color: #008000;">//</span><span style="color: #008000;">{{NO_DEPENDENCIES}}
- </span><span style="color: #008000;">//</span><span style="color: #008000;"> Microsoft Visual C++ 生成的包含文件。
- </span><span style="color: #008000;">//</span><span style="color: #008000;"> 供 DIBConv.rc 使用
- </span><span style="color: #008000;">//
- </span><span style="color: #0000ff;">#define</span> IDM_FILE_OPEN 40001
- <span style="color: #008000;">//</span><span style="color: #008000;"> Next default values for new objects
- </span><span style="color: #008000;">//</span>
- <span style="color: #000000;">#ifdef APSTUDIO_INVOKED
- #ifndef APSTUDIO_READONLY_SYMBOLS
- </span><span style="color: #0000ff;">#define</span> _APS_NEXT_RESOURCE_VALUE 103
- <span style="color: #0000ff;">#define</span> _APS_NEXT_COMMAND_VALUE 40004
- <span style="color: #0000ff;">#define</span> _APS_NEXT_CONTROL_VALUE 1001
- <span style="color: #0000ff;">#define</span> _APS_NEXT_SYMED_VALUE 101
- <span style="color: #0000ff;">#endif</span>
- <span style="color: #0000ff;">#endif</span>
//DibConv.rc
- <span style="color: #008000;">//</span><span style="color: #008000;"> Microsoft Visual C++ generated resource script.
- </span><span style="color: #008000;">//
- </span>#include <span style="color: #800000;">"</span><span style="color: #800000;">resource.h</span><span style="color: #800000;">"</span>
- <span style="color: #0000ff;">#define</span> APSTUDIO_READONLY_SYMBOLS
- <span style="color: #808080;">///////////////////////////////////////////////////////////////////////////</span><span style="color: #008000;">//</span>
- <span style="color: #008000;">//</span>
- <span style="color: #008000;">//</span><span style="color: #008000;"> Generated from the TEXTINCLUDE 2 resource.
- </span><span style="color: #008000;">//
- </span>#include <span style="color: #800000;">"</span><span style="color: #800000;">winres.h</span><span style="color: #800000;">"</span>
- <span style="color: #808080;">///////////////////////////////////////////////////////////////////////////</span><span style="color: #008000;">//</span>
- <span style="color: #0000ff;">#undef</span> APSTUDIO_READONLY_SYMBOLS
- <span style="color: #808080;">///////////////////////////////////////////////////////////////////////////</span><span style="color: #008000;">//</span>
- <span style="color: #008000;">//</span><span style="color: #008000;"> 中文(简体,中国) resources</span>
- <span style="color: #0000ff;">#if</span> !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)<span style="color: #000000;">
- LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
- #ifdef APSTUDIO_INVOKED
- </span><span style="color: #808080;">///////////////////////////////////////////////////////////////////////////</span><span style="color: #008000;">//</span>
- <span style="color: #008000;">//</span>
- <span style="color: #008000;">//</span><span style="color: #008000;"> TEXTINCLUDE
- </span><span style="color: #008000;">//
- </span><span style="color: #800080;">1</span><span style="color: #000000;"> TEXTINCLUDE
- BEGIN
- </span><span style="color: #800000;">"</span><span style="color: #800000;">resource.h\0</span><span style="color: #800000;">"</span><span style="color: #000000;">
- END
- </span><span style="color: #800080;">2</span><span style="color: #000000;"> TEXTINCLUDE
- BEGIN
- </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>
- <span style="color: #800000;">"</span><span style="color: #800000;">\0</span><span style="color: #800000;">"</span><span style="color: #000000;">
- END
- </span><span style="color: #800080;">3</span><span style="color: #000000;"> TEXTINCLUDE
- BEGIN
- </span><span style="color: #800000;">"</span><span style="color: #800000;">\r\n</span><span style="color: #800000;">"</span>
- <span style="color: #800000;">"</span><span style="color: #800000;">\0</span><span style="color: #800000;">"</span><span style="color: #000000;">
- END
- </span><span style="color: #0000ff;">#endif</span> <span style="color: #008000;">//</span><span style="color: #008000;"> APSTUDIO_INVOKED</span>
- <span style="color: #808080;">///////////////////////////////////////////////////////////////////////////</span><span style="color: #008000;">//</span>
- <span style="color: #008000;">//</span>
- <span style="color: #008000;">//</span><span style="color: #008000;"> Menu
- </span><span style="color: #008000;">//
- </span><span style="color: #000000;">DIBCONV MENU
- BEGIN
- POPUP </span><span style="color: #800000;">"</span><span style="color: #800000;">&File</span><span style="color: #800000;">"</span><span style="color: #000000;">
- BEGIN
- 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
- END
- END
- </span><span style="color: #808080;">///////////////////////////////////////////////////////////////////////////</span><span style="color: #008000;">//</span>
- <span style="color: #008000;">//</span>
- <span style="color: #008000;">//</span><span style="color: #008000;"> Accelerator
- </span><span style="color: #008000;">//
- </span><span style="color: #000000;">DIBCONV ACCELERATORS
- BEGIN
- </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
- END
- </span><span style="color: #0000ff;">#endif</span> <span style="color: #008000;">//</span><span style="color: #008000;"> 中文(简体,中国) resources</span>
- <span style="color: #808080;">///////////////////////////////////////////////////////////////////////////</span><span style="color: #008000;">//</span>
- <span style="color: #000000;">#ifndef APSTUDIO_INVOKED
- </span><span style="color: #808080;">///////////////////////////////////////////////////////////////////////////</span><span style="color: #008000;">//</span>
- <span style="color: #008000;">//</span>
- <span style="color: #008000;">//</span><span style="color: #008000;"> Generated from the TEXTINCLUDE 3 resource.
- </span><span style="color: #008000;">//
- </span><span style="color: #808080;">///////////////////////////////////////////////////////////////////////////</span><span style="color: #008000;">//</span>
- <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)应用举例
- <span style="color: #008000;"> /*</span><span style="color: #008000;">创建384*256像素的DIB,每个像素为24位</span><span style="color: #008000;">*/</span><span style="color: #000000;">
- BITMAPINFOHEADER bmih;
- BYTE</span>*<span style="color: #000000;"> pBits;
- HBITMAP hBitmap;
- bmih.biSize </span>= <span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(BITMAPINFOHEADER);
- bmih.biWidth </span>= <span style="color: #800080;">384</span><span style="color: #000000;">;
- bmih.biHeight </span>= <span style="color: #800080;">256</span><span style="color: #000000;">;
- bmih.biPlanes </span>= <span style="color: #800080;">1</span><span style="color: #000000;">;
- bmih.biBitCount </span>= <span style="color: #800080;">24</span><span style="color: #000000;">;
- bmih.biCompression </span>=<span style="color: #000000;"> BI_RGB;
- bmih.biSizeImage </span>= <span style="color: #800080;">0</span><span style="color: #000000;">;
- bmih.biXPelsPerMeter </span>= <span style="color: #800080;">0</span><span style="color: #000000;">;
- bmih.biYPelsPerMeter </span>= <span style="color: #800080;">0</span><span style="color: #000000;">;
- bmih.biClrUsed </span>= <span style="color: #800080;">0</span><span style="color: #000000;">;
- bmih.biClrImportant </span>= <span style="color: #800080;">0</span><span style="color: #000000;">;<br>
- </span><span style="color: #008000;">/*</span><span style="color: #008000;">
- 1、因24位,没颜色表,所以可以直接将bmih指针转为BITMAPINFO指针。
- 2、初始时pBits等于NULL,该函数会把pBits指针掰过来指向由系统维护的某内存块,我们的程序不必为pBits分配空间大小,在赋值是操作系统会自行分配,删除位图对象后该空间也会自行释放,程序不必自己释放。
- </span><span style="color: #008000;">*/</span><span style="color: #000000;">
- hBitmap </span>= CreateDIBSection(NULL, (BITMAPINFO*)&bmih, <span style="color: #800080;">0</span>, &pBits, NULL, <span style="color: #800080;">0</span><span style="color: #000000;">);
- <br> </span><span style="color: #008000;">//</span><span style="color: #008000;">从DIB文件中读入像素位到pBits中。</span><span style="color: #000000;">
- 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程序】
效果图
- <span style="color: #008000;">/*</span><span style="color: #008000;">------------------------------------------------------------
- DIBSECTION.C --Displays a DIB Section in the Client area
- (c) Charles Petzold, 1998
- ------------------------------------------------------------</span><span style="color: #008000;">*/</span><span style="color: #000000;">
- #include </span><windows.h><span style="color: #000000;">
- #include </span><span style="color: #800000;">"</span><span style="color: #800000;">resource.h</span><span style="color: #800000;">"</span><span style="color: #000000;">
- LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
- </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;">);
- </span><span style="color: #0000ff;">int</span><span style="color: #000000;"> WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
- PSTR szCmdLine, </span><span style="color: #0000ff;">int</span><span style="color: #000000;"> iCmdShow)
- {
- HWND hwnd;
- MSG msg;
- WNDCLASSEX wndclass;
- HACCEL hAccel;
- wndclass.style </span>= CS_HREDRAW |<span style="color: #000000;"> CS_VREDRAW;
- wndclass.cbSize </span>= <span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(WNDCLASSEX);
- wndclass.lpfnWndProc </span>=<span style="color: #000000;"> WndProc;
- wndclass.cbClsExtra </span>= <span style="color: #800080;">0</span><span style="color: #000000;">;
- wndclass.cbWndExtra </span>= <span style="color: #800080;">0</span><span style="color: #000000;">;
- wndclass.hInstance </span>=<span style="color: #000000;"> hInstance;
- wndclass.hIcon </span>=<span style="color: #000000;"> LoadIcon(hInstance, szAppName);
- wndclass.hIconSm </span>=<span style="color: #000000;"> LoadIcon(hInstance, szAppName);
- wndclass.hCursor </span>=<span style="color: #000000;"> LoadCursor(NULL, IDC_ARROW);
- wndclass.hbrBackground </span>=<span style="color: #000000;"> (HBRUSH)GetStockObject(WHITE_BRUSH);
- wndclass.lpszMenuName </span>=<span style="color: #000000;"> szAppName;
- wndclass.lpszClassName </span>=<span style="color: #000000;"> szAppName;
- </span><span style="color: #0000ff;">if</span> (!RegisterClassEx(&<span style="color: #000000;">wndclass))
- {
- 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;">),
- szAppName, MB_ICONERROR);
- </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">0</span><span style="color: #000000;">;
- }
- hwnd </span>= CreateWindow(szAppName, <span style="color: #008000;">//</span><span style="color: #008000;"> window class name</span>
- 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>
- WS_OVERLAPPEDWINDOW, <span style="color: #008000;">//</span><span style="color: #008000;"> window style</span>
- CW_USEDEFAULT, <span style="color: #008000;">//</span><span style="color: #008000;"> initial x position</span>
- CW_USEDEFAULT, <span style="color: #008000;">//</span><span style="color: #008000;"> initial y position</span>
- CW_USEDEFAULT, <span style="color: #008000;">//</span><span style="color: #008000;"> initial x size</span>
- CW_USEDEFAULT, <span style="color: #008000;">//</span><span style="color: #008000;"> initial y size</span>
- NULL, <span style="color: #008000;">//</span><span style="color: #008000;"> parent window handle</span>
- NULL, <span style="color: #008000;">//</span><span style="color: #008000;"> window menu handle</span>
- hInstance, <span style="color: #008000;">//</span><span style="color: #008000;"> program instance handle</span>
- NULL); <span style="color: #008000;">//</span><span style="color: #008000;"> creation parameters</span>
- <span style="color: #000000;">
- ShowWindow(hwnd, iCmdShow);
- UpdateWindow(hwnd);
- hAccel </span>=<span style="color: #000000;"> LoadAccelerators(hInstance, szAppName);
- </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;">))
- {
- </span><span style="color: #0000ff;">if</span> (!TranslateAccelerator(hwnd, hAccel, &<span style="color: #000000;">msg))
- {
- TranslateMessage(</span>&<span style="color: #000000;">msg);
- DispatchMessage(</span>&<span style="color: #000000;">msg);
- }
- }
- </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> msg.wParam;
- }
- HBITMAP CreateDibSectionFromDibFile(PTSTR szFileName)
- {
- HBITMAP hBitmap;
- BITMAPFILEHEADER bmfh;
- BITMAPINFO</span>*<span style="color: #000000;"> pbmi;
- BYTE</span>*<span style="color: #000000;"> pBits;
- BOOL bSuccess;
- HANDLE hFile;
- DWORD dwInfoSize, dwBytesRead;
- </span><span style="color: #008000;">//</span><span style="color: #008000;">打开位图,可读可写</span>
- hFile =<span style="color: #000000;"> CreateFile(szFileName, GENERIC_READ, FILE_SHARE_READ, NULL,
- OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL);
- </span><span style="color: #0000ff;">if</span> (hFile ==<span style="color: #000000;"> INVALID_HANDLE_VALUE)
- </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> NULL;
- </span><span style="color: #008000;">//</span><span style="color: #008000;">与前一个程序(DIBConv)不同,这里不读入整个文件,而是只读取文件头</span>
- bSuccess = ReadFile(hFile, &bmfh, <span style="color: #0000ff;">sizeof</span>(BITMAPFILEHEADER), &<span style="color: #000000;">dwBytesRead, NULL);
- </span><span style="color: #0000ff;">if</span> (!bSuccess || (dwBytesRead != <span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(BITMAPFILEHEADER))
- </span>|| (bmfh.bfType != *(WORD*)<span style="color: #800000;">"</span><span style="color: #800000;">BM</span><span style="color: #800000;">"</span><span style="color: #000000;">))
- {
- CloseHandle(hFile);
- </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> NULL;
- }
- </span><span style="color: #008000;">//</span><span style="color: #008000;">为BITMAPINFO分配内存,并读入数据</span>
- dwInfoSize = bmfh.bfOffBits - <span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(BITMAPFILEHEADER);
- pbmi </span>= <span style="color: #0000ff;">malloc</span><span style="color: #000000;">(dwInfoSize);
- bSuccess </span>= ReadFile(hFile, pbmi, dwInfoSize, &<span style="color: #000000;">dwBytesRead, NULL);
- </span><span style="color: #008000;">//</span><span style="color: #008000;">创建DDB——函数调用后,pBits指针会被掰向,一个存放像素数的内存,该内存由系统维护。</span>
- hBitmap = CreateDIBSection(NULL, pbmi, DIB_RGB_COLORS, &pBits, NULL, <span style="color: #800080;">0</span><span style="color: #000000;">);
- </span><span style="color: #008000;">//</span><span style="color: #008000;">为像素位内存写入像素数据</span>
- ReadFile(hFile, pBits, bmfh.bfSize - bmfh.bfOffBits, &<span style="color: #000000;">dwBytesRead, NULL);
- </span><span style="color: #0000ff;">free</span><span style="color: #000000;">(pbmi);
- CloseHandle(hFile);
- </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> hBitmap;
- }
- LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
- {
- </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;">)
- 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;">);
- </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> TCHAR szFileName[MAX_PATH], szTitleName[MAX_PATH];
- </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> cxClient, cyClient;
- </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> HBITMAP hBitmap;
- HDC hdc, hdcMem;
- PAINTSTRUCT ps;
- BITMAP bitmap;
- </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> OPENFILENAME ofn;
- </span><span style="color: #0000ff;">switch</span><span style="color: #000000;"> (message)
- {
- </span><span style="color: #0000ff;">case</span><span style="color: #000000;"> WM_CREATE:
- memset(</span>&ofn, <span style="color: #800080;">0</span>, <span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(OPENFILENAME));
- ofn.lStructSize </span>= <span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(OPENFILENAME);
- ofn.hwndOwner </span>=<span style="color: #000000;"> hwnd;
- ofn.lpstrFilter </span>=<span style="color: #000000;"> szFilter;
- ofn.lpstrFile </span>=<span style="color: #000000;"> szFileName;
- ofn.nMaxFile </span>=<span style="color: #000000;"> MAX_PATH;
- ofn.lpstrTitle </span>=<span style="color: #000000;"> szTitleName;
- ofn.nMaxFileTitle </span>=<span style="color: #000000;"> MAX_PATH;
- ofn.lpstrDefExt </span>= TEXT(<span style="color: #800000;">"</span><span style="color: #800000;">*.bmp</span><span style="color: #800000;">"</span><span style="color: #000000;">);
- </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">0</span><span style="color: #000000;">;
- </span><span style="color: #0000ff;">case</span><span style="color: #000000;"> WM_SIZE:
- cxClient </span>=<span style="color: #000000;"> LOWORD(lParam);
- cyClient </span>=<span style="color: #000000;"> HIWORD(lParam);
- </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">0</span><span style="color: #000000;">;
- </span><span style="color: #0000ff;">case</span><span style="color: #000000;"> WM_COMMAND:
- </span><span style="color: #0000ff;">switch</span><span style="color: #000000;"> (LOWORD(wParam))
- {
- </span><span style="color: #0000ff;">case</span><span style="color: #000000;"> IDM_FILE_OPEN:
- </span><span style="color: #008000;">//</span><span style="color: #008000;">显示打开对话框</span>
- <span style="color: #0000ff;">if</span> (!GetOpenFileName(&<span style="color: #000000;">ofn))
- </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">0</span><span style="color: #000000;">;
- </span><span style="color: #008000;">//</span><span style="color: #008000;">删除己经打开的位图</span>
- <span style="color: #0000ff;">if</span><span style="color: #000000;"> (hBitmap)
- {
- DeleteObject(hBitmap);
- hBitmap </span>=<span style="color: #000000;"> NULL;
- }
- SetCursor(LoadCursor(NULL, IDC_WAIT));
- ShowCursor(TRUE);
- </span><span style="color: #008000;">//</span><span style="color: #008000;">从DIB位图文件中创建DDB(或DIB区块)</span>
- hdc =<span style="color: #000000;"> GetDC(hwnd);
- hBitmap </span>=<span style="color: #000000;"> CreateDibSectionFromDibFile(szFileName);
- ReleaseDC(hwnd, hdc);
- ShowCursor(FALSE);
- SetCursor(LoadCursor(NULL, IDC_ARROW));
- </span><span style="color: #008000;">//</span><span style="color: #008000;">更新客户区内容</span>
- <span style="color: #000000;"> InvalidateRect(hwnd, NULL, TRUE);
- </span><span style="color: #008000;">//</span><span style="color: #008000;">错误提示</span>
- <span style="color: #0000ff;">if</span> (hBitmap ==<span style="color: #000000;"> NULL)
- {
- 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);
- }
- </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">0</span><span style="color: #000000;">;
- }
- </span><span style="color: #0000ff;">break</span><span style="color: #000000;">;
- </span><span style="color: #0000ff;">case</span><span style="color: #000000;"> WM_PAINT:
- hdc </span>= BeginPaint(hwnd, &<span style="color: #000000;">ps);
- </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (hBitmap)
- {
- GetObject(hBitmap, </span><span style="color: #0000ff;">sizeof</span>(BITMAP), &<span style="color: #000000;">bitmap);
- hdcMem </span>=<span style="color: #000000;"> CreateCompatibleDC(hdc);
- SelectObject(hdcMem, hBitmap);
- 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);
- DeleteDC(hdcMem);
- }
- EndPaint(hwnd, </span>&<span style="color: #000000;">ps);
- </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">0</span><span style="color: #000000;">;
- </span><span style="color: #0000ff;">case</span><span style="color: #000000;"> WM_DESTROY:
- </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (hBitmap)
- DeleteObject(hBitmap);
- PostQuitMessage(</span><span style="color: #800080;">0</span><span style="color: #000000;">);
- </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">0</span><span style="color: #000000;">;
- }
- </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> DefWindowProc(hwnd, message, wParam, lParam);
- }</span>
//resource.h
- <span style="color: #008000;">//</span><span style="color: #008000;">{{NO_DEPENDENCIES}}
- </span><span style="color: #008000;">//</span><span style="color: #008000;"> Microsoft Visual C++ 生成的包含文件。
- </span><span style="color: #008000;">//</span><span style="color: #008000;"> 供 DIBSection.rc 使用
- </span><span style="color: #008000;">//
- </span><span style="color: #0000ff;">#define</span> IDM_FILE_OPEN 40001
- <span style="color: #008000;">//</span><span style="color: #008000;"> Next default values for new objects
- </span><span style="color: #008000;">//</span>
- <span style="color: #000000;">#ifdef APSTUDIO_INVOKED
- #ifndef APSTUDIO_READONLY_SYMBOLS
- </span><span style="color: #0000ff;">#define</span> _APS_NEXT_RESOURCE_VALUE 103
- <span style="color: #0000ff;">#define</span> _APS_NEXT_COMMAND_VALUE 40004
- <span style="color: #0000ff;">#define</span> _APS_NEXT_CONTROL_VALUE 1001
- <span style="color: #0000ff;">#define</span> _APS_NEXT_SYMED_VALUE 101
- <span style="color: #0000ff;">#endif</span>
- <span style="color: #0000ff;">#endif</span>
//DibSection.rc
- <span style="color: #008000;">//</span><span style="color: #008000;"> Microsoft Visual C++ generated resource script.
- </span><span style="color: #008000;">//
- </span>#include <span style="color: #800000;">"</span><span style="color: #800000;">resource.h</span><span style="color: #800000;">"</span>
- <span style="color: #0000ff;">#define</span> APSTUDIO_READONLY_SYMBOLS
- <span style="color: #808080;">///////////////////////////////////////////////////////////////////////////</span><span style="color: #008000;">//</span>
- <span style="color: #008000;">//</span>
- <span style="color: #008000;">//</span><span style="color: #008000;"> Generated from the TEXTINCLUDE 2 resource.
- </span><span style="color: #008000;">//
- </span>#include <span style="color: #800000;">"</span><span style="color: #800000;">winres.h</span><span style="color: #800000;">"</span>
- <span style="color: #808080;">///////////////////////////////////////////////////////////////////////////</span><span style="color: #008000;">//</span>
- <span style="color: #0000ff;">#undef</span> APSTUDIO_READONLY_SYMBOLS
- <span style="color: #808080;">///////////////////////////////////////////////////////////////////////////</span><span style="color: #008000;">//</span>
- <span style="color: #008000;">//</span><span style="color: #008000;"> 中文(简体,中国) resources</span>
- <span style="color: #0000ff;">#if</span> !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)<span style="color: #000000;">
- LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
- #ifdef APSTUDIO_INVOKED
- </span><span style="color: #808080;">///////////////////////////////////////////////////////////////////////////</span><span style="color: #008000;">//</span>
- <span style="color: #008000;">//</span>
- <span style="color: #008000;">//</span><span style="color: #008000;"> TEXTINCLUDE
- </span><span style="color: #008000;">//
- </span><span style="color: #800080;">1</span><span style="color: #000000;"> TEXTINCLUDE
- BEGIN
- </span><span style="color: #800000;">"</span><span style="color: #800000;">resource.h\0</span><span style="color: #800000;">"</span><span style="color: #000000;">
- END
- </span><span style="color: #800080;">2</span><span style="color: #000000;"> TEXTINCLUDE
- BEGIN
- </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>
- <span style="color: #800000;">"</span><span style="color: #800000;">\0</span><span style="color: #800000;">"</span><span style="color: #000000;">
- END
- </span><span style="color: #800080;">3</span><span style="color: #000000;"> TEXTINCLUDE
- BEGIN
- </span><span style="color: #800000;">"</span><span style="color: #800000;">\r\n</span><span style="color: #800000;">"</span>
- <span style="color: #800000;">"</span><span style="color: #800000;">\0</span><span style="color: #800000;">"</span><span style="color: #000000;">
- END
- </span><span style="color: #0000ff;">#endif</span> <span style="color: #008000;">//</span><span style="color: #008000;"> APSTUDIO_INVOKED</span>
- <span style="color: #808080;">///////////////////////////////////////////////////////////////////////////</span><span style="color: #008000;">//</span>
- <span style="color: #008000;">//</span>
- <span style="color: #008000;">//</span><span style="color: #008000;"> Menu
- </span><span style="color: #008000;">//
- </span><span style="color: #000000;">DIBSECTION MENU
- BEGIN
- POPUP </span><span style="color: #800000;">"</span><span style="color: #800000;">&File</span><span style="color: #800000;">"</span><span style="color: #000000;">
- BEGIN
- 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
- END
- END
- </span><span style="color: #808080;">///////////////////////////////////////////////////////////////////////////</span><span style="color: #008000;">//</span>
- <span style="color: #008000;">//</span>
- <span style="color: #008000;">//</span><span style="color: #008000;"> Accelerator
- </span><span style="color: #008000;">//
- </span><span style="color: #000000;">DIBSECTION ACCELERATORS
- BEGIN
- </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
- END
- </span><span style="color: #0000ff;">#endif</span> <span style="color: #008000;">//</span><span style="color: #008000;"> 中文(简体,中国) resources</span>
- <span style="color: #808080;">///////////////////////////////////////////////////////////////////////////</span><span style="color: #008000;">//</span>
- <span style="color: #000000;">#ifndef APSTUDIO_INVOKED
- </span><span style="color: #808080;">///////////////////////////////////////////////////////////////////////////</span><span style="color: #008000;">//</span>
- <span style="color: #008000;">//</span>
- <span style="color: #008000;">//</span><span style="color: #008000;"> Generated from the TEXTINCLUDE 3 resource.
- </span><span style="color: #008000;">//
- </span><span style="color: #808080;">///////////////////////////////////////////////////////////////////////////</span><span style="color: #008000;">//</span>
- <span style="color: #0000ff;">#endif</span> <span style="color: #008000;">//</span><span style="color: #008000;"> not APSTUDIO_INVOKED</span>
第15章 设备相关位图_15.3 DIB和DDB的结合
标签: