圆角矩形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

相关文章

【数学】100332. 包含所有 1 的最小矩形面积 II

本文涉及知识点 数学 LeetCode100332. 包含所有 1 的最小矩形面积 II 给你一个二维 二进制 数组 grid。你需要找到 3 个 不重叠、面积 非零 、边在水平方向和竖直方向上的矩形,并且满足 grid 中所有的 1 都在这些矩形的内部。 返回这些矩形面积之和的 最小 可能值。 注意,这些矩形可以相接。 示例 1: 输入: grid = [[1,0,1],[1,1,1]]

Day 31:100334. 包含所有1的最小矩形面积Ⅰ

Leetcode 100334. 包含所有1的最小矩形面积Ⅰ 给你一个二维 **二进制 **数组 grid。请你找出一个边在水平方向和竖直方向上、面积 最小 的矩形,并且满足 grid 中所有的 1 都在矩形的内部。 返回这个矩形可能的 **最小 **面积。 确定首次出现 1 的第一行 top,最后一次出现 1 的最后一列 r,最后一次出现 1 的最后一行 bottom,首次出现的第

关于VC6 MFC使用Gdiplus实现自绘按钮的总结

步骤1:简易教程(更换对话框的背景)及Gdiplus下载地址可查看这个博客https://blog.csdn.net/misads/article/details/78619735。 步骤2:使用Gdiplus实现自绘按钮可参考这个博客https://blog.csdn.net/wyansai/article/details/50971959。 首先感谢上面两位博主的分享,那么我写这个博客是干

代码随想录算法训练营day62 | 42. 接雨水、84.柱状图中最大的矩形

42. 接雨水 暴力解法 遍历每根柱子(第一个和最后一个不需要遍历,因为不可能存住水),找到当前柱子的左边最高柱子lHeight,右边最高柱子rHeight,当前柱子能存的水为min(min(lHeight, rHeight) - 当前柱子的高度, 0) class Solution:def trap(self, height: List[int]) -> int:result = 0for

RN组件库 - Button 组件

从零构建 React Native 组件库,作为一个前端er~谁不想拥有一个自己的组件库呢 1、定义 Button 基本类型 type.ts import type {StyleProp, TextStyle, ViewProps} from 'react-native';import type {TouchableOpacityProps} from '../TouchableOpacit

明明导入button 包 还是报错 的解决方法~

Multiple markers at this line - Buttom cannot be resolved to   a type  - Buttom cannot be resolved 1.   import android.widget.Button;               先删掉Button -- > 手写输入  --> 有别的类也要导入imp

力扣1504.统计全1子矩形

力扣1504.统计全1子矩形 开一个二维数组存每个点从它本身开始向左有多少连续的1 遍历矩形右下角(i,j) 再遍历行k in i每一行的矩形数量 minx = min(minx,left(k,j)) class Solution {public:int numSubmat(vector<vector<int>>& mat) {int n = mat.size();int m = mat

qt 简单实验 一个可以向左侧拖拽缩放的矩形

1.概要 向左拖拽矩形,和向右拖拽不同,向右拖拽是增加宽度,向左拖拽是增加宽度的同时还要向左移动x的坐标。 2.代码 2.1 resizablerectangleleft.h #ifndef RESIZABLERECTANGLELEFT_H#define RESIZABLERECTANGLELEFT_H#include <QWidget>#include <QMouseEvent>

qt 简单实验 一个可以向右侧拖拽缩放的矩形

1.概要 目的是设置一个可以拖拽缩放的矩形,这里仅用右侧的一个边模拟这个过程。就是为了抓住核心,这个便解决了,其他的边也是一样的。而这个更能体现原理。 2.代码 2.1 resizablerectangle.h #ifndef RESIZABLERECTANGLE_H#define RESIZABLERECTANGLE_H#include <QWidget>#include <QMou

Android图片圆角转换 RoundedImageView开源项目 小记(1)

android:background=“#7f000000” android:paddingLeft=“8dp” android:paddingRight=“8dp” android:textAppearance=“?android:attr/textAppearanceMediumInverse” /> <TextView android:id=“@+id/textView1” an