我是靠谱客的博主 大力日记本,最近开发中收集的这篇文章主要介绍位图的光栅操作,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

http://hi.baidu.com/yn_bg/item/9c3033eb5f576f3d86d9deac

位图的光栅操作(非画笔和目标颜色的光栅操作)

 

VC++之图形设备接口之位图光栅操作

一、创建单文档应用程序


二、添加位图、编辑菜单资源

2.1、添加位图

2.2、编辑菜单

ID 菜单名
ID_EDIT_GREEN 绿色[&G]
ID_EDIT_BLUE 蓝色[&B]
ID_EDIT_INITIALISZ 绿色[&G]


三、添加变量、函数

3.1、添加变量

protected:
BOOL m_blue;
BOOL m_green;
BOOL m_showBrush;
BOOL m_drawLines;


3.2、添加函数



四、于RasterView.cpp文件添加代码

CRasterView::CRasterView()
{
// TODO: add construction code here
m_showBrush = FALSE;
m_drawLines = FALSE;
m_green=FALSE;
m_blue=FALSE;
}

void CRasterView::OnDraw(CDC* pDC)
{
CRasterDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
if(!m_green*!m_blue)
pDC->FillRect(CRect(0,0, 470, 300), new CBrush(RGB(176,150,33))); //初始化背景色
if(m_green)
pDC->FillRect(CRect(0,0, 470, 300), new CBrush(RGB(0,255,0))); //绿背景色
if(m_blue)
pDC->FillRect(CRect(0,0, 470, 300), new CBrush(RGB(0,0,255))); //蓝背景色
if (m_drawLines)
{
CPen* pNewPen = new CPen(PS_SOLID, 5, RGB(255,0,0)); //创建红色画笔
CPen* pOldPen = pDC->SelectObject(pNewPen); //将红色画笔选入DC
for (int x=0; x<10; ++x) //画红色线
{
pDC->MoveTo(0, x*30);
pDC->LineTo(465, x*30);
}
pDC->SelectObject(pOldPen); //恢复初始画笔
delete pNewPen; //删除红色画笔
}
CDC memoryDC; //创建内存DC对象
memoryDC.CreateCompatibleDC(pDC);
CBitmap bitmap; //创建位图对象
bitmap.LoadBitmap(IDB_BITMAP1);
CBitmap* pOldBitmap = memoryDC.SelectObject(&bitmap); //将位图选入内存DC
CBrush* pNewBrush = new CBrush(HS_CROSS, RGB(0,0,0)); //创建黑色网格画刷
CBrush* pOldBrush;
CString str1;
if (m_showBrush)
pOldBrush = pDC->SelectObject(pNewBrush); //将新画刷选入DC
pDC->BitBlt(10, 10, 80, 80, &memoryDC, 0, 0, BLACKNESS); //复制内存DC到视图DC,使用“黑色填充目标矩形”光栅操作
str1="黑色填目";
pDC->TextOut(10,60,str1);
pDC->BitBlt(100, 10, 80, 80, &memoryDC, 0, 0, DSTINVERT); //复制内存DC到视图DC,使用“反转目标矩形颜色”光栅操作
str1="目取反";
pDC->TextOut(100,60,str1);
pDC->BitBlt(190, 10, 80, 80, &memoryDC, 0, 0, MERGECOPY); //复制内存DC到视图DC,使用“源矩形颜色AND画刷”光栅操作
str1="源&画刷";
pDC->TextOut(190,60,str1);
pDC->BitBlt(280, 10, 80, 80, &memoryDC, 0, 0, MERGEPAINT); //复制内存DC到视图DC,使用“反转源矩形OR目标矩形”光栅操作
str1="反源∨目";
pDC->TextOut(280,60,str1);
pDC->BitBlt(370, 10, 80, 80, &memoryDC, 0, 0, NOTSRCCOPY); //复制内存DC到视图DC,使用“反转源矩形后复制到目标矩形”光栅操作
str1="反源复制";
pDC->TextOut(370,60,str1);

pDC->BitBlt(10, 100, 80, 80, &memoryDC, 0, 0, NOTSRCERASE); //复制内存DC到视图DC,使用“源矩形OR目标矩形后反转”光栅操作
str1="源∨目取反";
pDC->TextOut(10,160,str1);
pDC->BitBlt(100, 100, 80, 80, &memoryDC, 0, 0, PATCOPY); //复制内存DC到视图DC,使用“画刷替换目标矩形”光栅操作
str1="画刷替目";
pDC->TextOut(100,160,str1);
pDC->BitBlt(190, 100, 80, 80, &memoryDC, 0, 0, PATINVERT); //复制内存DC到视图DC,使用“目标矩形XOR画刷”光栅操作
str1="目^画刷";
pDC->TextOut(190,160,str1);
pDC->BitBlt(280, 100, 80, 80, &memoryDC, 0, 0, PATPAINT); //复制内存DC到视图DC,使用“(反转源矩形OR画刷)OR目标矩形”光栅操作
str1="反源∨画刷";
pDC->TextOut(280,140,str1);
str1="结果∨目";
pDC->TextOut(280,160,str1);
pDC->BitBlt(370, 100, 80, 80, &memoryDC, 0, 0, SRCAND); //复制内存DC到视图DC,使用“源矩形AND目标矩形”光栅操作
str1="源&目";
pDC->TextOut(370,160,str1);

pDC->BitBlt(10, 190, 80, 80, &memoryDC, 0, 0, SRCCOPY); //复制内存DC到视图DC,使用“源矩形代替目标矩形”光栅操作
str1="源替代目";
pDC->TextOut(10,250,str1);
pDC->BitBlt(100, 190, 80, 80, &memoryDC, 0, 0, SRCERASE); //复制内存DC到视图DC,使用“源矩形AND反转目标矩形”光栅操作
str1="反目&源";
pDC->TextOut(100,250,str1);
pDC->BitBlt(190, 190, 80, 80, &memoryDC, 0, 0, SRCINVERT); //复制内存DC到视图DC,使用“源矩形XOR目标矩形”光栅操作
str1="源^目";
pDC->TextOut(190,250,str1);
pDC->BitBlt(280, 190, 80, 80, &memoryDC, 0, 0, SRCPAINT); //复制内存DC到视图DC,使用“源矩形OR目标矩形”光栅操作
str1="源∨目";
pDC->TextOut(280,250,str1);
pDC->BitBlt(370, 190, 80, 80, &memoryDC, 0, 0, WHITENESS); //复制内存DC到视图DC,使用“白色填充目标矩形”光栅操作
str1="白色填目";
pDC->TextOut(370,250,str1);

str1="&....与 ∨....或 ^.....异或 源....源矩形 目....目标矩形";
pDC->TextOut(10,280,str1);
if (m_showBrush)
{
pDC->SelectObject(pOldBrush); //恢复视图初始化画刷
delete pNewBrush; //删除新创建画刷
}
memoryDC.SelectObject(pOldBitmap); //恢复内存DC初始化位图
}

void CRasterView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
m_showBrush = !m_showBrush;
Invalidate();
CView::OnLButtonDown(nFlags, point);
}

void CRasterView::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
m_drawLines = !m_drawLines;
Invalidate();
CView::OnRButtonDown(nFlags, point);
}

void CRasterView::OnEditGreen()
{
// TODO: Add your command handler code here
m_green = !m_green;
m_blue=FALSE;
Invalidate();
}

void CRasterView::OnEditBlue()
{
// TODO: Add your command handler code here
m_blue = !m_blue;
m_green=FALSE;
Invalidate();
}

void CRasterView::OnEditInitialisz()
{
// TODO: Add your command handler code here
m_green=FALSE;
m_blue=FALSE;
Invalidate();
}

五、编译

六、运行


#vc++6.0

 

最后

以上就是大力日记本为你收集整理的位图的光栅操作的全部内容,希望文章能够帮你解决位图的光栅操作所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(48)

评论列表共有 0 条评论

立即
投稿
返回
顶部