【MFC系列-第21天】GDI算法实战——过渡色

21.1 Caption过渡色实现

// 方法一

void CCaptionDlg::DrawColorTitle(CRect rect, COLORREF col1, COLORREF col2,CDC* pDC)
{int cx = rect.Width();int red = GetRValue(col2) - GetRValue(col1);int green = GetGValue(col2) - GetGValue(col1);int blue = GetBValue(col2) - GetBValue(col1);int i = 0;CPen* pOldPen = pDC->GetCurrentPen();;while (i < cx){int r = GetRValue(col1) + i*red / cx;int g = GetGValue(col1) + i*green / cx;int b = GetBValue(col1) + i*blue / cx;/*	int j = 0;while (j < rect.bottom){pDC->SetPixel(i, j, RGB(r, g, b));++j;}*/CPen pen(PS_SOLID, 1, RGB(r, g, b));pDC->SelectObject(&pen);pDC->MoveTo(i, 0);pDC->LineTo(i, rect.bottom);++i;}if(pOldPen)pDC->SelectObject(pOldPen);
}
void CCaptionDlg::OnNcPaint()
{CWindowDC dc(this);CRect rect,rt;GetWindowRect(rect);rect.OffsetRect(-rect.left, -rect.top);rt = rect;rt.bottom = 30;DrawColorTitle(rect, RGB(255, 0, 0), RGB(0, 255, 255),&dc);//dc.Rectangle(rt);dc.SetTextColor(RGB(128, 255, 0));dc.SetBkMode(TRANSPARENT);dc.DrawText(_T("欢迎使用本软件!"), rt, DT_CENTER|DT_VCENTER|DT_SINGLELINE);rt.right -= 5;rt.top += 5;rt.bottom -= 5;rt.left = rt.right - rt.Height();rt.OffsetRect(-5, 4);//CBrush br(RGB(255, 255, 0));//dc.SelectObject(br);//dc.Rectangle(rt);//dc.MoveTo(rt.TopLeft());//dc.LineTo(rt.BottomRight());//dc.MoveTo(rt.right, rt.top);//dc.LineTo(rt.left, rt.bottom);dc.DrawFrameControl(rt, DFC_CAPTION, DFCS_CAPTIONCLOSE);::DrawIconEx(dc.m_hDC, 7, 8, m_hIcon, 20, 20, 0, NULL, DI_NORMAL| DI_MASK); //标题栏画图标
//	int cx = GetSystemMetrics(SM_CXFRAME);
}

21.2 形状填充

dc.Rectangle(110, 10, 200, 100);
dc.Ellipse(150, 50, 300, 150);
CBrush br(RGB(0, 255, 0));
dc.SelectObject(br);
dc.ExtFloodFill(115, 15, dc.GetPixel(115, 15), FLOODFILLSURFACE);

21.3 假按钮

	//CRect rect(5, 5, 100, 35);//dc.DrawIcon(200, 200, m_hIcon);//dc.SelectObject(GetFont());//rect.DeflateRect(2, 2);//dc.DrawFocusRect(rect);//rect.OffsetRect(-1, -1);//dc.DrawText(_T("假按钮"), rect, DT_CENTER | DT_SINGLELINE | DT_VCENTER);//dc.DrawEdge(CRect (5, 5, 100, 35) , m_bSelected? BDR_SUNKENINNER :BDR_RAISEDINNER, BF_RECT);
//CRect rect(5, 5, 100, 35);
//dc.SelectObject(GetFont());
//
//dc.DrawFrameControl(rect, DFC_BUTTON, DFCS_BUTTONPUSH);
//dc.DrawText(_T("假按钮"), rect, DT_CENTER | DT_SINGLELINE | DT_VCENTER);

21.4 GDI对象之四——位图

一、位图输出

a)加载位图:CBitmap::LoadBitmap

b)创建内存DC:CDC::CreateCompatible

c)内存DC选择位图:CDC::SelectObject

d)从内存DC输出到界面:CDC::Bitblt

CPaintDC dc(this); // 用于绘制的设备上下文int nCount;if (!m_bmp.GetSafeHandle()){m_bmp.LoadBitmap(IDB_BITMAP1);}CDC mdc;//mdc.CreateCompatibleDC(&dc);mdc.SelectObject(&m_bmp);BITMAP bm;m_bmp.GetBitmap(&bm);
dc.BitBlt(0, 0, bm.bmWidth,bm.bmHeight, &mdc, 0, 0, SRCCOPY);

二、辅助位图输出:

a)获取图像高宽等信息:CBitmap::GetBitmap

b)压缩或拉伸:CDC:StretchBlt

dc.BitBlt(0, 0, bm.bmWidth,bm.bmHeight, &mdc, 0, 0, SRCCOPY);dc.StretchBlt(bm.bmWidth + 2, 0, bm.bmWidth * 2, bm.bmHeight * 2,&mdc, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);dc.StretchBlt(0, bm.bmHeight+2, bm.bmWidth /2, bm.bmHeight /2,&mdc, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);

c)设置压缩算法:SetStretchBltMode

dc.SetStretchBltMode(STRETCH_HALFTONE);

d)图像翻转

dc.StretchBlt(bm.bmWidth,0, -bm.bmWidth , bm.bmHeight ,&mdc, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);dc.StretchBlt(0,bm.bmHeight*2, bm.bmWidth,-bm.bmHeight,&mdc, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);

e)WIN32位图输出

void OnPaint(HWND hwndDlg)
{PAINTSTRUCT ps;HDC hdc = BeginPaint(hwndDlg, &ps);if(!g_bmp)g_bmp = LoadBitmap(g_hInst, (LPCTSTR)IDB_BITMAP1);BITMAP bm;GetObject(g_bmp, sizeof(BITMAP), &bm);HDC mdc = ::CreateCompatibleDC(hdc);::SelectObject(mdc, g_bmp);::SetStretchBltMode(hdc, HALFTONE);::BitBlt(hdc, 0, 0, bm.bmWidth, bm.bmHeight, mdc, 0, 0, SRCCOPY);::StretchBlt(hdc, bm.bmWidth * 2, 0, -bm.bmWidth, bm.bmHeight, mdc, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);EndPaint(hwndDlg, &ps);OutputDebugString(_T("WM_PAINT-OnPaint\n"));
}

f)图像数据

if (!m_bmp.GetSafeHandle())
{m_bmp.LoadBitmap(IDB_BITMAP1);nCount = m_bmp.GetBitmapBits(0, NULL);char* p = new char[nCount];m_bmp.GetBitmapBits(nCount, p);delete []p;
}

21.5 GDI对象之五——区域

一、区域输出

CPaintDC dc(this); // 用于绘制的设备上下文int nCount;if (!m_bmp.GetSafeHandle())m_bmp.LoadBitmap(IDB_BITMAP1);CDC mdc;//mdc.CreateCompatibleDC(&dc);mdc.SelectObject(&m_bmp);BITMAP bm;m_bmp.GetBitmap(&bm);dc.SetStretchBltMode(STRETCH_HALFTONE);CRgn r;r.CreateEllipticRgn(0, 0, bm.bmWidth, bm.bmHeight);
//另一种方法//CRect rect(0, 0, bm.bmWidth, bm.bmHeight);//r.CreateEllipticRgnIndirect(rect);dc.SelectObject(r);dc.StretchBlt(0,0, bm.bmWidth *2, bm.bmHeight *2,&mdc, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);

二、手动绘制区域输出

CRgn r1,r2;
r1.CreateEllipticRgn(0, 0, bm.bmWidth*2, bm.bmHeight*2);
POINT ps[] = { {172,249} ,{5,420},{320,420} };
r2.CreatePolygonRgn(ps, _countof(ps), ALTERNATE);
CRgn r;
r.CreateRectRgn(0,0,0,0);
r.CombineRgn(&r1, &r2, RGN_XOR);
this->SetWindowRgn(r,TRUE);
//dc.SelectObject(r);
dc.StretchBlt(0,0, bm.bmWidth *2, bm.bmHeight *2,&mdc, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);

拖动客户区——假标题栏

LRESULT CBmDlg::OnNcHitTest(CPoint point)
{return HTCAPTION;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/346975.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在Spring MVC中处理域对象

最近&#xff0c;我惊讶于一个代码库在其所有域实体中都具有公共默认构造函数&#xff08;即零参数构造函数&#xff09;&#xff0c;并且所有字段都具有getter和setter。 当我深入研究时&#xff0c;我发现域实体之所以如此&#xff0c;主要是因为该团队认为Web / MVC框架需要…

【有限域元素加法和乘法】有限域元素加法和乘法的原理及MATLAB实现

关注公号【逆向通信猿】更精彩!!! 有限域 仍然以 r = 4 r=4 r=4,

使用storm 实时计算_使用Storm进行可扩展的实时状态更新

使用storm 实时计算在本文中&#xff0c;我将说明如何借助Storm框架以可扩展且无锁定的方式在数据库中维护实时事件驱动流程的当前状态。 Storm是基于事件的数据处理引擎。 它的模型依赖于基本原语&#xff0c;例如事件转换&#xff0c;过滤&#xff0c;聚合……&#xff0c;我…

【MFC系列-第22天】GDI算法实战——过渡色

关注公号【逆向通信猿】更精彩&#xff01;&#xff01;&#xff01; 第22天 GDI算法实战 CDC(HDC)绘图类&#xff1a; 五大GDI对象类&#xff1a;CPen&#xff0c;CBrush&#xff0c;CFont&#xff0c;CBitmap&#xff0c;CRgn 22.1 走马灯 设置定时器 SetTimer(1, 20, N…

无服务器:不费吹灰之力!

几年前&#xff0c; 集装箱横扫开发人员&#xff0c;而开发人员的土地就像6级飓风一样 。 码头工人 Rkt 。 其他 。 Docker Swarm 。 K8s 。 OpenShift 。 现在&#xff0c;我们实际上处于震中&#xff0c;但是当我们瞥见地平线时&#xff0c;我们看到另一个人来了&#x…

【MFC系列-第23天】CMemoryDC的封装过程

CDC(HDC)绘图类&#xff1a; 五大GDI对象类&#xff1a;CPen&#xff0c;CBrush&#xff0c;CFont&#xff0c;CBitmap&#xff0c;CRgn 23.1 LoadImage API HANDLE LoadImage(HINSTANCE hinst,LPCTSTR lpszName, UINT uType, int cxDesired,int cyDesired,UINT fuLoad );uT…

JDK 8与JDK 10:三元/拆箱的区别

最近的Nicolai Parlog &#xff08; nipafx &#xff09; 鸣叫引起了我的注意&#xff0c;因为它引用了关于JDK 8和JDK 10之间行为更改的有趣StackOverflow讨论 &#xff0c;并询问“为什么&#xff1f;” SerCe 在StackOverflow线程上引用的问题最终归结为在JDK 8和JDK 10之间…

【多元域乘法】多项式乘法电路原理及MATLAB详解

关注公号【逆向通信猿】更精彩!!! 关于二元域上的两个元素的乘法、多项式除法,在之前的博客 【有限域除法】二元多项式除法电路原理及MATLAB详解 子程序:sub_poly_div.m 【有限域元素加法和乘法】有限域元素加法和乘法的原理及MATLAB实现 子程序:sub_gf_add.m、sub_gf_…

my CSAPP Attack lab堆栈详解

关注公号【逆向通信猿】更精彩!!! 这个实验时学习了简书上的一篇文章后,自己根据课程例子进行的一次小测试,phase 4和5的堆栈图解还没有画,等后续有时间会进行补充。 本人转载的简书原文: https://blog.csdn.net/wlwdecs_dn/article/details/121249364#comments_19237…

Spring MVC教程

1.简介 作为企业Java开发人员&#xff0c;这项工作的主要重点之一是开发Web应用程序。 对于Web应用程序&#xff0c;后果还包括许多挑战。 具体来说&#xff0c;其中一些是状态管理&#xff0c;工作流和验证。 HTTP协议的无状态性质只会使事情变得更加复杂。 Spring的Web框架旨…

【MFC系列-第24天】梯形分页和蝴蝶QQ宠物的实现

CDC(HDC)绘图类&#xff1a; 五大GDI对象类&#xff1a;CPen&#xff0c;CBrush&#xff0c;CFont&#xff0c;CBitmap&#xff0c;CRgn 24.1 梯形分页的双缓冲改进和尺寸自适应 24.2 蝴蝶跟随鼠标点击运动 class CHitFlyDlg : public CDialogEx {CMemoryDC m_dc;//缓冲enu…

ubuntu22.04 下载路径

ftp下载路径 csdn下载 ubuntu22.04下载路径ubuntu-22.04-desktop-amd64.7z.001资源-CSDN文库 ubuntu22.04下载路径ubuntu-22.04-desktop-amd64.7z.002资源-CSDN文库 【免费】ubuntu-22.04-desktop-amd64.7z.003资源-CSDN文库 【免费】ubuntu-22.04-desktop-amd64.7z.004资源-…

camel seda 协议_探索Apache Camel Core – Seda组件

camel seda 协议Apache Camel中的seda组件与我在先前的博客中介绍的direct组件非常相似&#xff0c;但是以异步的方式。 为此&#xff0c;它使用java.util.concurrent.BlockingQueue作为默认实现来使消息排队并与主Route线程断开连接&#xff0c;然后在单独的线程中处理消息。 …

【MFC系列-第25、26天】绘图软件

25.1 绘图软件的绘制原理 纯虚函数&#xff1a;抽象函数&#xff0c;强制在派生类中进行实现&#xff1b; 虚函数&#xff1a;有函数体&#xff0c;可在基类也可在派生类中实现。 基类CLayer class CLayer {//抽象类 public:CLayer();~CLayer();virtual void OnDraw(CDC* pDC…

Java 10:“ var”关键字

Java 10使用关键字var引入了局部变量类型推断 。 这意味着无需编写&#xff1a; Map<Department, List<Employee>> map new HashMap<>(); // ... for (Entry<Department, List<Employee>> dept : map.entrySet()) {List<Employee> emplo…

【MFC系列-第32天】控件自绘技术

32.1 对话框背景设置 方法一 BOOL CClDlg::OnEraseBkgnd(CDC* pDC) {CRect rect;GetClientRect(rect);pDC->FillSolidRect(rect, RGB(200, 255, 255));return TRUE; }方法二&#xff1a;WM_CTRLCOLOR消息 按类型按句柄按控件ID HBRUSH CMFCApplication1Dlg::OnCtlColor(…

Spring Reactor教程

在RESTful服务的世界中&#xff0c;实际上实际上是在幕后进行许多工作&#xff0c;我们通常必须在应用程序中进行很多处理&#xff0c;而实际上并不会影响需要发送给真实用户的响应。 可以被动地做出这些业务决策&#xff0c;以便它们对与应用程序交互的用户没有任何影响。 Spr…

MFC多线程处理界面假死之红外图像数据获取和excel写入

在MFC主界面某个Button Click事件中起一个线程去做处理一些事情,在起的线程运行完毕后,接着跑Click起线程后的代码,已达到按顺序执行,保证时许正确的目的。 问题 通常处理一个线程等待用 WaitForSingleObject,这个放在主界面线程成中会造成主界面“卡死”,其原因是它将…

api签名_使用签名保护基于HTTP的API

api签名我在EMC上的一个平台上可以构建SaaS解决方案。 与越来越多的其他应用程序一样&#xff0c;该平台具有基于RESTful HTTP的API。 使用JAX-RS之类的开发框架&#xff0c;构建这样的API相对容易。 但是&#xff0c; 正确构建它们并不容易。 建立基于HTTP的API的问题 问…

【多元域除法】多项式除法电路原理及MATLAB详解

关注公号【逆向通信猿】更精彩!!! 关于二元域上的两个元素的加法和乘法、多项式除法,在之前的博客 【有限域除法】二元多项式除法电路原理及MATLAB详解 子程序:sub_poly_div.m 【有限域元素加法和乘法】有限域元素加法和乘法的原理及MATLAB实现 子程序:sub_gf_add.m、s…