第14章 位图和位块传输_14.4 GDI位图对象(1)
(1)创建 HBITMAP= CreateBitmap(cx,cy,cPlanes,cBitsPixel,lpBits);
参数 |
说明 |
cx,cy |
指定位图宽度和高度,单位为像素。 |
cPlanes |
颜色平面数目。标准的VGA显卡具有4个连续的颜色平面,每个平面取一个对应位,把它们组合起来就是一个像素。但这样被创建出来的位图被限制为标准的16位。 |
cxBits |
每个像素点颜色的位数 |
lpBits |
指向颜色数据数组指针。每行的字节数必须是偶数个字节(不足时以0填充)。如果该参数为NULL,将不对新生成的位图进行初始化。 |
注意:给DDB分配内存:
①每个像素行都必须分配偶数个字节(注意,不是位哦),即:
A、iWidthBytes=2*((cx*cBitsPixel+15)/16); 公式1
公式理解:cx*cBitsPixel为每行像素实际的总位数,(cx*cBitsPixel)/8表示该行像素实际需要的字节数。为了得到个偶
数,将分子分母都乘2,即2*((cx*cBitsPixel)/16),但因隐式转换问题,(cx*cBitsPixel)<16时,会直接去
除小数部分,所以2*((cx*cBitsPixel)/16)的结果为0,为了向上取整,在加个15。即得该公式。
B、与上式的等价公式iWidthBytes =((cx*cBitsPixel+15) & ~15)>>3; 公式2
公式理解:因逻辑运算中移位的特点,除以2相当于将被除数右移1位,除以16
相当于将被除数右移4位。15取反得1111 1111 1111 1111 1111 1111 1111 0000。公式1中(cx*cBitsPixel+15) /16,即相当于被除数右移4位。但因为最后是2*((cx*cBitsPixel+15)/16),所以实际上只需右移3位。我们只需保右移3位的结果仍是偶数即可。为了做到这点,取(cx*cBitsPixel+15)结果(共32 位,设从左向右分别是第32位到第1位)中的第32位到第4位,而右移出低位的3位,再将最后一位设为0,即能 保证为偶数。但这过程也可以先将(cx*cBitsPixel+15)的第1-4位设为0,再右移3位,即 (cx*cBitsPixel+15) & ~15,最后得公式2。
【图解公式】
C、从公式中可以看出,每行的字节数为0、2、4、6、8…等,即0、16位、32位、48位、64位等,也就是位数应为16的倍数!
②像素需要的总内存:iBitmapBytes = cy*cPlanes*iWidthBytes;
③CreateBitmap参数的设置:
A、cPlanes与cBitsPixel都等于1 →单色位图
B、cPlanes和cBitsPixel等于某个设备环境中的值,可以通过GetDeviceCaps得到。因为cPlanes和cBitPixel要从设备环境中得到,可以直接调用CreateCompatibleBitmap(hdc,cx,cy)从而省去调用GetDeviceCap函数。
(2)hBitmapCreateBitmapIndirect(&bitmap);
BITMAP结构体
字段 |
说明 |
bmType |
必须是0 |
bmWidth |
图像的宽度(以像素为单位) |
bmHeight |
图像的高度(以像素为单位) |
bmWidthBytes |
每行的像素的总字节数,必须是偶数个。 调用CreateBitmapIndirect时,不需要设置该字段,Windows会跟据bmWidth和bmBitsPixel值自动计算。 |
bmPlanes |
颜色平面数 |
bmBitsPixel |
每个像素的位数 |
bmBits |
指向存储像素的缓冲区,可以为NULL |
(3)获得BITMAP结构:GetObject(hBitmap,sizeof(BITMAP),&bitmap);
(4)删除位图:DeleteObject(hBitmap);
14.4.2 位图的位
(1)设置像素位:SetBitmapBits(hBitmap,cBytes,&bits); //注意每行为偶数个字节
(2)获取像素位:GetBitmapBits(hBitmap,cBytes,&bits);
(3)关于像素位的注意点:
①对于单色位图,每个像素就是1位,所以bmBits的每位就表示该像素的颜色。
②对于非单色位图,如每个像素对应8位(1字节,如0x37),但0x37不是具体的颜色,因为DDB没有颜色表,该值只是个索引,被显示时对应显卡颜色表索引为0x37的RGB颜色,这就是设备相关的意思!
③对于单位DDB,可以通过SetBitmapBits像素位。但对于彩色图,每个像素位表示的是个索引值,不应直接通过SetBitmapBits、CreateBitmap或CreateBitmapIndirect来也设置像素位。
14.4.3 内存设备环境
(1)创建内存设备环境 hdcMem = CreateCompatibleDC(hdc);
①只存在于内存,并不是一个真实的图形输出设备,与真实设备“兼容”
②hdcMem跟真实的设备环境一样,也有一个显示表面。但刚开始创建是单色且只有1*1像素大小(像素位只有1),为了能在该表面上绘图,可以通过将GDI对象选入hdcMem来增大显示表面(如SetlectObject(hdcMem,hBitmap)),即可完成hBitmap复制到内存hdcMem中,又将该位图作为内存设备环境的显示表面,可以在其上面通过GDI函数进行绘图,图像会画在位图上。
③在各类的设备环境,只有内存设备环境才能选入位图。
④只有单色位图或该位图和内存设备环境兼容的设备有同样的颜色组织的才能被选入内存设备环境。
14.4.4 加载位图资源
(1)加载:hBitmap= LoadBitmap(hInstance,szBitmapName);
①加载系统位图时,第1个参数为NULL,第2个参数的标识符以OBM开头
②若加载成功,则返回的GDI对象和程序正在其上运行的视频显示有相同的颜色组织。并且可以被选入与视频显示兼容的内存设备环境,也就是LoadBitmap会在背后进行颜色的转换,让其与视频显示兼容。
(2)删除位图资源:DeleteObject(hBitmap);
【Bricks1程序】
/*------------------------------------------------------------
BRICKS1.C -- LoadBitmap Demonstration
(c) Charles Petzold, 1998
------------------------------------------------------------*/
#include <windows.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT("Bricks1");
HWND hwnd;
MSG msg;
WNDCLASSEX wndclass;
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.cbSize = sizeof(WNDCLASSEX);
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = ;
wndclass.cbWndExtra = ;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(hInstance, szAppName);
wndclass.hIconSm = LoadIcon(hInstance, szAppName);
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szAppName;
if (!RegisterClassEx(&wndclass))
{
MessageBox(NULL, TEXT("This program requires Windows NT!"),
szAppName, MB_ICONERROR);
return ;
} hwnd = CreateWindow(szAppName, // window class name
TEXT("LoadBitmap Demo"), // window caption
WS_OVERLAPPEDWINDOW, // window style
CW_USEDEFAULT, // initial x position
CW_USEDEFAULT, // initial y position
CW_USEDEFAULT, // initial x size
CW_USEDEFAULT, // initial y size
NULL, // parent window handle
NULL, // window menu handle
hInstance, // program instance handle
NULL); // creation parameters ShowWindow(hwnd, iCmdShow);
UpdateWindow(hwnd); while (GetMessage(&msg, NULL, , ))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc, hdcMem;
PAINTSTRUCT ps;
HINSTANCE hInstance;
static HBITMAP hBitbmp;
BITMAP bitmap;
static int cxClient, cyClient, cxSource, cySource;
switch (message)
{
case WM_CREATE:
hInstance = ((LPCREATESTRUCT)lParam)->hInstance;
hBitbmp = LoadBitmap(hInstance, TEXT("Bricks"));
GetObject(hBitbmp, sizeof(BITMAP), &bitmap);
cxSource = bitmap.bmWidth;
cySource = bitmap.bmHeight;
return ;
case WM_SIZE:
cxClient = LOWORD(lParam);
cyClient = HIWORD(lParam);
return ;
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
hdcMem = CreateCompatibleDC(hdc);
SelectObject(hdcMem, hBitbmp);
for (int y = ; y < cyClient; y += cySource)
for (int x = ; x < cxClient; x += cxSource)
{
BitBlt(hdc, x, y, cxSource, cySource,
hdcMem, , , SRCCOPY);
}
DeleteDC(hdcMem);
EndPaint(hwnd, &ps);
return ; case WM_DESTROY:
DeleteObject(hBitbmp);
PostQuitMessage();
return ;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}
//resource.h
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ 生成的包含文件。
// 供 Bricks1.rc 使用
//
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 108
#define _APS_NEXT_COMMAND_VALUE 40001
#define _APS_NEXT_CONTROL_VALUE 1001
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif
//Bricks1.rc
// Microsoft Visual C++ generated resource script.
//
#include "resource.h"
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "winres.h"
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
// 中文(简体,中国) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//
TEXTINCLUDE
BEGIN
"resource.h\0"
END
TEXTINCLUDE
BEGIN
"#include ""winres.h""\r\n"
"\0"
END
TEXTINCLUDE
BEGIN
"\r\n"
"\0"
END
#endif // APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Bitmap
//
Bricks BITMAP "Bricks.bmp"
#endif // 中文(简体,中国) resources
/////////////////////////////////////////////////////////////////////////////
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED
14.4.5 单色位图
(1)BITMAP中的位图像素缓冲区设置原理,以Bricks程序和HelloDemo程序为例(0代表黑色,1代表白色)
(2)创建位图——以Hello程序为例
①创建BITMAP结构: static BITMAP bitmap={0,20,5,4,1,1};
②设置位图的像素数 static BYTE bits[]={0x51,0x77,0x10,0,
0x57,0x77,0x50,0,
0x13,0x77,0x50,0,
0x57,0x77,0x50,0,
0x51,0x11,0x10,0}
③创建位图:
bitmap.bmBits =(PSTR)bits;
hBitmap =CreateBitmapIndirect(&bitmap);
或 hBitmap = Create(20,5,1,1,bits);
SetBitmap(hBitmap,sizeof(bits),bits)
【Bricks2】
/*------------------------------------------------------------
BRICKS2.C -- Createbitmap Demonstration
(c) Charles Petzold, 1998
------------------------------------------------------------*/
#include <windows.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT("Bricks2");
HWND hwnd;
MSG msg;
WNDCLASSEX wndclass;
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.cbSize = sizeof(WNDCLASSEX);
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = ;
wndclass.cbWndExtra = ;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(hInstance, szAppName);
wndclass.hIconSm = LoadIcon(hInstance, szAppName);
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szAppName;
if (!RegisterClassEx(&wndclass))
{
MessageBox(NULL, TEXT("This program requires Windows NT!"),
szAppName, MB_ICONERROR);
return ;
} hwnd = CreateWindow(szAppName, // window class name
TEXT("CreateBitmap Demo"), // window caption
WS_OVERLAPPEDWINDOW, // window style
CW_USEDEFAULT, // initial x position
CW_USEDEFAULT, // initial y position
CW_USEDEFAULT, // initial x size
CW_USEDEFAULT, // initial y size
NULL, // parent window handle
NULL, // window menu handle
hInstance, // program instance handle
NULL); // creation parameters ShowWindow(hwnd, iCmdShow);
UpdateWindow(hwnd); while (GetMessage(&msg, NULL, , ))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc, hdcMem;
PAINTSTRUCT ps;
static HBITMAP hBitmap;
BITMAP bitmap = { , , , , , };
static int cxSource, cySource, cxClient, cyClient;
//每行2个字节,共8行
static BYTE bits[][] = { 0xFF, , 0x0C, , 0x0C, , 0x0C, ,
0xFF, , 0xC0, , 0xC0, , 0xC0,
};
switch (message)
{
case WM_CREATE:
bitmap.bmBits = bits;
hBitmap = CreateBitmapIndirect(&bitmap);
cxSource = bitmap.bmWidth;
cySource = bitmap.bmHeight;
return ;
case WM_SIZE:
cxClient = LOWORD(lParam);
cyClient = HIWORD(lParam);
return ;
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
hdcMem = CreateCompatibleDC(hdc);
SelectObject(hdcMem, hBitmap);
for (int y = ; y < cyClient; y += cySource)
for (int x = ; x < cxClient; x += cxSource)
{
BitBlt(hdc, x, y, cxSource, cySource,
hdcMem, , , SRCCOPY);
}
DeleteDC(hdcMem);
EndPaint(hwnd, &ps);
return ; case WM_DESTROY:
PostQuitMessage();
return ;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}
【HelloDemo】
/*------------------------------------------------------------
HELLODEMO.C -- CreateBitmap Demo(Hello Version)
(c) Charles Petzold, 1998
------------------------------------------------------------*/
#include <windows.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT("Hello");
HWND hwnd;
MSG msg;
WNDCLASSEX wndclass;
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.cbSize = sizeof(WNDCLASSEX);
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = ;
wndclass.cbWndExtra = ;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(hInstance, szAppName);
wndclass.hIconSm = LoadIcon(hInstance, szAppName);
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szAppName;
if (!RegisterClassEx(&wndclass))
{
MessageBox(NULL, TEXT("This program requires Windows NT!"),
szAppName, MB_ICONERROR);
return ;
} hwnd = CreateWindow(szAppName, // window class name
TEXT("CreateBitmap Demo(Hello Version)"), // window caption
WS_OVERLAPPEDWINDOW, // window style
CW_USEDEFAULT, // initial x position
CW_USEDEFAULT, // initial y position
CW_USEDEFAULT, // initial x size
CW_USEDEFAULT, // initial y size
NULL, // parent window handle
NULL, // window menu handle
hInstance, // program instance handle
NULL); // creation parameters ShowWindow(hwnd, iCmdShow);
UpdateWindow(hwnd); while (GetMessage(&msg, NULL, , ))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc, hdcMem;
PAINTSTRUCT ps;
static HBITMAP hBitmap;
BITMAP bitmap;
static BYTE bits[][] = { 0x51, 0x77, 0x10, ,
0x57, 0x77, 0x50, ,
0x13, 0x77, 0x50, ,
0x57, 0x77, 0x50, ,
0x51, 0x11, 0x10, };
static int cxSource, cySource, cxClient, cyClient;
POINT pt;
switch (message)
{
case WM_CREATE:
hBitmap = CreateBitmap(, , , , bits);
GetObject(hBitmap, sizeof(BITMAP), &bitmap);
cxSource = bitmap.bmWidth;
cySource = bitmap.bmHeight;
return ;
case WM_SIZE:
cxClient = LOWORD(lParam);
cyClient = HIWORD(lParam);
return ;
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
hdcMem = CreateCompatibleDC(hdc);
SelectObject(hdcMem, hBitmap); SaveDC(hdc);
//将20*5像素的位图放大显示,类似于StretchBit函数
SetMapMode(hdc, MM_ANISOTROPIC);
SetWindowExtEx(hdc, cxSource, cySource, NULL); //窗口的大小就是图像的大小
SetViewportExtEx(hdc, cxClient / , cyClient / , NULL);//视口大小为整个客户区 pt.x = cxClient / ;
pt.y = cyClient / ;
DPtoLP(hdc, &pt, );
SetWindowOrgEx(hdc, -pt.x, -pt.y, NULL);
//SetViewportOrgEx(hdc, cxClient / 4, cyClient / 4, NULL); //实现与SetWindowOrgEx一样的功能
BitBlt(hdc, , , cxSource, cySource, hdcMem, , , SRCCOPY);
RestoreDC(hdc, -);
DeleteDC(hdcMem);
EndPaint(hwnd, &ps);
return ; case WM_DESTROY:
PostQuitMessage();
return ;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}
14.4.6 位图画刷
(1)位图画刷至少8*8像素。
(2)调用CreatePatternBrush(hBitmap);
CreateBrushIndirect(LOGBRUSH *lplb);//结构体中的lbStyle设为BS_PATTERN
(3)删除画刷:DeleteObject(hBrush);
/*------------------------------------------------------------
BRICKS3.C -- CreatePatternBrush Demonstration
(c) Charles Petzold, 1998
------------------------------------------------------------*/
#include <windows.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT("Bricks3");
HWND hwnd;
MSG msg;
WNDCLASSEX wndclass;
HBITMAP hBitmap;
HBRUSH hBrush;
hBitmap = LoadBitmap(hInstance, TEXT("Bricks"));
hBrush = CreatePatternBrush(hBitmap); //创建位图画刷
DeleteObject(hBitmap);
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.cbSize = sizeof(WNDCLASSEX);
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = ;
wndclass.cbWndExtra = ;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(hInstance, szAppName);
wndclass.hIconSm = LoadIcon(hInstance, szAppName);
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground = hBrush;
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szAppName;
if (!RegisterClassEx(&wndclass))
{
MessageBox(NULL, TEXT("This program requires Windows NT!"),
szAppName, MB_ICONERROR);
return ;
} hwnd = CreateWindow(szAppName, // window class name
TEXT("CreatePatternBrush Demo"), // window caption
WS_OVERLAPPEDWINDOW, // window style
CW_USEDEFAULT, // initial x position
CW_USEDEFAULT, // initial y position
CW_USEDEFAULT, // initial x size
CW_USEDEFAULT, // initial y size
NULL, // parent window handle
NULL, // window menu handle
hInstance, // program instance handle
NULL); // creation parameters ShowWindow(hwnd, iCmdShow);
UpdateWindow(hwnd); while (GetMessage(&msg, NULL, , ))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
DeleteObject(hBrush);
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{ case WM_DESTROY:
PostQuitMessage();
return ;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}
//resource.h
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ 生成的包含文件。
// 供 Bricks3.rc 使用
// // Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 102
#define _APS_NEXT_COMMAND_VALUE 40001
#define _APS_NEXT_CONTROL_VALUE 1001
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif
//Bricks3.rc
// Microsoft Visual C++ generated resource script.
//
#include "resource.h" #define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "winres.h" /////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS /////////////////////////////////////////////////////////////////////////////
// 中文(简体,中国) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED #ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
// TEXTINCLUDE
BEGIN
"resource.h\0"
END TEXTINCLUDE
BEGIN
"#include ""winres.h""\r\n"
"\0"
END TEXTINCLUDE
BEGIN
"\r\n"
"\0"
END #endif // APSTUDIO_INVOKED /////////////////////////////////////////////////////////////////////////////
//
// Bitmap
// Bricks BITMAP "Bricks.bmp"
#endif // 中文(简体,中国) resources
///////////////////////////////////////////////////////////////////////////// #ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
// /////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED
第14章 位图和位块传输_14.4 GDI位图对象(1)的更多相关文章
- 第14章 位图和位块传输_14.4 GDI位图对象(3)
14.4.10 非矩形的位图图像 (1)“掩码”位图——单色位图,要显示的像素对应的掩码置1,不显示置0(2)光栅操作(点这里,见此文分析) (3)MaskBlt函数 ①MaskBlt(hdcDest ...
- 第14章 位图和位块传输_14.4 GDI位图对象(2)
14.4.7 在位图上绘图 (1)在内存设备环境中绘图(与真实DC不同的是,内存DC的显示表面是个位图) (2)GetTextExtentPoint32函数:用于确定文本字符串的像素大小.(此大小就是 ...
- ASM:《X86汇编语言-从实模式到保护模式》第14章:保护模式下的特权保护和任务概述
★PART1:32位保护模式下任务的隔离和特权级保护 这一章是全书的重点之一,这一张必须要理解特权级(包括CPL,RPL和DPL的含义)是什么,调用门的使用,还有LDT和TSS的工作原理(15章着重 ...
- 【STM32H7教程】第56章 STM32H7的DMA2D应用之刷色块,位图和Alpha混合
完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第56章 STM32H7的DMA2D应用之刷色块, ...
- Linux就这个范儿 第14章 身在江湖
Linux就这个范儿 第14章 身在江湖 “有人的地方就有江湖”,如今的计算机世界就像一个“江湖”.且不说冠希哥有多么无奈,把微博当QQ的局长有多么失败,就说如此平凡的你我什么时候就成了任人摆布的羔羊 ...
- 【RL-TCPnet网络教程】第14章 RL-TCPnet之TCP客户端
第14章 RL-TCPnet之TCP客户端 本章节为大家讲解RL-TCPnet的TCP客户端实现,学习本章节前,务必要优先学习第12章TCP传输控制协议基础知识.有了这些基础知识之后,再搞本 ...
- 【二代示波器教程】第14章 uCOS-III操作系统版本二代示波器实现
第14章 uCOS-III操作系统版本二代示波器实现 本章教程为大家讲解uCOS-III操作系统版本的二代示波器实现.主要讲解RTOS设计框架,即各个任务实现的功能,任务间的通信方案选择,任 ...
- Java核心技术卷一基础知识-第14章-多线程-读书笔记
第 14 章 多线程 本章内容: * 什么是线程 * 中断线程 * 线程状态 * 线程属性 * 同步 * 阻塞队列 * 线程安全的集合 * Collable与Future * 执行器 * 同步器 * ...
- MySQL性能调优与架构设计——第 14 章 可扩展性设计之数据切分
第 14 章 可扩展性设计之数据切分 前言 通过 MySQL Replication 功能所实现的扩展总是会受到数据库大小的限制,一旦数据库过于庞大,尤其是当写入过于频繁,很难由一台主机支撑的时候,我 ...
随机推荐
- 用SVG绕过浏览器XSS审计
[Translated From]:http://insert-script.blogspot.com/2014/02/svg-fun-time-firefox-svg-vector.html === ...
- Arcgis创建SDE_Geometry、SDO_Geometry的区别【转】
1. SDO_GEOMETRY Oracle Spatial在MDSYS模式下定义了一系列几何类型.函数来支持空间数据的存储和使用,最为人耳熟能详的就是SDO_GEOMETRY这种类型——当然,Arc ...
- JAVA下实现二叉树的先序、中序、后序、层序遍历(递归和循环)
import java.util.HashMap; import java.util.LinkedList; import java.util.Map; import java.util.Queue; ...
- 功能源代码(扇形进度)及Delegate运用在开放事件中、UINavigationController的封装
1:扇形进度视图及运用 首先先创建扇形的视图,传入进度值 #import <UIKit/UIKit.h> @interface LHProgressView : UIView @prope ...
- 【代码笔记】iOS-剧幕拉开形的首页
一,工程图. 二,代码. RootViewController.h #import <UIKit/UIKit.h> #import "UIImage+SplitImageInto ...
- 一组PHP可逆加密解密算法
对于大部分密码加密,我们可以采用md5.sha1等方法.可以有效防止数据泄露,但是这些方法仅适用于无需还原的数据加密. 对于需要还原的信息,则需要采用可逆的加密解密算法. 下面一组PHP函数是实现此加 ...
- 算法导论( FFT & 自动机 & 最优二叉搜索树 !!!)
原图链接:(!!!)
- Asp.net中实现同一用户名不能同时登录(单点登录)
Web 项目中经常遇到的问题就是同一用户名多次登录的问题,相应的解决办法也很多,总结起来不外乎这几种解决办法: 将登录后的用户名放到数据库表中: 登录后的用户名放到Session中: 登录后的用户名放 ...
- js技术发展
将.NET代码编译为JavaScript 你可以使用如下工具将C#.F#以及其他.NET代码编译为JavaScript代码. Apps in Motion:允许使用C#来构建可以运行在任何设备上的We ...
- CMPP错误码说明
与中国移动代码的对应关系. MI::zzzzSMSC返回状态报告的状态值为EXPIREDMJ:zzzzSMSC返回状态报告的状态值为DELETEDMK:zzzzSMSC返回状态报告的状态值为UNDEL ...