MFC第十三天 CWND类 开发登录界面密码眼睛的设置


一、CWND类

CWnd类是所有窗口类的基类:
a)所有的窗口和控件类都由CWnd类派生。
b)CWnd类中包含了核心句柄:HWND m_hWnd。
c)所有重要操作都围绕核心句柄执行,比如:MoveWindow(m_hWnd,…
e)CWnd类的派生类包括:
CDialog:对话框类
控件类:CStatic、CEdit、CRichEdit、CListCtrl、CComboBox、CListBox、CTreeCtrl、CDateTimeCtrl…
CFrameWnd和CView类:框架与视图
控制栏:CToolBar,CStatusBar

CWnd::Create和CreateEx函数:
a)我们平时拖入到对话框资源中的控件实际上最终都由CWnd::Create和CreateEx来执行。
b)查看.res文件,只不过是图纸,不是大厦。
c)经常有些属性,使用ModifyStyle和ModifyStyleEx我们无法修改,
就采用Create和CreateEx来从新创建 ,先执行DestroyWindow。

void CTestDlg::CreateCtrls()
{
	auto pFont = GetFont();
	m_stNumb.Create(_T("STAtic"), _T("工号(&N):"), WS_CHILD | WS_VISIBLE,
		CRect(7 * 2, 7 * 2, 32 *2, 15 * 2), this, IDC_STATIC);
	m_stNumb.SetFont(pFont,FALSE);
	m_edNumb.CreateEx(WS_EX_CLIENTEDGE,_T("EDIT"), _T(""), WS_CHILD | WS_VISIBLE |WS_TABSTOP|ES_AUTOHSCROLL,
		CRect(35 * 2, 7 * 2, 69 * 2, 16 * 2), this, IDC_NUMB);
	m_edNumb.SetFont(pFont, FALSE);
	m_list.Create(_T("SysListView32"), NULL, WS_CHILD | WS_VISIBLE
		| LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP,
		CRect(7 * 2, 36 * 2, 412 * 2, 230 * 2), this, IDC_LIST);
	//m_edNumb.ModifyStyleEx(0, WS_EX_CLIENTEDGE); 有时候好使
}
BOOL CTestDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();
	CreateCtrls();
	CListCtrl* pList = (CListCtrl*)&m_list;
	pList->InsertColumn(0, _T("工号"), 0, 100);
	pList->InsertColumn(1, _T("姓名"), 0, 100);
	pList->InsertColumn(2, _T("工资"), 0, 100);
	pList->InsertColumn(3, _T("日期"), 0, 100);
	pList->ModifyStyle(0, LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS);

	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

CWnd::SetWindowPos函数简介:

a)这个函数包含了MoveWindow的功能,
BOOL SetWindowPos( const CWnd* pWndInsertAfter, int x, int y, int cx, int cy, UINT nFlags );
b)除了平面设置窗口位置(x,y方向),还有Z轴方向(从屏幕到眼睛的方向)。
c)第一个参数带入:wndTopMost 和wndNoTopMost .代表置顶和取消置顶。
d)最后一个参数指定哪个方向参加变化:nFlags
SWP_NOMOVE:x,y无效,你随便带入任何数据保持左上角不动,否则左上角根据带入的数据变化。
SWP_NOSIZE :cx,cy无效,你随便带入任何数据保持高宽不动,否则高宽根据带入的数据变化。
SWP_NOZORDER :第一个参数无效。

if(GetExStyle() & WS_EX_TOPMOST)
	this->SetWindowPos(&wndNoTopMost, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
else
	this->SetWindowPos(&wndTopMost, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);

二、开发登录界面密码眼睛的设置

1.reinterpret_cast

reinterpret_cast是C++的一种类型转换运算符,用于在不同的指针类型之间进行转换。
它可以将一个指针类型转换为与之无关的另一种指针类型,或将指针转换为整数类型,反之亦然
在MFC中,reinterpret_cast可能用于以下情况:

  1. 在处理消息映射时,可以使用reinterpret_cast将消息参数转换为特定的消息结构体类型。
    例如,当处理WM_LBUTTONDOWN消息时,可以使用reinterpret_cast将LPARAM参数转换为一个指向CPoint结构体的指针,以便获取鼠标点击的坐标。
  2. 当需要将一个指针类型转换为另一种不相关的指针类型时,可以使用reinterpret_cast。
    这通常在低级编程或涉及底层内存操作时使用。
    然而,需要注意的是,reinterpret_cast是一种强制类型转换,会绕过类型系统的安全检查。
    因此,在使用reinterpret_cast时要非常小心,并确保转换是合法和安全的。
    错误的使用reinterpret_cast可能会导致未定义的行为和程序错误。

2.更新显示

使用reinterpret_cast将IDC_PASS对应的控件指针转换为CEdit类型的指针。
然后,通过判断密码输入框的密码字符是否为空来确定当前的显示方式。如果密码字符不为空,则将密码字符设置为0,即不显示密码字符;如果密码字符为空,则将密码字符设置为_T(‘●’),即显示为圆点或其他字符。

最后,调用RedrawWindow方法重新绘制密码输入框,以确保显示效果更新。

void CLoginDlg::OnBnClickedEye()
{
	auto pEdit = reinterpret_cast<CEdit*>(GetDlgItem(IDC_PASS));

	if (pEdit->GetPasswordChar())
		pEdit->SetPasswordChar(0);
	else
		pEdit->SetPasswordChar(_T('●'));
	pEdit->RedrawWindow();	
}

RedrawWindow

RedrawWindow 是一个在MFC中用于重绘窗口的函数。它可以用来强制窗口重绘,以更新窗口的外观和内容。

RedrawWindow 函数的原型如下:

BOOL RedrawWindow(
  HWND hWnd,
  const RECT *lprcUpdate,
  HRGN hrgnUpdate,
  UINT flags
);

参数说明:

  • hWnd:需要重绘的窗口的句柄。
  • lprcUpdate:一个指向 RECT 结构的指针,指定了需要更新的客户区域。如果为 NULL,则整个客户区域将被更新。
  • hrgnUpdate:一个用于更新的区域句柄。如果为 NULL,则根据 lprcUpdate 指定的区域进行更新。
  • flags:一组标志,用于指定重绘的行为,可以是下列值的组合:
    • RDW_INVALIDATE:使窗口的区域无效,并请求重绘。
    • RDW_ERASE:擦除窗口的背景。
    • RDW_UPDATENOW:立即重绘窗口,而不等待下一个绘画周期。
    • RDW_FRAME:重绘窗口的边框。
    • RDW_ALLCHILDREN:重绘窗口及其所有子窗口。

下面是一个示例代码,展示了如何使用 RedrawWindow 函数:

CMyWnd myWnd;

// 使整个客户区域无效,并请求重绘
myWnd.RedrawWindow();

// 仅重绘指定的矩形区域
RECT rectUpdate = {10, 10, 100, 100};
myWnd.RedrawWindow(&rectUpdate);

// 使用指定的区域句柄进行更新
HRGN hrgnUpdate = CreateRectRgn(10, 10, 100, 100);
myWnd.RedrawWindow(NULL, hrgnUpdate);

// 结合多个标志进行重绘
myWnd.RedrawWindow(NULL, NULL, RDW_INVALIDATE | RDW_ERASE);

在这个示例中,我们创建了一个名为 myWnd 的窗口对象,并使用 RedrawWindow 函数进行重绘。我们可以选择传递不同的参数来控制重绘的行为,例如指定一个矩形区域进行更新,或使用区域句柄来进行更新。还可以通过组合不同的标志来实现更精细的重绘控制。

请注意,RedrawWindow 函数可以用于任何窗口,包括主窗口、对话框、控件等。但需要注意在何时调用该函数以避免不必要的重绘和性能问题。

附录

1、再次强调注册表和配置文件:
a)CWinApp::SetRegistryKey设置执行之后,今后CWinApp::WriteProfileXX就执行Reg相关API;
b)否则不执行SetRegistryKey,theApp.m_pszRegistryKey指针是NULL。
这种情况下调用CWinApp::WriteProfileXX就执行GetPrivateProfileXXX的API。
c)一种是数据存在注册表里,一种是数据存在.ini文件里。如果没有指定路径,就到windows下去找。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jcrry

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值