MFC Windows程序设计--位图,区域
来源:互联网 发布:网络作家白天的新文 编辑:程序博客网 时间:2024/06/05 07:09
DDB
DIB
DIB扩展
DDB和CBitmap类
CBitmap bitmap;bitmap.CreateCompatibleBitmap(&dc, nWidth, nHeight);CBitmap::CreateBitmapCBitmap::CreateBitmapIndirect// 用于创建单色位图// 内存设备描述表,可选入位图作为其显示表面。进内存设备描述表可以。CClientDC dcScreen(this);CBitmap bitmap;bitmap.CreateCompatibleBitmap(&dcScreen, 100, 100);CDC dcMem;dcMem.CreateCompatibleDC(&dcScreen);CBrush brush(RGB(0, 0, 255));CBitmap *pOldBitmap = dcMem.SelectObject(&bitmap);dcMem.FillRect(CRect(0, 0, 100, 100), &brush);dcMem.SelectObject(pOldBitmap);
按位将位图传送到屏幕和其它设备
CDC::BitBltCDC::StretchBlt// 两个函数中出现的数字的单位都是相应设备描述表下的逻辑单位dcScreen.BitBlt(0, 0, 100, 100, &dcMem, 0, 0, SRCCOPY);dcScreen.StretchBlt(0, 0, 50, 200, &dcMem, 0, 0, 100, 100, SRCCOPY);CDC::SetStretchBltModeCBitmap::GetBitmap(BITMAP*);typedef struct tagBITMAP{ LONG bmType;// =0 LONG bmWidth; // 设备单位 LONG bmHeight;// 设备单位 LONG bmWidthBytes;// 字节为单位。每行长度。总是2倍数。 WORD bmPlanes;// 颜色位面数 WORD bmBitsPixel;// 每位像素数 LOVOID bmBits;// 位图信息}BITMAP;// 位图可包含颜色数int nColors = 1 << (bm.bmPlanes * bm.bmBitsPixel);
…
void CMyBitmap::DrawBitmap(CDC *pDC, int x, int y){ BITMAP bm; GetBitmap(&bm); CPoint size(bm.bmWidth, bm.bmHeight); pDC->DPtoLP(&size); CPoint org(0, 0); pDC->DPtoLP(&org); CDC dcMem; dcMem.CreateCompatibleDC(pDC); CBitmap *pOldBitmap = dcMem.SelectObject(this); dcMem.SetMapMode(pDC->GetMapMode()); pDC->BitBlt(x, y, size.x, size.y, &dcMem, org.x, org.y, SRCCOPY); dcMem.SelectObject(pOldBitmap);}CDC::DPtoLP传入参数是 CSize,MFC会干预让CSize中负值变为正值。(有时这样是不希望的。都传入CPoint吧)
位图资源:
// RCIDB_MYLOGO BITMAP logo.bmp// cppCBitmap bitmap;bitmap.LoadBitmap(IDB_MYLOGO);// 加载位图,并将位图中某颜色变为指定色bitmap.LoadMappedBitmap(IDB_BITMAP);// 黑色-->COLORBTNTEXT// 深灰色-->COLOR_BTNSHADOW
DIB和DIB分区
::CreateDIBitmap
::GetDIBits
::SetDIBits
位块传送,光栅操作,颜色映射
BitBlt,StretchBlt中光栅操作码,规定了 源DC,目标DC,目标DC画刷三者结合的方式。
通过对下面位值做逻辑运算,用结果在 Ternary Raster Operations找到相应的DWORD码,可使用自定义的光栅操作。
PAT 1 1 1 1 0 0 0 0
SRC 1 1 0 0 1 1 0 0
DEST 1 0 1 0 1 0 1 0
CDC位块传送函数:
BitBlt
StretchBlt
PatBlt
MaskBlt
PlgBlt
GetDeviceCaps(RASTERCAPS);
如果返回值设置了 RC_BITBLT,则设备支持BitBlt。
如返回值设置了 RC_STRETCHBLT,则设备支持StretchBlts。
源DC,目标DC颜色特性匹配时,位块传输最快。
// BitBlt改变的是dcAnd选入的bitmapAnd。这个的每一位只能选0或1.
// BitBlt
// S:单色位图 D:彩色位图 —> 最终结果中,0:D的前景色。1:D的背景色
// S:彩色位图 D:单色位图 —> 最终结果中,S背景色:1 ,其它色:0 // 书上说是D背景色。观察得出是S背景色。
// S:dcImage 彩色位图
// D:dcAnd 单色位图
// D = S,
// dcAnd结果: 位图中和dcImage背景颜色相同,为1.其余为0.
得到HBITMAP方法:
CreateBitmap/CreateCompatibleBitmap
LoadBitmap/LoadImage
区域
CRgn
CRgn创建区域函数
创建区域函数采用的坐标值是逻辑坐标。
区域不使用时,需要删除。CRgn析构函数中自动删除。
dc.BeginPath();dc.Ellipse(0, 0, 400, 200);/ dc.TextOut(0, 0, CString(_T("Hello MFC")));dc.EndPath();CRgn rgn;rgn.CreateFromPath(&dc);
Path:
CDC::BeginPathEndPathFillPathStrokePathStrokeAndFillPathWidenPathSelectClipPath
区域结合:
CRgn::CombineRgn(Rgn1, Rgn2, nFlag);
CDC::
FillRgn
PaintRgn
InvertRgn
FrameRgn
CWnd::InvalidateRgn
CDC::GetClipBox //
CRgn::PtInRegion
void CMyWindow::OnLButtonDown(UINT nFlags, CPoint point){ CClient dc(this); dc.DPtoLP(&point); if(m_rgn.PtInRegion(point)) { // }}
CDC::SelectObject
CDC::SelectClipRgn // 把区域选入设备描述表,选入后,区域成为设备描述表的剪切边界。
CWnd::SetWindowRgn // 使窗口具备定制的形状,不必再非得是矩形。
- MFC Windows程序设计--位图,区域
- windows 程序设计 位图
- 《Windows程序设计》之位图操作
- windows程序设计:位图和bitblt
- Windows程序设计-设备无关位图
- Windows程序设计:位图的显示
- windows程序设计 客户端区域大小
- 《MFC Windows 程序设计》
- mfc windows 程序设计
- MFC Windows 程序设计(1)
- MFC Windows 程序设计(2)
- MFC Windows 程序设计(3)
- MFC Windows 程序设计(4)
- MFC Windows 程序设计(5)
- MFC Windows 程序设计(6)
- MFC Windows 程序设计(7)
- MFC Windows程序设计读书笔记
- MFC Windows 程序设计->GetDeviceCaps
- HDU 1421(线性DP)
- Cassia cinnamon good
- 线程池基础类_ExecutorService(JDK1.8)
- 动态规划练习一 06:登山
- letters live图灵的信,听的一坨翔
- MFC Windows程序设计--位图,区域
- 动态规划练习一 移动路线
- Nginx安装其他组件安装
- 动态规划练习一 三角形最佳路径问题
- cogs 2259. 异化多肽 (生成函数+NTT)
- APICloud框架--sublime使用自定义loader
- [BZOJ4774]修路(斯坦纳树+dp)
- MySQL中操作关系型数据库 SQL
- 输出链表倒数第k个结点