MFC第十四天 BS_按钮属性与CButton类功能简介 、静态文本的穿透属性与显示密码开发、CS架构客户端的账号管理功能添加功能开发

这篇具有很好参考价值的文章主要介绍了MFC第十四天 BS_按钮属性与CButton类功能简介 、静态文本的穿透属性与显示密码开发、CS架构客户端的账号管理功能添加功能开发。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

BS_按钮属性与CButton类功能简介

CButton类功能简介

class CButton : public CWnd
{
public:
	CButton();
	virtual BOOL Create(LPCTSTR lpszCaption, DWORD dwStyle,
	const RECT& rect, CWnd* pParentWnd, UINT nID);

	HICON SetIcon(HICON hIcon); //需要配合的尺寸
	HICON GetIcon() const; 
	HBITMAP SetBitmap(HBITMAP hBitmap); 位图句柄
	HBITMAP GetBitmap() const;
	HCURSOR SetCursor(HCURSOR hCursor); 无效成员
	HCURSOR GetCursor();

// Attributes
	UINT GetState() const; 
	void SetState(BOOL bHighlight);
	int GetCheck() const; //对于单选和复选控件是有效的
	void SetCheck(int nCheck);
	UINT GetButtonStyle() const;
	void SetButtonStyle(UINT nStyle, BOOL bRedraw = TRUE); 无效函数

// Overridables (for owner draw only)
	virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct); 自绘

// Implementation
public:
	virtual ~CButton();
protected:
	virtual BOOL OnChildNotify(UINT, WPARAM, LPARAM, LRESULT*);
};

Button Control Styles —BS_按钮属性

CButton类简介:
a)CButton在VC6.0等早期版本,必须设置BS_BITMAP或BS_ICON才能设置图标(文字加图)。
b)近期VS版本即使不设置这两种属性,也直接可以设置文字加图的模式;
c)近期VS版本如果设置以上两种属性,则不显示文字只显示图;

ComboBox 有3种形式,原始组合,下拉代表编辑,下拉不带编辑。
Button有好几种:按钮,(自动)打勾,(自动)单选,分组框

#define BS_PUSHBUTTON       0x00000000L 0代表没有属性(默认就是按钮)
#define BS_DEFPUSHBUTTON    0x00000001L 1代表默认
#define BS_CHECKBOX         0x00000002L 点击之后需要代码来SetCheck才打勾
#define BS_AUTOCHECKBOX     0x00000003L  点击之后直接打勾和去掉打勾(无需代码)
#define BS_RADIOBUTTON      0x00000004L  单选按钮(必须有组)
#define BS_AUTORADIOBUTTON  0x00000009L 自动单选(必须分组)

#define BS_3STATE           0x00000005L
#define BS_AUTO3STATE       0x00000006L
#define BS_GROUPBOX         0x00000007L 分组控件
#define BS_USERBUTTON       0x00000008L

#define BS_PUSHBOX          0x0000000AL
#define BS_OWNERDRAW        0x0000000BL 自绘(做彩色贴图的按钮)
#define BS_TYPEMASK         0x0000000FL
#define BS_LEFTTEXT         0x00000020L

#if(WINVER >= 0x0400)
#define BS_TEXT             0x00000000L  0代表默认是文字
#define BS_ICON             0x00000040L 图标(.ico)
#define BS_BITMAP           0x00000080L 位图(.bmp)
#define BS_LEFT             0x00000100L
#define BS_RIGHT            0x00000200L
#define BS_CENTER           0x00000300L
#define BS_TOP              0x00000400L
#define BS_BOTTOM           0x00000800L
#define BS_VCENTER          0x00000C00L
#define BS_PUSHLIKE         0x00001000L
#define BS_MULTILINE        0x00002000L
#define BS_NOTIFY           0x00004000L
#define BS_FLAT             0x00008000L
#define BS_RIGHTBUTTON      BS_LEFTTEXT
#endif /* WINVER >= 0x0400 */

静态文本的穿透属性与显示密码开发

但凡你想接收全面的基础消息(控件内的基础消息),你就得去做一个派生类并且用子类化实现对派生类的消息转移。

1、派生类 CEeyCtrl.h

#pragma once
class CLoginDlg;  //提前声明,假包含
class CEyeCtrl : public CWnd
{
	DECLARE_DYNAMIC(CEyeCtrl)
		CLoginDlg* m_pDlg {};  //引用父类窗口
public:
	CEyeCtrl();
	virtual ~CEyeCtrl();
protected:
	DECLARE_MESSAGE_MAP()
public:
	afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
	afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
};

2.派生类 CEeyCtrl.cpp

#include "pch.h"
#include "CLientXq.h"
#include "CEyeCtrl.h"
#include "CLoginDlg.h"
// CEyeCtrl 消息处理程序
void CEyeCtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
	m_pDlg->OnClickDown();
	CWnd::OnLButtonDown(nFlags, point);
}
void CEyeCtrl::OnLButtonUp(UINT nFlags, CPoint point)
{
	m_pDlg->OnClickUp(); // 别人点击了你, 你告诉你的父亲
	CWnd::OnLButtonUp(nFlags, point);
}

3.父窗口 CLoginDlg.h

#pragma once
#include "afxdialogex.h"
#include"CEyeCtrl.h"
class CLoginDlg : public CDialogEx
{
	DECLARE_DYNAMIC(CLoginDlg)
	CEyeCtrl m_eye;
public:
	CLoginDlg(CWnd* pParent = nullptr);   // 标准构造函数
	virtual ~CLoginDlg();
public:
	afx_msg void OnBnClickedOk();
	virtual BOOL OnInitDialog();
	
	void OnClickDown();
	void OnClickUp(); //用来代替穿透的消息
	//afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
	//afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
};

4.父窗口 CLoginDlg.cpp

BOOL CLoginDlg::OnInitDialog(){
	m_eye.m_pDlg = this;	
	CDialogEx::OnInitDialog(); 
	return TRUE;  // return TRUE unless you set the focus to a control 
}
void CLoginDlg::OnClickDown()  {       //父窗口找底下的去干活
	auto pEdit = reinterpret_cast<CEdit*>(GetDlgItem(IDC_PASS));
	pEdit->SetPasswordChar(0);
	pEdit->RedrawWindow();
}
void CLoginDlg::OnClickUp(){
	auto pEdit = reinterpret_cast<CEdit*>(GetDlgItem(IDC_PASS));
	pEdit->SetPasswordChar(_T('●'));
	pEdit->RedrawWindow();
}

CS架构客户端的账号管理功能添加和密码修改(员工)功能开发

CS架构客户端的账号管理功能添加功能

检查用户和刷新功能函数

BOOL CAdminDlg::CheckUser(CString sName,SAdmin& a)
{
	int nCmd = AD_CHECK;
	_bstr_t bstr = sName;
	LPCSTR p = bstr;

	m_sock.Send(&nCmd, sizeof(nCmd));
	m_sock.Send(p, (int)sizeof(p));

	int nCount = 0;
	if (m_sock.Receive(&nCount, sizeof(nCount)) != sizeof(nCount))
	{
		AfxMessageBox(_T("网络中断"));
		return FALSE;
	}
	bool b = nCount > 0;
	if(b)
	{
		if (m_sock.Receive(&a, sizeof(a)) != sizeof(a))
		{
			AfxMessageBox(_T("网络中断"));
			return FALSE;
		}
	}
	return b;
}

void CAdminDlg::Refresh()
{
	int nCmd = AD_PRINT;
	int nCount = 0;
	m_sock.Send(&nCmd, sizeof(nCmd));
	if (m_sock.Receive(&nCount, sizeof(nCount))!=sizeof(nCount))
	{
		AfxMessageBox(_T("网络中断"));
		return;
	}
	SAdmin a;
	 
	m_list.DeleteAllItems();
	int i = 0;
	while (nCount-->0)
	{
		if (m_sock.Receive(&a, sizeof(a)) != sizeof(a))
		{
			AfxMessageBox(_T("网络中断"));
			break;
		}
		m_list.InsertItem(i, _bstr_t(a.sName));
		m_list.SetItemText(i, 1, _bstr_t(a.sPass));
		m_list.SetItemText(i, 2, a.nPrior ? _T("普通") : _T("高级"));
		++i;
	}
}

添加功能函数体

void CAdminDlg::OnBnClickedAdd(){
	SAdmin a;
	int nCmd = AD_INPUT;
	CString str;
	GetDlgItemText(IDC_NAEM, str);
	
	if (CheckUser(str, a))	
	{
		CString str = CString(a.sName) + _T(",") + a.sPass + _T(",") + (a.nPrior ? _T("普通") : _T("高级"));
		AfxMessageBox(_T("账号已经存在"));
		return;		
		}
		
	strcpy_s(a.sName, sizeof(a.sName), (_bstr_t)str);
	GetDlgItemText(IDC_PASS, str);
	strcpy_s(a.sPass, sizeof(a.sPass), (_bstr_t)str);
	a.nPrior = m_combox.GetCurSel();

	m_sock.Send(&nCmd, sizeof(nCmd));
	m_sock.Send(&a, sizeof(a));
	Refresh();
}

对应添加功能的服务端代码

bool CAdmin::Input(CSockLx* pSocka){
	SAdmin a;
	if (pSocka->Receive(&a, sizeof(a)) != sizeof(a))
		return false;
	char sSQL[256];
	_snprintf(sSQL, sizeof(sSQL), "INSERT INTO t_admin  VALUES('%s','%s','%d')", a.sName, a.sPass, a.nPrior);
	
	int n = mysql_query(&m_sql, sSQL);
	if (n)	{
		CManager::PrintError(sSQL);//WriteLog
		return false;
	}
	return true;
}

CS架构客户端的账号管理功能中密码修改(员工)功能开发

BOOL CPassDlg::ChangePass(CString sNew)
{
	SAdmin a;
	strcpy_s(a.sName, sizeof(a.sName), _bstr_t(theApp.m_sName));
	strcpy_s(a.sPass, sizeof(a.sPass), _bstr_t(sNew));
	int nCmd = AD_CHPASS;
	m_sock.Send(&nCmd, sizeof(nCmd));
	m_sock.Send(&a, sizeof(a));
	int nRes = 0;
	if (m_sock.Receive(&nRes, sizeof(nRes)) != sizeof(nRes))
	{
		AfxMessageBox(_T("网络中断!"));
		return FALSE;
	}
	if (nRes > 0)
	{
		AfxMessageBox(CString(a.sName) + _T(" 密码修改成功!"));
		theApp.m_sPass = sNew;
	}
	else
		AfxMessageBox(CString(a.sName) + _T(" 密码修改失败!"));	
	return TRUE;
}

void CPassDlg::OnBnClickedOk()
{
	CString sOld, sNew, sConf;
	GetDlgItemText(IDC_OLDPASS, sOld);
	if (sOld.IsEmpty())
	{
		AfxMessageBox(_T("旧密码不能为空!"), MB_ICONERROR);
		SetFocus();
		return;
	}
	if (sOld != theApp.m_sPass)
	{
		AfxMessageBox(_T("旧密码错误!"), MB_ICONERROR);
		SetFocus();
		return;
	}
	GetDlgItemText(IDC_NEWPASS, sNew);
	if (sNew.IsEmpty())
	{
		AfxMessageBox(_T("新密码不能为空!"), MB_ICONERROR);
		GetDlgItem(IDC_NEWPASS)->SetFocus();
		return;
	}
	GetDlgItemText(IDC_CONFPASS, sConf);
	if (sConf != sNew)
	{
		AfxMessageBox(_T("新密码和确认不一致!"), MB_ICONERROR);
		GetDlgItem(IDC_CONFPASS)->SetFocus();
		return;
	}
	if (ChangePass(sNew))
	{
		EndDialog(IDOK);
		MessageBox(_T("密码修改成功!"), _T("提示"), MB_ICONINFORMATION);

	}
	else
		MessageBox(_T("密码修改失败!"), _T("提示"), MB_ICONINFORMATION);	
	//CDialogEx::OnOK();
}

密码修改服务端代码文章来源地址https://www.toymoban.com/news/detail-570969.html

bool CAdmin::ChangePass(CSockLx* pSocka){
	SAdmin a;
	if(pSocka ->Receive(&a,sizeof(a))<sizeof(a))
		return false;
	string sSQL = "UPDATE t_admin SET f_pass = '" + string(a.sPass) +
		"' WHERE f_name='" + a.sName + "'";
	int n = mysql_query(&m_sql, sSQL.c_str());
	if (n)	{
		CManager::PrintError(sSQL.c_str());//WriteLog
		return false;
	}
	n = (int)mysql_affected_rows(&m_sql);
	pSocka->Send(&n, sizeof(n));
	return true;
}

到了这里,关于MFC第十四天 BS_按钮属性与CButton类功能简介 、静态文本的穿透属性与显示密码开发、CS架构客户端的账号管理功能添加功能开发的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 第四十四天打卡

    零钱兑换 II 中等 1K 相关企业 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带符号

    2024年02月03日
    浏览(49)
  • 学习Android的第十四天

    目录 Android DatePicker 日期选择器 DatePicker 属性 和 事件 DatePicker 事件 获得 DatePicker 的值 Android TimePicker 时间选择器 TimePicker 属性 TimePicker 事件 获得 TimePicker 的值 Android CalendarView 日历视图 CalendarView 属性 CalendarView 事件 获得 CalendarView 的值 在Android中,DatePicker是一个用户界面组件

    2024年02月21日
    浏览(49)
  • 【力扣刷题 | 第二十四天】

    目录 前言: 1049. 最后一块石头的重量 II - 力扣(LeetCode) 494. 目标和 - 力扣(LeetCode) 总结:                  今天我们依然暴打动态规划 有一堆石头,用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合,从中选出任意两块石头,然后将它们一起粉

    2024年02月14日
    浏览(38)
  • 算法练习第六十四天

    LCR 184. 设计自助结算系统 - 力扣(LeetCode) 总结:利用一个双端维护队列一个往后递减的队列,对头是最大值,每次进入一个新值时就一直和队尾元素比较将比新的值小的数排出,这样能保证留在队列中的数都是会对最大值产生影响的数,而当主队列中将要排出的数与双端队

    2024年02月07日
    浏览(58)
  • 学习c#的第二十四天

    目录 C# 事件(Event) 事件概述 如何订阅和取消订阅事件 以编程方式订阅事件 使用匿名函数订阅事件 取消订阅 如何发布符合 .NET 准则的事件 发布基于 EventHandler 模式的事件 如何在派生类中引发基类事件 如何实现接口事件 如何实现自定义事件访问器 示例 事件(Event) 基本

    2024年02月04日
    浏览(40)
  • 十四天学会C++之第五天:类的详细讨论

    什么是友元函数和友元类,它们的作用。 如何声明和使用友元函数和友元类,访问类的私有成员。 友元函数(Friend Functions) 友元函数是一种特殊的函数,它被允许访问类的私有成员。这意味着即使成员是私有的,友元函数也能够直接访问它们,而不需要通过公有接口。这提

    2024年02月07日
    浏览(45)
  • 十四天学会C++之第一天(入门和基本语法)

    C++诞生于20世纪80年代初,它的创造者是计算机科学家Bjarne Stroustrup。当时,Stroustrup在贝尔实验室工作,他希望为C语言添加一些功能,以便更好地支持系统开发。这个愿望促使他创建了C++。 C++的名字来源于它的基因,其中的\\\"C\\\"代表了C语言,而\\\"++\\\"表示C语言的一个增强版本。这

    2024年02月07日
    浏览(52)
  • 蓝桥杯十四天冲刺班 第十四天《考场经验 | 历年考点 | 蓝桥杯押题》《C,JAVA,PY在蓝桥杯中必须要会用的容器 | 集合》(3K+字解析)

     📒博客首页:Sonesang的博客 🎉欢迎关注🔎点赞👍收藏⭐️留言📝 ❤️ :热爱Java与算法学习,期待一起交流! 🙏作者水平很有限,如果发现错误,求告知,多谢! 🌺有问题可私信交流!!!   目录 算法 实力 = 知识点+刷题量+速度+灵活的大脑 C++组知识点 java组知识点

    2023年04月15日
    浏览(42)
  • Python学习笔记第六十四天(Matplotlib 网格线)

    我们可以使用 pyplot 中的 grid() 方法来设置图表中的网格线。 grid() 方法语法格式如下: 参数说明: b:可选,默认为 None,可以设置布尔值,true 为显示网格线,false 为不显示,如果设置 **kwargs 参数,则值为 true。 which:可选,可选值有 ‘major’、‘minor’ 和 ‘both’,默认为

    2024年02月12日
    浏览(44)
  • 第五十四天学习记录:C语言进阶:动态内存管理Ⅱ

    1、对NULL指针的解引用操作 2、对动态开辟的内存的越界访问 3、对非动态开辟内存的free 4、使用free释放动态开辟内存的一部分 5、对同一块动态内存多次释放 6、动态开辟内存忘记释放(内存泄漏) 问:realloc的第一个参数的指针地址必须是malloc或calloc创建的在堆上的地址吗?

    2024年02月06日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包