windows程序设计学习笔记-设备相关位图

来源:互联网 发布:你是在做listing优化呢 编辑:程序博客网 时间:2024/05/16 00:49

位图和位块传输

1.保存方式
位图保存方式举例:
一个三行三列位图,行0-2,列0-2.
保存时:00-02 10-12 20-22.
按行保存,从上往下。每行从左往右。

2.API
2.1.
BOOL BitBlt(
In HDC hdcDest,
In int nXDest,
In int nYDest,
In int nWidth,
In int nHeight,
In HDC hdcSrc,
In int nXSrc,
In int nYSrc,
In DWORD dwRop
);
把一个显示区域从A拷贝到B。
要拷贝显示区域:nXSrc, nYSrc指定此区域在hdcSrc中左上角位置。 nWidth,nHeight指定要拷贝区域的宽,高。
采用的都是基于设备环境的逻辑单位。

把一块矩形区域从A拷贝到B。对区域内每一个像素点。
B对应位置像素点结合A对应位置像素点确定函数执行后B对应位置像素点。
确定方式由dwRop指定。
BLACKNESS:B对应位置用黑色
DSTINVERT:B对应位置采用与原始相反颜色
SRCCOPY:B对应位置采用A对应位置颜色
MERGECOPY:结合A对应位置颜色和B中画刷,与后得B对应位置颜色
还有其他很多,不一一列举。

返回值:
成功:非0.
失败:0
GetLastError用于获取失败信息

额外:BitBlt中两个设备环境得兼容。可以是同一个设备环境。

2.2.
BOOL StretchBlt(
In HDC hdcDest,
In int nXOriginDest,
In int nYOriginDest,
In int nWidthDest,
In int nHeightDest,
In HDC hdcSrc,
In int nXOriginSrc,
In int nYOriginSrc,
In int nWidthSrc,
In int nHeightSrc,
In DWORD dwRop
);

//用BitBlt获得同样大小矩形区域。用StretchBlt获得指定大小区域。 nXOriginDest,nYOriginDest,nWidthDest,nHeightDest,指定目标区域。
nXOriginSrc,nYOriginSrc,nWidthSrc,nHeightSrc,指定源区域。

dwRop见2.1.

可以利用对位图进行光栅操作来去除位图中某些需要去掉部分,如矩形位图只显示椭圆部分等等效果。

光栅操作确定 源:源位图先变成目标矩形大小。 目标,图案:目标设备当前画刷。三者结合方式。
图案设为P。源设为S。目标设为D。

1. 0  0x000042 BLACKNESS2. ~(S|D) 0x1100A6 NOTSRCERASE3. ~S 0x330008 NOTSRCCOPY4.S & ~D 0x440328 SRCERASE5.~D 0x550009 DSTINVERT6.P^D 0x5A0049 PATINVERT7.S^D 0x660046 SRCINVERT8.S&D 0x8800C6 SRCAND9.~S | D 0xBB0226 MERGEPAINT10.P&S 0xC000CA MERGECOPY11.S 0xCC0020 SRCCOPY12.S | D 0xEE0086 SRCPAINT13.P 0xF00021 PATCOPY14.P|~S|D 0xFB0A09 PATPAINT15.1 0xFF0062 WHITENESS

额外:
StretchBlt受到StretchBlt模式影响。
SetStretchBltMode(hdc, iMode)

COLORONCOLOR:简单去掉像素的行或列。
HALFTONE:平均色
BLACKONWHITE:
WHITEONBLACK:

BOOL PatBlt(
HDC hdc,
int x,
int y,
int nWidth, // 可正或负
int nHeight,// 可正或负
DWORD dwRop
);
x, y, nWidth,nHeight区域。采用逻辑单位。
dwRop确定目标和图案结合方式。
图案P,目标D
WHITENESS:1
BLACKNESS:0
PATCOPY:P
PATINVERT:P^D
DSTINVERT:~D
。。。
具体见520页。
(x, y) (x + nWidth, y + nHeight)确定了矩形两个端点

DDB:设备相关位图
HBITMAP hBitmap;

hBitmap = CreateBitmap(cx, cy, cPlanes, cBitsPixel, bits);

DeleteObject(hBitmap);

BOOL CreateBitmap(
int nWidth,
int nHeight,
UINT nPlanes,
UINT nBitcount,
const void* lpBits
);
nWidth位图宽
nHeight位图高。均以像素为单位。
nPlanes颜色平面数
nBitcount:每个显示像素的颜色位
lpBits可以用来初始化位图每个位

返回值:
成功,非0
失败,0

Windows给位图分配内存时,每行像素位有偶数个字节。

额外:一般调用CreateBitmap时,只能按两种方式设置参数:
1.nPlanes, nBitcount均为1
2.nPlanes, nBitcount和设备环境兼容(就是和设备环境中一样)
GetDeviceCaps中用PLANES,BITSPIXEL可得到。
此时直接用CreateCompatibleBitmap(hdc, cx, cy)就好。

创建位图还可用
CreateBitmapIndirect(&bitmap)

typedef struct tagBITMAP
{
int bmType; //0
int bmWidth; //宽
int bmHeight; // 高
int bmWidthBytes; // windows自动设置。存位图一行需字节数
BYTE bmPlanes; // 面数
BYTE bmBitsPixel; // 位数
LPVOID bmBits; // 初始化位图各位数组
} BITMAP;

GetObject(hBitmap, sizeof(BITMAP), &bitmap);//bmBits

DWORD SetBitmapBits(
HBITMAP hBitmap,
DWORD dwCount,
const void* lpBits
);

成功,lpBits中被采用字节数
失败,0

DWORD GetBitmapBits(
HBITMAP hBitmap,
DWORD dwCount,
const void* lpBits
);

成功,lpBits中接收字节数
失败,0

对彩色DDB,CreateBitmapIndirect,CreateBitmap,SetBitmapBits一般都不用。
一般对单色用。

内存设备环境
内存设备环境,只存在于内存,和特定的真实设备兼容。

HDC hdcMem;

hdcMem = CreateCompatibleDC(hdc);

SelectObject(hdcMem, hBitmap);
// 还可以向内存设备环境选入 画笔,画刷,字体,区域,调色板。选入位图只有内存设备环境可以
// 所选入位图,只有单色,或和内容设备环境兼容的真实设备兼容才可
// 选入后,此位图作为内存设备环境的显示表面。
// 一个位图只能同时选入一个内存设备环境
// 选入后位图作为设备环境显示表面,对设备环境执行GDI调用,造成的修改会同步修改到与其绑定的位图里面

DeleteDC(hdcMem);

HDC CreateCompatibleDC(
HDC* hDC
);

hDC为NULL时,内存设备环境和系统显示兼容。
返回值:
成功,非0
失败,0

hBitmap = LoadBitmap(hInstance, szBitmapName);
// hInstance为NULL,加载系统位图。
// 位图和名称关联用名称。和整数标识符关联用MAKEINTRESOURCE
// 选入位图,或为单色。非单色时,选入时windows为你转换为和视频显示的设备环境兼容的。

用完后,DeleteObject(hBitmap);

// 对简单的单色位图,可以采用直接创建的方式。

如果创建一个 宽3像素。高1行。3个像素均黑色。0表黑色。1表白色。
static BITMAP bitmap = {0,3,1,2,1,1};
static BYTE bits[] = { 0x00 0x00 };

GDI画刷是很小的位图,通常为8*8像素。
把位图变成画刷:
BOOL CreatePatternBrush(
CBitmap* pBitmap
);
返回值
成功:非0
失败:0

只取位图8*8尺寸信息。
若单色位图,0用当前文本色。1用当前背景色。

BOOL CreateBrushIndirect(
const LOGBRUSH* lpLogBrush
);

typedef struct tag LOGBRUSH { /* lb */
UINT lbStyle;
COLORREF lbColor;
LONG lbHatch;
} LOGBRUSH;

基于位图创建画刷时,Windows会复制一份位图信息。

BOOL GetTextExtentPoint32(
In HDC hdc,
In LPCTSTR lpString,
In int c,
Out LPSIZE lpSize
);

获取字符串前c个字符,尺寸。(尺寸用逻辑单位表示)
返回值:
成功,非0
失败,0

视频显示大小或颜色深度改变,程序收到WM_DISPLAYCHANGE消息。这种改变不会造成内存设备环境和视频设备环境的不兼容。(windows会调整内存设备环境让其兼容)

BOOL EnumDisplaySettings(
In LPCTSTR lpszDeviceName,
In DWORD iModeNum,
Out DEVMODE *lpDevMode
);

lpszDeviceName:字符串,指定要获取图形模式信息的显示设备
iModeNum:
ENUM_CURRENT_SETTINGS:取得显示设备当前设置的信息
ENUM_REGISTRY_SETTINGS:取得显示设备当前存在注册表里的信息。
0-?:分别对应显示设备的一种视频模式。

可以把iModeNum设为0,连续调用此函数。调用后+1,直到函数返回0.
这样可以枚举出设备环境所有图形模式的信息。
lpDevMode的下列值会被设置:
dmBitsPerPel
dmPelsWidth
dmPelsHeight
dmDisplayFlags
dmDisplayFrequency

BOOL WINAPI AppendMenu(
In HMENU hMenu,
In UINT uFlags,
In UINT_PTR uIDNewItem,
In_opt LPCTSTR lpNewItem
);

添加一个新条目到一个指定的 菜单条,下拉菜单,子菜单,快捷菜单 尾部。
可用此函数指定菜单条目的内容,外观,行为。

hMenu :指向 菜单条,下拉菜单,子菜单,快捷菜单 句柄
uFlags :控制 新菜单条目 外观和行为 的标志位。

MF_BITMAP :用位图做新菜单。lpNewItem此时为一位图句柄。
MF_CHECKED,MF_UNCHECKED
MF_DISABLED
MF_ENABLED
MF_GRAYED
MF_MENUBARBREAK
MF_MENUBREAK
MF_OWNERDRAW :菜单条目需要自绘。在菜单第一次被显示,菜单归属窗口收到WM_MEASUREITEM消息来接受菜单条目的宽和高。WM_DRAWITEM在菜单条目需要更新显示时会被发送给菜单归属窗口。
MF_POPUP :指定菜单条目 打开一个下拉菜单或子菜单。uIDNewItem此时为 对应下拉菜单或子菜单的句柄。 对菜单条,此标志用来为其添加一个菜单名。
MF_SEPARATOR :水平分隔线。仅在 下拉菜单,子菜单,快捷菜单中使用。lpNewItem and uIDNewItem 此时无意义。
MF_STRING :指明菜单条目是一文本字符串。lpNewItem参数是一指向字符串的指针。
uIDNewItem:
uFlags为MF_POPUP时, 是下拉菜单或子菜单句柄。
其他时候时,是菜单条目ID。
lpNewItem:
uFlags为MF_BITMAP 时,是位图句柄。
uFlags为MF_OWNERDRAW 时,包含一应用提供值。可以用来维持关联到菜单条目的额外数据。数据在发给菜单归属窗口的WM_MEASUREITME,WM_DRAWITEM消息的lParam参数指向结构的itemData里可得到。
uFlags为MF_STRING 时,包含一指向字符串的指针。

返回值:
成功,非0
失败,0

对文本菜单,Alt加文本中某个字符可选中菜单。
对位图菜单,按下Alt+字母键(字母键没被映射到某菜单项目)。windows给菜单归属窗口发WM_MENUCHAR,wParam按下键ASCII码。可以接受此消息。返回一个双字。高位字为2.低位字为菜单项索引。

hdc = CreateIC (TEXT (“DISPLAY”), NULL, NULL, NULL) ;
获取视频显示设备环境。

定时器结合位图及其操控函数可以实现简单动画。

BOOL LockWindowUpdate( HWND hwnd);
阻止其他程序更新窗口
HWND WINAPI GetDesktopWindow(void);
获取桌面窗口句柄

HDC* GetDCEx(
HWND hwnd,
CRgn* prgnClip,
DWORD flags
);
获取窗口的设备环境句柄
prgnClip:指定剪切区域
标志位:
DCX_CACHE
DCX_CLIPCHILDREN :排除窗口下所有子窗口的可见区域
DCX_CLIPSIBLINGS :排除窗口上所有兄弟窗口的可见区域
DCX_EXCLUDERGN :排除prgnClip中指定区域
DCX_INTERSECTRGN :可见区域+prgnClip
DCX_LOCKWINDOWUPDATE :及时对窗口进行了LockWindowUpdate,也允许对窗口绘制。
DCX_PARENTCLIP :使用父窗口可见区域和 忽略父窗口WS_CLIPCHILDREN and WS_PARENTDC 风格。

0 0
原创粉丝点击