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

关注公号【逆向通信猿】更精彩!!!

第22天 GDI算法实战

CDC(HDC)绘图类:
五大GDI对象类:CPen,CBrush,CFont,CBitmap,CRgn

22.1 走马灯

设置定时器

SetTimer(1, 20, NULL);

a)用窗口滚动来实现,一种思路

	//pLamp->ScrollWindow(-2,0);
//	this ->ScrollWindow(-2, 0);

正确代码:

void ClampDlg::OnTimer(UINT_PTR nIDEvent)
{CWnd* pLamp = GetDlgItem(IDC_LAMP);CRect rect,rt;GetClientRect(rt);pLamp->GetWindowRect(rect);ScreenToClient(rect);rect.OffsetRect(-2, 0);if (rect.right <= 0)rect.OffsetRect(rt.Width() - rect.left,0);//rect.OffsetRect(rt.Width() + rect.Width(), 0);pLamp->MoveWindow(rect);CDialogEx::OnTimer(nIDEvent);
}

b)用CDC来实现

①临时DC——ClientDC

m_szText = _T("本文内容已由机器翻译。如果您连接了 Internet,请选择“联机查看本主题”以在可编辑模式下对照英文内容查看此页。");
BOOL ClampDlg::OnInitDialog()
{CDialogEx::OnInitDialog();CRect rect,rt;GetClientRect(rt);m_nLeft = rt.right;SetTimer(1, 20, NULL);//return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}
void ClampDlg::OnTimer(UINT_PTR nIDEvent)
{CRect rect, rt;CClientDC dc(this);dc.SetBkColor(GetSysColor(COLOR_3DFACE));//dc.SetBkMode(TRANSPARENT);GetClientRect(rt);dc.SelectObject(GetFont());CSize size = dc.GetOutputTextExtent(m_szText);dc.TextOut(m_nLeft, rt.Height()-size.cy, m_szText);m_nLeft -= 1;if (m_nLeft + size.cx <= 0)m_nLeft = rt.right;CDialogEx::OnTimer(nIDEvent);
}
void ClampDlg::OnTimer(UINT_PTR nIDEvent)
{CRect rect, rt;CClientDC dc(this);dc.SetBkColor(GetSysColor(COLOR_3DFACE));//dc.SetBkMode(TRANSPARENT);GetClientRect(rt);dc.SelectObject(GetFont());CSize size = dc.GetOutputTextExtent(m_szText);dc.TextOut(m_nLeft, rt.Height()-size.cy, m_szText);m_nLeft -= 1;if (m_nLeft + size.cx <= 0)m_nLeft = rt.right;CDialogEx::OnTimer(nIDEvent);
}

②创建控件,在OnTimer中绘图
添加MFC类

class CLampCtrl : public CWnd
{DECLARE_DYNAMIC(CLampCtrl)COLORREF m_clText, m_clBack;CFont m_font;
//	CFont *m_pFont;//pFont ->GetLogFont(&lf) m_font.CreateIndirect(&lf);CString m_szText;int m_nLeft;
public:void SetFont(CFont* pFont);void SetText(LPCTSTR sText){m_szText = sText;}void SetTextColor(COLORREF clText){m_clText = clText;}void SetBkColor(COLORREF clBack){m_clBack = clBack;}void Start(){SetTimer(1, 16, NULL);}void Pause(){KillTimer(1);}void Reset();BOOL Create(LPCTSTR sText, CRect rect, CWnd* pParent, UINT nID);BOOL CreateEx(DWORD dwStyleEx,LPCTSTR sText, CRect rect, CWnd* pParent, UINT nID);CLampCtrl();virtual ~CLampCtrl();protected:DECLARE_MESSAGE_MAP()
public:afx_msg void OnPaint();afx_msg void OnTimer(UINT_PTR nIDEvent);afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
};
CLampCtrl::CLampCtrl()
{m_clBack = GetSysColor(COLOR_BTNFACE);m_clText = GetSysColor(COLOR_WINDOWTEXT);
}CLampCtrl::~CLampCtrl()
{
}BEGIN_MESSAGE_MAP(CLampCtrl, CWnd)ON_WM_PAINT()ON_WM_TIMER()ON_WM_CREATE()
END_MESSAGE_MAP()void CLampCtrl::SetFont(CFont * pFont)
{if (!pFont)return;LOGFONT lf;pFont->GetLogFont(&lf);m_font.CreateFontIndirect(&lf);
}void CLampCtrl::Reset()
{
}BOOL CLampCtrl::Create(LPCTSTR sText, CRect rect, CWnd* pParent, UINT nID)
{m_szText = sText;return CWnd::Create(NULL, NULL, WS_CHILD | WS_VISIBLE, rect, pParent, nID);
}BOOL CLampCtrl::CreateEx(DWORD dwStyleEx, LPCTSTR sText, CRect rect, CWnd * pParent, UINT nID)
{m_szText = sText;return CWnd::CreateEx(dwStyleEx,NULL, NULL, WS_CHILD | WS_VISIBLE, rect, pParent, nID);
}// CLampCtrl 消息处理程序void CLampCtrl::OnPaint()
{CPaintDC dc(this); // device context for paintingCRect rect;GetClientRect(rect);dc.FillSolidRect(rect, RGB(0, 255, 255));
}void CLampCtrl::OnTimer(UINT_PTR nIDEvent)
{CRect rect, rt;GetClientRect(rt);CClientDC dc(this);if ((HFONT)m_font)dc.SelectObject(m_font);dc.FillSolidRect(rt, m_clBack);dc.SetBkMode(TRANSPARENT);
//	dc.SetBkColor(m_clBack);dc.SetTextColor(m_clText);//dc.SetBkMode(TRANSPARENT);dc.SelectObject(GetFont());CSize size = dc.GetOutputTextExtent(m_szText);
//	dc.TextOut(m_nLeft, 0, m_szText);rect = rt;rect.left = m_nLeft;dc.DrawText(m_szText, rect, DT_VCENTER | DT_SINGLELINE);m_nLeft -= 1;if (m_nLeft + size.cx <= 0)m_nLeft = rt.right;CWnd::OnTimer(nIDEvent);
}int CLampCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{if (CWnd::OnCreate(lpCreateStruct) == -1)return -1;CRect rect, rt;GetClientRect(rt);m_nLeft = rt.right;Start();return 0;
}

③在OnPaint里绘图,OnTimer里刷新

void CLampCtrl::OnTimer(UINT_PTR nIDEvent)
{Invalidate(FALSE);CWnd::OnTimer(nIDEvent);
}void CLampCtrl::OnPaint()
{CPaintDC dc(this); // device context for paintingCRect rect, rt;GetClientRect(rt);if ((HFONT)m_font)dc.SelectObject(m_font);dc.FillSolidRect(rt, m_clBack);dc.SetBkMode(TRANSPARENT);dc.SetTextColor(m_clText);dc.SelectObject(GetFont());CSize size = dc.GetOutputTextExtent(m_szText);rect = rt;rect.left = m_nLeft--;dc.DrawText(m_szText, rect, DT_VCENTER | DT_SINGLELINE);if (m_nLeft2 > 0){rect.left = m_nLeft2--;dc.DrawText(m_szText, rect, DT_VCENTER | DT_SINGLELINE);}int nRight = m_nLeft + size.cx;if (nRight <= 0){m_nLeft = m_nLeft2;m_nLeft2 = 0;}else if (nRight < rt.right / 2 && !m_nLeft2)m_nLeft2 = rt.right;
}

22.2 图片切换

class CPageDlg : public CDialogEx
{HCURSOR m_hCursor; // 鼠标光标void OnOK() {}int m_nIndex;enum {PAGE_COUNT=4};CBitmap m_bs[PAGE_COUNT];CRect m_rs[PAGE_COUNT];
public:CPageDlg(CWnd* pParent = NULL);	// 标准构造函数// 对话框数据
#ifdef AFX_DESIGN_TIMEenum { IDD = IDD_PAGE_DIALOG };
#endifprotected:virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV 支持// 实现
protected:HICON m_hIcon;// 生成的消息映射函数virtual BOOL OnInitDialog();afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();DECLARE_MESSAGE_MAP()
public:afx_msg void OnMouseMove(UINT nFlags, CPoint point);
};
CPageDlg::CPageDlg(CWnd* pParent /*=NULL*/): CDialogEx(IDD_PAGE_DIALOG, pParent)
{m_hIcon = theApp.LoadIcon(IDR_MAINFRAME);m_hCursor = theApp.LoadStandardCursor(IDC_HAND); // 加载系统光标m_nIndex = 0;
}void CPageDlg::DoDataExchange(CDataExchange* pDX)
{CDialogEx::DoDataExchange(pDX);
}BEGIN_MESSAGE_MAP(CPageDlg, CDialogEx)ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_WM_MOUSEMOVE()
END_MESSAGE_MAP()// CPageDlg 消息处理程序BOOL CPageDlg::OnInitDialog()
{CDialogEx::OnInitDialog();int i = -1;while (++i < _countof(m_bs))m_bs[i].LoadBitmap(IDB_BITMAP1 + i);BITMAP bm;m_bs[0].GetBitmap(&bm);//MoveWindow(0, 0, bm.bmWidth, bm.bmHeight);SetWindowPos(NULL, 0, 0, bm.bmWidth, bm.bmHeight, SWP_NOMOVE);CRect rect(888, 276, 908, 327);i = -1;while (++i < _countof(m_rs)){m_rs[i] = rect;rect.OffsetRect(27, 0);}// 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动//  执行此操作SetIcon(m_hIcon, TRUE);			// 设置大图标SetIcon(m_hIcon, FALSE);		// 设置小图标// TODO: 在此添加额外的初始化代码return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}
void CPageDlg::OnPaint()
{CPaintDC dc(this); // 用于绘制的设备上下文if (m_nIndex < 0 || m_nIndex >= _countof(m_bs))return;CDC mdc;mdc.CreateCompatibleDC(&dc);mdc.SelectObject(m_bs + m_nIndex);//m_bs[m_nIndex]CRect rect;GetClientRect(rect);dc.BitBlt(0, 0, rect.Width(), rect.Height(), &mdc, 0, 0, SRCCOPY);
}//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CPageDlg::OnQueryDragIcon()
{return static_cast<HCURSOR>(m_hIcon);
}void CPageDlg::OnMouseMove(UINT nFlags, CPoint point)
{int i = -1;while (++i < _countof(m_rs)){if (m_rs[i].PtInRect(point)){if (m_nIndex != i){m_nIndex = i;Invalidate(FALSE);}SetCursor(m_hCursor); //光标变为手型break;}}CDialogEx::OnMouseMove(nFlags, point);
}

22.2 图片旋转

在OnPaint中绘图

CPageDlg::CPageDlg(CWnd* pParent /*=NULL*/): CDialogEx(IDD_PAGE_DIALOG, pParent)
{m_nDir = 3;m_nLeft = 0;m_hIcon = theApp.LoadIcon(IDR_MAINFRAME);
}void CPageDlg::DoDataExchange(CDataExchange* pDX)
{CDialogEx::DoDataExchange(pDX);
}BOOL CPageDlg::OnInitDialog()
{CDialogEx::OnInitDialog();m_bitmap.LoadBitmap(IDB_BITMAP1);BITMAP bm;m_bitmap.GetBitmap(&bm);//MoveWindow(0, 0, bm.bmWidth, bm.bmHeight);SetWindowPos(NULL, 0, 0, bm.bmWidth, bm.bmHeight, SWP_NOMOVE);SetIcon(m_hIcon, TRUE);			// 设置大图标SetIcon(m_hIcon, FALSE);		// 设置小图标return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}void CPageDlg::OnPaint()
{CPaintDC dc(this); // 用于绘制的设备上下文//BITMAP bm;//m_bitmap.GetBitmap(&bm);CRect rect;GetClientRect(rect);CDC mdc;mdc.CreateCompatibleDC(&dc);mdc.SelectObject(&m_bitmap);dc.SetStretchBltMode(HALFTONE); //压缩算法设置dc.StretchBlt(m_nLeft, 0, rect.Width() - m_nLeft * 2, rect.Height(), &mdc, 0, 0, rect.Width(), rect.Height(), SRCCOPY);SetTimer(1, 16, 0);
}HCURSOR CPageDlg::OnQueryDragIcon()
{return static_cast<HCURSOR>(m_hIcon);
}void CPageDlg::OnMouseMove(UINT nFlags, CPoint point)
{CDialogEx::OnMouseMove(nFlags, point);
}void CPageDlg::OnTimer(UINT_PTR nIDEvent)
{Invalidate(TRUE);//TRUE用窗口自带背景色清理m_nLeft += m_nDir;CRect rect;GetClientRect(rect);if (m_nLeft >= rect.Width() || m_nLeft<=0)m_nDir *= -1;TRACE("m_nLeft=%d,Width=%d\n", m_nLeft, rect.Width());CDialogEx::OnTimer(nIDEvent);
}

Invalidate,TRUE用窗口自带背景色清理,FALSE用上一次绘图(图片)的背景色,用TRUE会有闪烁,如何去除闪烁——分三部分绘图

void CPageDlg::OnPaint()
{CPaintDC dc(this); // 用于绘制的设备上下文//BITMAP bm;//m_bitmap.GetBitmap(&bm);CRect rect, rt;GetClientRect(rect);CDC mdc;mdc.CreateCompatibleDC(&dc);mdc.SelectObject(&m_bitmap);dc.SetStretchBltMode(COLORONCOLOR);dc.StretchBlt(m_nLeft, 0, rect.Width() - m_nLeft * 2, rect.Height(),&mdc, 0, 0, rect.Width(), rect.Height(), SRCCOPY);rt = rect;if (m_nDir > 0){if (m_nLeft < rect.Width() / 2){rt.left = 0;rt.right = m_nLeft;dc.FillSolidRect(rt, GetSysColor(COLOR_3DFACE));rt.right = rect.right;rt.left = rect.Width() - m_nLeft;dc.FillSolidRect(rt, GetSysColor(COLOR_3DFACE));}}else{if (m_nLeft > rect.Width() / 2){int nWidth = rect.Width() - m_nLeft;rt.right = rect.right;rt.left = rt.right - nWidth;dc.FillSolidRect(rt, GetSysColor(COLOR_3DFACE));rt.right = nWidth;rt.left = 0;dc.FillSolidRect(rt, GetSysColor(COLOR_3DFACE));}}TRACE("m_nLeft=%d,Width=%d\n", m_nLeft, rect.Width());
}

22.3 梯形分页

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

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

相关文章

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

几年前&#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…

用Rocker制作模板

在本文中&#xff0c;我们将快速介绍Rocker &#xff0c;这是一个静态类型化的快速Java 8模板引擎。 必需的依赖项 要开始使用Rocker&#xff0c;我们需要在项目中添加以下依赖项&#xff1a; <dependency><groupId>com.fizzed</groupId><artifactId>…

win10高分辨率下修改字体显示大小(不是缩放百分比)

问题 不通过修改设置缩放百分比来增大win10的字体显示大小&#xff0c;缩放百分比调大后会导致很多问题出现&#xff01;&#xff01;&#xff01; 修改 打开设置&#xff0c;或者右键个性化&#xff0c;在搜索栏输入&#xff1a;“放大文本大小”&#xff0c;搜索框下面会自…

【MFC系列-第33天】链接控件自绘技术

33.1 常用的字体复制 方法一 CFont* pFont pDC->GetCurrentFont(); LOGFONT lf; pFont->GetLogFont(&lf); m_fontN.CreateFontIndirect(&lf); lf.lfUnderline TRUE; m_fontT.CreateFontIndirect(&lf);方法二 HFONT hFont (HFONT)GetStockObject(DEFAUL…

guava读取配置文件_使用Guava MapSplitters配置Hadoop

guava读取配置文件在本文中&#xff0c;我们将为通过Context对象将配置参数传递给Hadoop Mapper提供新的思路。 通常&#xff0c;我们在启动map-reduce作业时将配置参数设置为Context对象上的键/值对。 然后在Mapper中&#xff0c;我们使用键来检索要用于我们的配置需求的值。 …