圆角矩形button自绘

2023-11-11 11:18
文章标签 圆角 矩形 button 自绘

本文主要是介绍圆角矩形button自绘,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

使用GDI+的函数DrawPath与FillPath画圆角矩形并填充

GdiPlusBtn .h

class CGdiPlusBtn : public CButton

{
DECLARE_DYNAMIC(CGdiPlusBtn)


public:
CGdiPlusBtn();
virtual ~CGdiPlusBtn();


protected:
DECLARE_MESSAGE_MAP()
virtual void PreSubclassWindow();
public:
virtual void DrawItem(LPDRAWITEMSTRUCT /*lpDrawItemStruct*/);

};

GdiPlusBtn .cpp

void CGdiPlusBtn::PreSubclassWindow()
{
// TODO: 在此添加专用代码和/或调用基类
ModifyStyle (0, BS_OWNERDRAW);
CButton::PreSubclassWindow();
}


static GraphicsPath* CreateRoundedRectangle(CRect rect, int r,bool bFilled)
{
GraphicsPath* path = new GraphicsPath();
int r2 = (int)r / 2;

if (!bFilled)
{
rect.right-=1;
rect.bottom-=1;
}
else
{
rect.DeflateRect(2,2,2,2);
}
path->AddArc(rect.left, rect.top, r, r, 180, 90);
path->AddLine(rect.left + r2, rect.top, rect.right - r2, rect.top);
path->AddArc(rect.right - r , rect.top, r, r, 270, 90);
path->AddLine(rect.right, rect.top + r2, rect.right, rect.bottom - r2);
path->AddArc(rect.right - r , rect.bottom - r, r, r, 0, 90);
path->AddLine(rect.right - r2, rect.bottom, rect.left + r2, rect.bottom);
path->AddArc(rect.left, rect.bottom - r, r, r, 90, 90);
path->AddLine(rect.left, rect.bottom - r2, rect.left, rect.top + r2);
return path;
}
void CGdiPlusBtn::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{


// TODO:  添加您的代码以绘制指定项
CDC* pDC =CDC::FromHandle(lpDrawItemStruct->hDC);
CRect rect = lpDrawItemStruct->rcItem;
CRect rcText = rect;
UINT itmeState = lpDrawItemStruct->itemState;
Graphics g(pDC->m_hDC);
Pen* pen = new Pen(Color(255,255,0,0),1);
g.DrawPath(pen, CreateRoundedRectangle(rect, 20,false));
LinearGradientBrush* pBrush = new LinearGradientBrush(Rect(0,0,rect.Width(),rect.Height()),Color(255,0,255,0) ,Color(255,0,0,255) ,90); 
g.FillPath(pBrush, CreateRoundedRectangle(rect, 20,true));
CString str;
GetWindowText(str);
if (str.IsEmpty()) return;
LOGFONT logfont;
GetObject(GetStockObject(SYSTEM_FONT),sizeof(LOGFONT),&logfont);
logfont.lfItalic = false;
logfont.lfHeight = 30;
logfont.lfWeight = 0;
logfont.lfCharSet = GB2312_CHARSET;
logfont.lfStrikeOut = false;
wsprintf(logfont.lfFaceName,TEXT("%s"),TEXT("微软雅黑"));
HFONT hfont = CreateFontIndirect(&logfont);
HFONT hOldFont = (HFONT)SelectObject(pDC->m_hDC,hfont);
COLORREF clrOldText = SetTextColor(pDC->m_hDC,RGB(255,0,0));
SetBkMode(pDC->m_hDC,TRANSPARENT);
pDC->DrawText(str, &rcText,DT_CENTER | DT_VCENTER | DT_SINGLELINE);
SetTextColor(pDC->m_hDC,clrOldText);
SelectObject(pDC->m_hDC,hOldFont);
DeleteObject(hfont);
}

这篇关于圆角矩形button自绘的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/389668

相关文章

Flutter Button使用

Material 组件库中有多种按钮组件如ElevatedButton、TextButton、OutlineButton等,它们的父类是于ButtonStyleButton。         基本的按钮特点:         1.按下时都会有“水波文动画”。         2.onPressed属性设置点击回调,如果不提供该回调则按钮会处于禁用状态,禁用状态不响应用户点击。

小程序button控件上下边框的显示和隐藏

问题 想使用button自带的loading图标功能,但又不需要button显示边框线 button控件有一条淡灰色的边框,在控件上了样式 border:none; 无法让button边框隐藏 代码如下: <button class="btn">.btn{border:none; /*一般使用这个就是可以去掉边框了*/} 解决方案 发现button控件有一个伪元素(::after

百度之星初赛1006(计算几何:能包含凸包的最小矩形面积)

矩形面积    Accepts: 717    Submissions: 1619  Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description 小度熊有一个桌面,小度熊剪了很多矩形放在桌面上,小度熊想知道能把这些

NYOJ 16 矩形嵌套

OJ题目 : http://acm.nyist.net/JudgeOnline/problem.php?pid=16 描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽。矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a<c,b<d或者b<c,a<d(相当于旋转X90度)。例如(1,5)可以嵌套在(6,2)内,但不能嵌套在(3,4)中。你的任务是选出尽可能多的矩形排成一行,使得除

【数据结构-二维前缀和】力扣1504. 统计全 1 子矩形

给你一个 m x n 的二进制矩阵 mat ,请你返回有多少个 子矩形 的元素全部都是 1 。 示例 1: 输入:mat = [[1,0,1],[1,1,0],[1,1,0]] 输出:13 解释: 有 6 个 1x1 的矩形。 有 2 个 1x2 的矩形。 有 3 个 2x1 的矩形。 有 1 个 2x2 的矩形。 有 1 个 3x1 的矩形。 矩形数目总共 = 6 + 2 + 3 + 1 +

Android中圆角Button实现

在android开发中,Button是使用很频繁的一种控件,而android提供的原生Button是很规矩的矩形外观,有时候缺乏美感,而相反,圆角按钮则可以提升美感。那么,我们如何设计实现出圆形按钮呢?     话不多说,请看实现! 在drawable目录下新建名称如“shape.xml”的文件 <pre class="html" name="code"><pr

【Puppeteer】‘left‘ is already pressed, ‘${button}‘ is already pressed 的解决办法

解决过程如下 这是我原来的代码,不管我怎么修改,都一直会出现 'left' is already pressed 这个错误 找了很多资料 搜了 很多网站都 找不到解决办法 async function dragAndDrop(page, canvasSelector, startX, startY, endX, endY) {const startCoordinates = await ge

牛客网《剑指Offer》 矩形覆盖

题目描述 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? class Solution {public:int rectCover(int number) {if(number==0) return 0;if(number==1) return 1;if(number==2) return 2;retu

【每日一题】LeetCode 84.柱状图中最大的矩形(栈、数组、单调栈)

【每日一题】LeetCode 84.柱状图中最大的矩形(栈、数组、单调栈) 题目描述 给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。求在该柱状图中,能够勾勒出来的矩形的最大面积。 这个题目和接雨水非常类似 点击跳转接雨水 LeetCode 40.接雨水 输入示例 输入:heights = [2,1,5,6,2,3] 输出:10 解释:最大的

button 提交后再次刷新页面

button,input type=button按钮在IE和w3c,firefox浏览器区别 当在IE浏览器下面时,button标签按钮,input标签type属性为button的按钮是一样的功能,不会对表单进行任何操作。 但是在W3C浏览器,如Firefox下就需要注意了,button标签按钮会提交表单,而input标签type属性为button不会对表单进行任何操作。 解决方案: