VS2010,Edit contrl控件,为编辑框/文本框添加提示字

Villra 2018-01-07 04:41:26
就是那种鼠标放到文本框里时,无文字显示,离开时显示显示默认文字。
(例如QQ登录时文本框内的“用户名”“密码”一类,不影响输入的提示字)

我查到的解决方案,
为Edit控件添加两个事件:
ON_EN_SETFOCUS(获得焦点)
ON_EN_KILLFOCUS(丢失焦点)

为控件添加完事件之后,在事件操作空间添加文字设置即可。

代码:
void CATCmdTestDlg::OnEnKillfocusEtCmdParam()
{
// 鼠标离开对话框时,显示默认提示
met_cmdParam.SetWindowTextW(_T(” 命令参数,若不设定,则使用默认参数”));
}

void CATCmdTestDlg::OnEnSetfocusEtCmdParam()
{
// 鼠标聚焦到对话框时,默认显示消失
met_cmdParam.SetWindowTextW(_T(“”));
}

(出自http://blog.csdn.net/kekeleqy/article/details/52514085)

也确实做出了效果,但还是有问题:
在编译出的界面上一开始是都没有提示字的,当点击其他对话框后,才能显示出来

我想要的效果是 编译出来就带有提示字,当点击该对话框时文字消失。
问:我该怎么改进?
...全文
2134 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
shen_wei 2018-10-18
  • 打赏
  • 举报
回复
BOOL SetCueBanner(
LPCWSTR lpszText
);
BOOL SetCueBanner(
LPCWSTR lpszText,
BOOL fDrawWhenFocused = FALSE
);
BlueOc 2018-10-18
  • 打赏
  • 举报
回复
对话框初始化时SetWindowText提示信息,在文本框获取焦点后清除提示信息。焦点离开后判断文本框是否有值,若没有则继续SetWindowText提示信息
正经的董同学 2018-09-18
  • 打赏
  • 举报
回复
CEdit::SetCueBanner
Huai-yu 2018-03-08
  • 打赏
  • 举报
回复
引用 4 楼 chengbar 的回复:
#pragma once


// CSymbolEdit

class CSymbolEdit : public CEdit
{
	DECLARE_DYNAMIC(CSymbolEdit)

   CFont m_fontPrompt;
   HICON m_hSymbolIcon;
   bool m_bInternalIcon;
   CString m_strPromptText;
   COLORREF m_colorPromptText;

   void DestroyIcon();

public:
	CSymbolEdit();
	virtual ~CSymbolEdit();

   void SetSymbolIcon(HICON hIcon, BOOL redraw = TRUE);
   void SetSymbolIcon(UINT id, BOOL redraw = TRUE);

   void SetPromptText(CString text, BOOL redraw = TRUE);
   void SetPromptText(LPCTSTR szText, BOOL redraw = TRUE);

   void SetPromptTextColor(COLORREF color, BOOL redraw = TRUE);

   void SetPromptFont(CFont& font, BOOL redraw = TRUE);
   void SetPromptFont(const LOGFONT* lpLogFont, BOOL redraw = TRUE);

protected:
   void RecalcLayout();
   virtual void PreSubclassWindow();

   afx_msg void OnSize(UINT nType, int cx, int cy);
   afx_msg LRESULT OnSetFont(WPARAM wParam, LPARAM lParam);

	DECLARE_MESSAGE_MAP()

public:
   afx_msg void OnPaint();
};
#include "stdafx.h"
#include "SymbolEdit.h"

// CSymbolEdit

IMPLEMENT_DYNAMIC(CSymbolEdit, CEdit)

CSymbolEdit::CSymbolEdit():
m_hSymbolIcon(NULL),
m_bInternalIcon(false),
m_colorPromptText(RGB(127,127,127))
{
	m_fontPrompt.CreateFont(
		16,                        // nHeight
		0,                         // nWidth
		0,                         // nEscapement
		0,                         // nOrientation
		FW_NORMAL,                 // nWeight
		TRUE,                      // bItalic
		FALSE,                     // bUnderline
		0,                         // cStrikeOut
		DEFAULT_CHARSET,           // nCharSet
		OUT_DEFAULT_PRECIS,        // nOutPrecision
		CLIP_DEFAULT_PRECIS,       // nClipPrecision
		DEFAULT_QUALITY,           // nQuality
		DEFAULT_PITCH | FF_SWISS,  // nPitchAndFamily
		_T("Calibri"));
}

CSymbolEdit::~CSymbolEdit()
{
	DestroyIcon();
}


BEGIN_MESSAGE_MAP(CSymbolEdit, CEdit)
	ON_WM_PAINT()
	ON_MESSAGE(WM_SETFONT, OnSetFont)
END_MESSAGE_MAP()

void CSymbolEdit::DestroyIcon()
{
	// if icon was loaded internally, destroy it
	if(m_bInternalIcon || m_hSymbolIcon != NULL)
		::DestroyIcon(m_hSymbolIcon);
}

void CSymbolEdit::PreSubclassWindow() 
{
	RecalcLayout();
}

void CSymbolEdit::SetSymbolIcon(HICON hIcon, BOOL redraw)
{
	DestroyIcon();

	m_hSymbolIcon = hIcon;

	// icon was not loaded internally
	m_bInternalIcon = false;

	RecalcLayout();

	if(redraw)
		Invalidate(TRUE);
}

void CSymbolEdit::SetSymbolIcon(UINT id, BOOL redraw)
{
	DestroyIcon();

	m_hSymbolIcon = (HICON)::LoadImage(
		AfxGetResourceHandle(),
		MAKEINTRESOURCE(id),
		IMAGE_ICON,
		16,
		16,
		LR_DEFAULTCOLOR|LR_LOADTRANSPARENT);

	ASSERT(m_hSymbolIcon != NULL);

	// icon was loaded internally
	m_bInternalIcon = true;

	RecalcLayout();

	if(redraw)
		Invalidate(TRUE);
}

void CSymbolEdit::SetPromptText(CString text, BOOL redraw)
{
	m_strPromptText = text;

	if(redraw)
		Invalidate(TRUE);
}

void CSymbolEdit::SetPromptText(LPCTSTR szText, BOOL redraw)
{
	m_strPromptText = szText;

	if(redraw)
		Invalidate(TRUE);
}

void CSymbolEdit::SetPromptTextColor(COLORREF color, BOOL redraw)
{
	m_colorPromptText = color;

	if(redraw)
		Invalidate(TRUE);
}

void CSymbolEdit::SetPromptFont(CFont& font, BOOL redraw)
{
	LOGFONT lf;
	memset(&lf, 0, sizeof(LOGFONT));

	font.GetLogFont(&lf);
	SetPromptFont(&lf);

	if(redraw)
		Invalidate(TRUE);
}

void CSymbolEdit::SetPromptFont(const LOGFONT* lpLogFont, BOOL redraw)
{
	m_fontPrompt.DeleteObject();	
	m_fontPrompt.CreateFontIndirect(lpLogFont);

	if(redraw)
		Invalidate(TRUE);
}

void CSymbolEdit::RecalcLayout()
{
	int width = GetSystemMetrics( SM_CXSMICON );

	if(m_hSymbolIcon)
	{
		DWORD dwMargins = GetMargins();
		SetMargins(LOWORD(dwMargins), width + 6);
	}
}

// CSymbolEdit message handlers

void CSymbolEdit::OnPaint()
{
	CPaintDC dc(this);

	CRect rect;
	GetClientRect( &rect );

	// Clearing the background
	dc.FillSolidRect( rect, GetSysColor(COLOR_WINDOW) );

	DWORD dwMargins = GetMargins();

	if( m_hSymbolIcon )
	{
		// Drawing the icon
		int width = GetSystemMetrics( SM_CXSMICON );
		int height = GetSystemMetrics( SM_CYSMICON );

		::DrawIconEx( 
			dc.m_hDC, 
			rect.right - width - 1, 
			1,
			m_hSymbolIcon, 
			width, 
			height, 
			0, 
			NULL, 
			DI_NORMAL);

		rect.left += LOWORD(dwMargins) + 1;
		rect.right -= (width + 7);
	}
	else
	{
		rect.left += (LOWORD(dwMargins) + 1);
		rect.right -= (HIWORD(dwMargins) + 1);
	}

	CString text;
	GetWindowText(text);
	CFont* oldFont = NULL;

    rect.top += 1;

	if(text.GetLength() == 0)
	{		
		if(this != GetFocus() && m_strPromptText.GetLength() > 0)
		{
			oldFont = dc.SelectObject(&m_fontPrompt);
			COLORREF color = dc.GetTextColor();
			dc.SetTextColor(m_colorPromptText);
			dc.DrawText(m_strPromptText, rect, DT_LEFT|DT_SINGLELINE|DT_EDITCONTROL);
			dc.SetTextColor(color);
			dc.SelectObject(oldFont);
		}
	}
	else
	{
		oldFont = dc.SelectObject(GetFont());
		dc.DrawText(text, rect, DT_SINGLELINE|DT_INTERNAL|DT_EDITCONTROL);
		dc.SelectObject(oldFont);
	}
}

void CSymbolEdit::OnSize(UINT nType, int cx, int cy)
{
	CEdit::OnSize(nType, cx, cy);

	RecalcLayout();
}

LRESULT CSymbolEdit::OnSetFont(WPARAM wParam, LPARAM lParam)
{
	DefWindowProc(WM_SETFONT, wParam, lParam);

	RecalcLayout();

	return 0;
}
[/quote [quote=引用 5 楼 zhao4zhong1 的回复:] sevancheng
这个方法,我试了,unicode确实可以,但是ANSI好像有问题,很费解
Huai-yu 2018-03-08
  • 打赏
  • 举报
回复
引用 2 楼 zgl7903 的回复:
CEdit::SetCueBanner
这个是MFC类库提供的,可惜对应ANSI的版本已经弃用
赵4老师 2018-01-10
  • 打赏
  • 举报
回复
sevancheng
sevancheng 2018-01-09
  • 打赏
  • 举报
回复
#pragma once


// CSymbolEdit

class CSymbolEdit : public CEdit
{
	DECLARE_DYNAMIC(CSymbolEdit)

   CFont m_fontPrompt;
   HICON m_hSymbolIcon;
   bool m_bInternalIcon;
   CString m_strPromptText;
   COLORREF m_colorPromptText;

   void DestroyIcon();

public:
	CSymbolEdit();
	virtual ~CSymbolEdit();

   void SetSymbolIcon(HICON hIcon, BOOL redraw = TRUE);
   void SetSymbolIcon(UINT id, BOOL redraw = TRUE);

   void SetPromptText(CString text, BOOL redraw = TRUE);
   void SetPromptText(LPCTSTR szText, BOOL redraw = TRUE);

   void SetPromptTextColor(COLORREF color, BOOL redraw = TRUE);

   void SetPromptFont(CFont& font, BOOL redraw = TRUE);
   void SetPromptFont(const LOGFONT* lpLogFont, BOOL redraw = TRUE);

protected:
   void RecalcLayout();
   virtual void PreSubclassWindow();

   afx_msg void OnSize(UINT nType, int cx, int cy);
   afx_msg LRESULT OnSetFont(WPARAM wParam, LPARAM lParam);

	DECLARE_MESSAGE_MAP()

public:
   afx_msg void OnPaint();
};
#include "stdafx.h"
#include "SymbolEdit.h"

// CSymbolEdit

IMPLEMENT_DYNAMIC(CSymbolEdit, CEdit)

CSymbolEdit::CSymbolEdit():
m_hSymbolIcon(NULL),
m_bInternalIcon(false),
m_colorPromptText(RGB(127,127,127))
{
	m_fontPrompt.CreateFont(
		16,                        // nHeight
		0,                         // nWidth
		0,                         // nEscapement
		0,                         // nOrientation
		FW_NORMAL,                 // nWeight
		TRUE,                      // bItalic
		FALSE,                     // bUnderline
		0,                         // cStrikeOut
		DEFAULT_CHARSET,           // nCharSet
		OUT_DEFAULT_PRECIS,        // nOutPrecision
		CLIP_DEFAULT_PRECIS,       // nClipPrecision
		DEFAULT_QUALITY,           // nQuality
		DEFAULT_PITCH | FF_SWISS,  // nPitchAndFamily
		_T("Calibri"));
}

CSymbolEdit::~CSymbolEdit()
{
	DestroyIcon();
}


BEGIN_MESSAGE_MAP(CSymbolEdit, CEdit)
	ON_WM_PAINT()
	ON_MESSAGE(WM_SETFONT, OnSetFont)
END_MESSAGE_MAP()

void CSymbolEdit::DestroyIcon()
{
	// if icon was loaded internally, destroy it
	if(m_bInternalIcon || m_hSymbolIcon != NULL)
		::DestroyIcon(m_hSymbolIcon);
}

void CSymbolEdit::PreSubclassWindow() 
{
	RecalcLayout();
}

void CSymbolEdit::SetSymbolIcon(HICON hIcon, BOOL redraw)
{
	DestroyIcon();

	m_hSymbolIcon = hIcon;

	// icon was not loaded internally
	m_bInternalIcon = false;

	RecalcLayout();

	if(redraw)
		Invalidate(TRUE);
}

void CSymbolEdit::SetSymbolIcon(UINT id, BOOL redraw)
{
	DestroyIcon();

	m_hSymbolIcon = (HICON)::LoadImage(
		AfxGetResourceHandle(),
		MAKEINTRESOURCE(id),
		IMAGE_ICON,
		16,
		16,
		LR_DEFAULTCOLOR|LR_LOADTRANSPARENT);

	ASSERT(m_hSymbolIcon != NULL);

	// icon was loaded internally
	m_bInternalIcon = true;

	RecalcLayout();

	if(redraw)
		Invalidate(TRUE);
}

void CSymbolEdit::SetPromptText(CString text, BOOL redraw)
{
	m_strPromptText = text;

	if(redraw)
		Invalidate(TRUE);
}

void CSymbolEdit::SetPromptText(LPCTSTR szText, BOOL redraw)
{
	m_strPromptText = szText;

	if(redraw)
		Invalidate(TRUE);
}

void CSymbolEdit::SetPromptTextColor(COLORREF color, BOOL redraw)
{
	m_colorPromptText = color;

	if(redraw)
		Invalidate(TRUE);
}

void CSymbolEdit::SetPromptFont(CFont& font, BOOL redraw)
{
	LOGFONT lf;
	memset(&lf, 0, sizeof(LOGFONT));

	font.GetLogFont(&lf);
	SetPromptFont(&lf);

	if(redraw)
		Invalidate(TRUE);
}

void CSymbolEdit::SetPromptFont(const LOGFONT* lpLogFont, BOOL redraw)
{
	m_fontPrompt.DeleteObject();	
	m_fontPrompt.CreateFontIndirect(lpLogFont);

	if(redraw)
		Invalidate(TRUE);
}

void CSymbolEdit::RecalcLayout()
{
	int width = GetSystemMetrics( SM_CXSMICON );

	if(m_hSymbolIcon)
	{
		DWORD dwMargins = GetMargins();
		SetMargins(LOWORD(dwMargins), width + 6);
	}
}

// CSymbolEdit message handlers

void CSymbolEdit::OnPaint()
{
	CPaintDC dc(this);

	CRect rect;
	GetClientRect( &rect );

	// Clearing the background
	dc.FillSolidRect( rect, GetSysColor(COLOR_WINDOW) );

	DWORD dwMargins = GetMargins();

	if( m_hSymbolIcon )
	{
		// Drawing the icon
		int width = GetSystemMetrics( SM_CXSMICON );
		int height = GetSystemMetrics( SM_CYSMICON );

		::DrawIconEx( 
			dc.m_hDC, 
			rect.right - width - 1, 
			1,
			m_hSymbolIcon, 
			width, 
			height, 
			0, 
			NULL, 
			DI_NORMAL);

		rect.left += LOWORD(dwMargins) + 1;
		rect.right -= (width + 7);
	}
	else
	{
		rect.left += (LOWORD(dwMargins) + 1);
		rect.right -= (HIWORD(dwMargins) + 1);
	}

	CString text;
	GetWindowText(text);
	CFont* oldFont = NULL;

    rect.top += 1;

	if(text.GetLength() == 0)
	{		
		if(this != GetFocus() && m_strPromptText.GetLength() > 0)
		{
			oldFont = dc.SelectObject(&m_fontPrompt);
			COLORREF color = dc.GetTextColor();
			dc.SetTextColor(m_colorPromptText);
			dc.DrawText(m_strPromptText, rect, DT_LEFT|DT_SINGLELINE|DT_EDITCONTROL);
			dc.SetTextColor(color);
			dc.SelectObject(oldFont);
		}
	}
	else
	{
		oldFont = dc.SelectObject(GetFont());
		dc.DrawText(text, rect, DT_SINGLELINE|DT_INTERNAL|DT_EDITCONTROL);
		dc.SelectObject(oldFont);
	}
}

void CSymbolEdit::OnSize(UINT nType, int cx, int cy)
{
	CEdit::OnSize(nType, cx, cy);

	RecalcLayout();
}

LRESULT CSymbolEdit::OnSetFont(WPARAM wParam, LPARAM lParam)
{
	DefWindowProc(WM_SETFONT, wParam, lParam);

	RecalcLayout();

	return 0;
}
jacksonfan 2018-01-07
  • 打赏
  • 举报
回复
OnInitialDlg里met_cmdParam.SetWindowTextW(_T(” 命令参数,若不设定,则使用默认参数”));
zgl7903 2018-01-07
  • 打赏
  • 举报
回复
schlafenhamster 2018-01-07
  • 打赏
  • 举报
回复
初始化时 m_PwEdit.SetWindowText(_T("请输入密码"));

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧