今天学了控件的自绘,初步偿试了下,蹂躏的不行不行的,查了好多的资料,头都弄大了,

有好多还是没弄明白,只是初步实现一个按钮的基本功能,好难呀,

先看下效果:

按下状态

弹起状态

按钮2按下状态

按钮2弹起状态

因好多不明白,先把WM_PAIN消息中绘图代码先发上来,以后弄好了再说

子类实现了WM_PAIN,WM_LBUTTONDOWN,WM_LBUTTONUP,现在就实现了这三个消息

还有一个修改文本颜色SetTxtColor,和修改背景色SetBkColor,

LRESULT ChildButton::OnPaint(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
//创建新画笔
HPEN hNewPen = CreatePen(PS_SOLID, 2, RGB(0, 0, 0));
//将新画笔选入DC中
HPEN hOldPen = (HPEN)SelectObject(hdc, hNewPen);
//设置文字背景为透明模式
SetBkMode(hdc, TRANSPARENT);
//设置文本前景色(即文本颜色),m_TxtColr为成员变量,由外界传入
SetTextColor(hdc, m_TxtColor); //按钮上的文字颜色 //获得按钮窗口大小
RECT rect;
GetClientRect(hWnd, &rect);
//获得按钮窗口上的文本
TCHAR tchar[128] = { 0 };
GetWindowText(hWnd, tchar, 128); //按钮的两种样式,按下与弹起
if (m_IsBtDown == FALSE)//弹起样式
{
//获取按钮背景颜色,
COLORREF color = m_BkColor;
HBRUSH hBrush1 = CreateSolidBrush(color);
HBRUSH hOldBrush = (HBRUSH)SelectObject(hdc, hBrush1); //画按钮边框,弹起样式为下边和左边的边框能看见,另两边就移到窗口外了 //判断是否是圆角按钮,
if (m_IsRng)
{
//是就画圆角矩形
RoundRect(hdc, -2, -2, rect.right - rect.left - 2,
rect.bottom - rect.top - 2, 20, 20);
}
else
{
//不是就画矩形
Rectangle(hdc, -2, -2, rect.right - rect.left,
rect.bottom - rect.top);
}
int n = DrawText(hdc, tchar, _tcslen(tchar), &rect,
DT_CENTER | DT_VCENTER | DT_SINGLELINE | DT_END_ELLIPSIS); SelectObject(hdc, hOldBrush);
DeleteObject(hBrush1);
}
else //按下状态样式
{
//创建以背景色+5的画刷
COLORREF color = m_BkColor + 5;
HBRUSH hBrush1 = CreateSolidBrush(color);
HBRUSH hOldBrush = (HBRUSH)SelectObject(hdc, hBrush1); //绘制边框,按下样式为上边和右边为看得见的边框,另两边一样也移动窗口外
//判断是否是圆角形状
if (m_IsRng)//是圆角
{
//画圆角矩形
RoundRect(hdc, 1, 1, rect.right - rect.left + 2,
rect.bottom - rect.top + 2, 20, 20);
}
else
{
//不是就画直角矩形
Rectangle(hdc, 1, 1, rect.right - rect.left + 2,
rect.bottom - rect.top + 2);
}
//文字矩形区域偏移,(这是向下偏移2个单位)
OffsetRect(&rect, 0, 2);
//绘制文本
DrawText(hdc, tchar, _tcslen(tchar), &rect,
DT_CENTER | DT_VCENTER | DT_SINGLELINE | DT_END_ELLIPSIS); //释放画笔,画刷等资源
SelectObject(hdc, hOldBrush);
DeleteObject(hBrush1); }
 
//释放画笔,画刷等资源 
SelectObject(hdc, hOldPen);

DeleteObject(hNewPen);
 
EndPaint(hWnd, &ps); return LRESULT(); }

基类的声明:

class MyButton
{
public:
MyButton();
public:
BOOL CreateEx(const LPCTSTR lpClssName, LPRECT lpRect, HWND hParent, UINT uID);
static LRESULT CALLBACK lpButtonProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
LRESULT ButtonProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
void SetIsDown(BOOL bol);
LRESULT DefaulMsg(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

virtual void SetRectRgn(int nWidth,int nHeight);  //设置是否为圆角按钮
virtual void SetBkColor(COLORREF cor);        //设置按钮背景色
virtual void SetTxtColor(COLORREF cor);        //设置文本颜色 public:
BOOL m_IsBtDown;
BOOL m_IsRng;
HWND m_hWnd;
WNDPROC m_lpfnOldWndproc;
RECT m_Rect;
UINT m_ID;
COLORREF m_BkColor;
COLORREF m_TxtColor;
public:
//virtual LRESULT OnCreate(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
virtual LRESULT OnPaint(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
virtual LRESULT OnLButtonUp(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
virtual LRESULT OnLButtonDown(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); };

在父窗口中调用,我创建的是对话框为主窗口,所以创建子窗口在WM_INITDIALOG消息中,如是自己创建的窗口类,

就应放在WM_CREATE消息中创建子窗口

INT_PTR OnInitDialog(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
  //我弄了好久,只能在创建前设置颜色,创建完了怎么也设置不了,
  //不知道哪没弄对,

btn = new ChildButton();
btn->SetBkColor(RGB(0, 255, 0));
btn->SetTxtColor(RGB(255, 0, 0));
RECT rect = { 10,10,120,35 };
btn->CreateEx(TEXT("Button1"), &rect, hWnd, 10001);
//btn->SetRectRgn(20,20); pBtn2 = new ChildButton();
RECT rect2 = { 10,50,120,75 };
pBtn2->CreateEx(TEXT("Button2"), &rect2, hWnd, 10002);
pBtn2->SetRectRgn(20,20); return FALSE;
}

Win32 自绘控件按钮类的更多相关文章

  1. 【C++】自绘控件基础

    由于我们对控件的功能.外观的需求,公共控件并不能很好地满足这一点,所以我们就得自绘控件. 自绘控件有许多方法,比如:处理WM_PAINT消息,设置ownDraw风格,处理WM_CTLCOLOR消息,等 ...

  2. MFC自绘控件学习总结

    前言:从这学期开始就一直在学习自绘控件(mfc),目标是做出一款播放器界面,主要是为了打好基础,因为我基础实在是很烂....说说我自己心得体会以及自绘控件的方法吧,算是吐槽吧,说的不对和不全的地方,或 ...

  3. MFC自绘控件学习总结第二贴---转

    首先感谢大家对第一帖的支持,应一些网友烈要求下面我在关于上一贴的一些补充和说明(老鸟可以无视)这一贴是实战+理论不知道第一帖的先看第一帖:http://topic.csdn.net/u/2011071 ...

  4. MFC基础,MFC自绘控件学习总结.---转

    前言:从这学期开始就一直在学习自绘控件(mfc),目标是做出一款播放器界面,主要是为了打好基础,因为我基础实在是很烂....说说我自己心得体会以及自绘控件的方法吧,算是吐槽吧,说的不对和不全的地方,或 ...

  5. MFC自绘控件学习总结第二贴

    首先感谢大家对第一帖的支持,应一些网友烈要求下面我在关于上一贴的一些补充和说明(老鸟可以无视)这一贴是实战+理论不知道第一帖的先看第一帖:http://topic.csdn.net/u/2011071 ...

  6. MFC之自绘控件

    在描绘MFC界面时,MFC自带的控件样式是绝对不满足界面的需求的. 所以我们就要在MFC自带控件基础上对控件样式进行重绘. 在采用自绘前界面样式 采用自绘后界面样式 是不是自绘控件后看起来正常了很多? ...

  7. android图片验证码--自绘控件

    自绘控件的内容都是自己绘制出来的 大致流程如下: 1.定义一个类继承view 使用TypedArray初始化属性集合 在view的构造方法中 有一个AttributeSet的参数 很明显是用来保存控件 ...

  8. 背水一战 Windows 10 (76) - 控件(控件基类): Control - 基础知识, 焦点相关, 运行时获取 ControlTemplate 和 DataTemplate 中的元素

    [源码下载] 背水一战 Windows 10 (76) - 控件(控件基类): Control - 基础知识, 焦点相关, 运行时获取 ControlTemplate 和 DataTemplate 中 ...

  9. 背水一战 Windows 10 (68) - 控件(控件基类): UIElement - Pointer 相关事件, Tap 相关事件, Key 相关事件, Focus 相关事件

    [源码下载] 背水一战 Windows 10 (68) - 控件(控件基类): UIElement - Pointer 相关事件, Tap 相关事件, Key 相关事件, Focus 相关事件 作者: ...

  10. Android 自定义View之自绘控件

    首先要提前声明一下,我对于自定义View的理解并不是很深,最近啃了几天guolin博主写的关于自定义View的博客,讲的非常棒,只不过涉及到源码和底层的一些东西,我自己就懵逼了,目前只是会了关于自定义 ...

随机推荐

  1. Java-用户登录验证案例

    用户登录验证 1.案例需求: 1.访问带有验证码的登录页面login.jsp 2.用户输入用户名,密码以及验证码 * 如果用户名和密码输入有误,跳转登录页面,提示:用户名或密码错误 * 如果验证码输入 ...

  2. 安卓app产品:应用分析工具

    这是我独立开发的一款工具类安卓app(名称:应用分析工具),其主要功能是:(Solo 社区投稿) 1.基础信息查看 - 可查看app的包名.签名.权限.版本信息.AndroidManifest.xml ...

  3. 【算法】用c#实现计算方法中的经典降幂优化策略,减少计算复杂度

    对于给定的数组[x1,x2,x3,-,xn],计算幂的累积:x1^(x2^(x3^(-^xn))的最后一位(十进制)数字. 例如,对于数组[3,4,2],您的代码应该返回1,因为3^(4^2)=3^1 ...

  4. [oeasy]python0110 屏幕点阵字体_3x5_5x7_雅达利字库

    动视 桥牌 想用 7 x 5 描述黑红梅方 还是比较难的     ​   添加图片注释,不超过 140 字(可选)   而且最下面的动视logo是 修改后的字体 还挺有动感   这个时代 图像库 和 ...

  5. AT_abc218_d 题解

    洛谷链接&Atcoder 本篇题解为此题较简单做法及较少码量,并且码风优良,请放心阅读. 题目简述 给定一个平面内的 \(N\) 个点的坐标,求这 \(N\) 个点中选 \(4\) 个点可构成 ...

  6. TIER 1: Responder

    TIER 1: Responder Active Directory Active Directory(AD)是由微软开发的目录服务,用于在网络环境中管理和组织用户.计算机.应用程序和其他资源.它是 ...

  7. [UE源码] 关于使用UE待改进的一些尝试

    UE从自己做了一款游戏后,发现了蓝图以及UE引擎本身的一些优缺点: 1.蓝图在一些简单的逻辑上书写方便,直观,而且编译速度快,但是也有一些其他问题: 结构体赋值后,无法二次修改 只有3种容器Array ...

  8. 自己在本地搭建 git 版本仓库服务器

    请确保你安装了 git 的图形化工具和 git 软件 首先先创建一个目录作为你的项目工程目录,比如 e:/gitTest 其次右键 git init. 然后指定一个 git 服务器目录,例如:e:/g ...

  9. Dubbo日志链路追踪TraceId选型

    一.目的 开发排查系统问题用得最多的手段就是查看系统日志,但是在分布式环境下使用日志定位问题还是比较麻烦,需要借助 全链路追踪ID 把上下文串联起来,本文主要分享基于 Spring Boot + Du ...

  10. ansible 部署hadoop

    规划 ansible 节点 ansible controller 镜像rhel 8.2 镜像ansible hadoop 集群 master slave1 slave2 镜像centos 1810 0 ...