就是那種滑鼠放到文本框里時,無文字顯示,離開時顯示顯示默認文字。
(例如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)
也確實做出了效果,但還是有問題:
在編譯出的界面上一開始是都沒有提示字的,當點擊其他對話框后,才能顯示出來
我想要的效果是 編譯出來就帶有提示字,當點擊該對話框時文字消失。
問:我該怎么改進?
uj5u.com熱心網友回復:
初始化時m_PwEdit.SetWindowText(_T("請輸入密碼"));
uj5u.com熱心網友回復:
CEdit::SetCueBanneruj5u.com熱心網友回復:
OnInitialDlg里met_cmdParam.SetWindowTextW(_T(” 命令引數,若不設定,則使用默認引數”));uj5u.com熱心網友回復:
#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;
}
uj5u.com熱心網友回復:
sevancheng
uj5u.com熱心網友回復:
這個是MFC類別庫提供的,可惜對應ANSI的版本已經棄用
uj5u.com熱心網友回復:
