VS 2019 MFC Edit Control控件自绘带软键盘

35 篇文章 8 订阅

实现功能:点击Edit控件后弹出软键盘,并能设置软键盘的输入最大者和最小值,软键盘采用非模态对话框创建,软键盘按钮字体颜色、背景颜色可以改变。Edit控件获得焦点和失去焦点后字体颜色和背景颜色动态可变。 

 

工程文件H文件


#include"CEditJF.h"
#pragma once

class CMFCApplicationKeyBoardNumPadDlg : public CDialogEx
{
public:
	CMFCApplicationKeyBoardNumPadDlg(CWnd* pParent = nullptr);	
	
#ifdef AFX_DESIGN_TIME
	enum { IDD = IDD_MFCAPPLICATIONKEYBOARDNUMPAD_DIALOG };
#endif

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);	

protected:
	HICON m_hIcon;
	HBRUSH m_CListBrush;
	virtual BOOL OnInitDialog();
	afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
	afx_msg void OnPaint();
	afx_msg HCURSOR OnQueryDragIcon();
	DECLARE_MESSAGE_MAP()
public:
	CEditJF m_KeyPadTest;
};

 工程文件CPP文件



#include "pch.h"
#include "framework.h"
#include "MFCApplicationKeyBoardNumPad.h"
#include "MFCApplicationKeyBoardNumPadDlg.h"
#include "afxdialogex.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

class CAboutDlg : public CDialogEx
{
public:
	CAboutDlg();

#ifdef AFX_DESIGN_TIME
	enum { IDD = IDD_ABOUTBOX };
#endif

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    

protected:
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX)
{
	EnableActiveAccessibility();
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()


CMFCApplicationKeyBoardNumPadDlg::CMFCApplicationKeyBoardNumPadDlg(CWnd* pParent /*=nullptr*/)
	: CDialogEx(IDD_MFCAPPLICATIONKEYBOARDNUMPAD_DIALOG, pParent)
{
	EnableActiveAccessibility();
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
	m_CListBrush = CreateSolidBrush(RGB(120, 120, 120));
}

void CMFCApplicationKeyBoardNumPadDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);

	DDX_Control(pDX, IDC_EDIT1, m_KeyPadTest);
}

BEGIN_MESSAGE_MAP(CMFCApplicationKeyBoardNumPadDlg, CDialogEx)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
END_MESSAGE_MAP()

BOOL CMFCApplicationKeyBoardNumPadDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != nullptr)
	{
		BOOL bNameValid;
		CString strAboutMenu;
		bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
		ASSERT(bNameValid);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	SetIcon(m_hIcon, TRUE);			
	SetIcon(m_hIcon, FALSE);	
	ShowWindow(SW_MAXIMIZE);
	m_KeyPadTest.SetRange(-2147648,2147647);
	m_KeyPadTest.SetMouseMoveClr(RGB(0,0,255));
	m_KeyPadTest.SetMouseLeaveClr(RGB(255, 0, 0));
	m_KeyPadTest.SetFocusDraw3DFramClr(RGB(0, 0, 255));
	m_KeyPadTest.SetFocusBkClr(RGB(100, 150, 100));
	m_KeyPadTest.SetKillFocusBkClr(RGB(200, 200, 200));
	m_KeyPadTest.SetTextBordNormalBkClr(RGB(120, 120, 120));
	m_KeyPadTest.SetTextBordBkClr(RGB(0, 0, 255));
	m_KeyPadTest.SetEditTextClr(RGB(255, 255, 255));
	m_KeyPadTest.SetNormalTextClr(RGB(0, 0, 255));
	m_KeyPadTest.Invalidate();
	return TRUE;  
}

void CMFCApplicationKeyBoardNumPadDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialogEx::OnSysCommand(nID, lParam);
	}
}

void CMFCApplicationKeyBoardNumPadDlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); 

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialogEx::OnPaint();
	}
}

HCURSOR CMFCApplicationKeyBoardNumPadDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}

 Edit Control派生类H文件

#pragma once
#include "CMyKeyBoardNumDlgKB.h"
class CEditJF : public CEdit
{
public:
	CEditJF();
	virtual ~CEditJF();
public:
	enum
	{
		BORDER_COLOR_HAS_FOCUS = RGB(0, 0, 255),
		BORDER_COLOR_LOSS_FOCUS = RGB(255, 200, 0)
	};
public:

protected:
public:
	CFont m_fntText;
	bool SetTextFont(const LOGFONT& lgfnt);
	bool SetTextFont(LONG nHeight, bool bBold, bool bItalic, const CString& sFaceName);
	void SizeToDialog();
	void SetMsg(int iPre, int iPost, int iEnd = 0);
	void SetRange(long lMin, long lMax);
	void SetNum(long lNum);
	void GetNum(long* plNum);
	void GetNum(int* piNum);
	void SetMouseMoveClr(COLORREF mClr);
	void SetMouseLeaveClr(COLORREF mlClr);
	void SetFocusDraw3DFramClr(COLORREF mfClr);
	void SetFocusBkClr(COLORREF mBkClr);
	void SetKillFocusBkClr(COLORREF mKbkClr);
	void SetEditTextClr(COLORREF mEditClr);
	void SetNormalTextClr(COLORREF mNormalClr);
	void SetTextBordBkClr(COLORREF mEditBk);
	void SetTextBordNormalBkClr(COLORREF mNormalBk);
protected:
	CString Text;
private:
	BOOL m_bMouseOnEdit;
	BOOL m_IsFocus;
	BOOL m_FocusFlags;
	int iPreMsg;
	int iPostMsg;
	int iEndMsg;
	long lMaxRange;
	long lMinRange;
	long lNumber;
	long lOrgNumber;
	CMyKeyBoardNumDlgKB* KeyPad;
	CBrush m_brsBkGnd;
	CBrush m_brsBkGndFocus;
	HBRUSH m_FocusBK;
	HBRUSH m_KillFocusBK;
	COLORREF m_clrBkGndFocus;
	COLORREF m_clrBkGnd;
	COLORREF m_clrTextFocus;
	COLORREF m_clrText;
	COLORREF m_ColorBkFocus;
	COLORREF m_ColorBkKillerFocus;

	COLORREF mClrRgb;
	COLORREF mlClrRgb;
	COLORREF mfClrRgb;
	DECLARE_MESSAGE_MAP()
protected:
public:
	virtual void PreSubclassWindow();
	afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
	afx_msg BOOL OnEraseBkgnd(CDC* pDC);
	afx_msg void OnMouseMove(UINT nFlags, CPoint point);
protected:
	afx_msg LRESULT OnUpdateText(WPARAM wParam, LPARAM lParam);
	afx_msg LRESULT OnEnter(WPARAM wParam, LPARAM lParam);
	afx_msg LRESULT OnClear(WPARAM wParam, LPARAM lParam);
	afx_msg LRESULT OnEnd(WPARAM wParam, LPARAM lParam);
	afx_msg LRESULT OnMouseleave(WPARAM wParam, LPARAM lParam);
public:
	afx_msg void OnSetFocus(CWnd* pOldWnd);
	afx_msg HBRUSH CtlColor(CDC* pDC, UINT nCtlColor);
	afx_msg void OnKillFocus(CWnd* pNewWnd);
};



Edit Control派生类CPP文件


#include "pch.h"
#include "MFCApplicationKeyBoardNumPad.h"
#include "CEditJF.h"


CEditJF::CEditJF()
{
	lNumber = 0;
	lOrgNumber = 0;
	lMinRange = LONG_MIN;
	lMaxRange = LONG_MAX;
	iPreMsg = 0;
	iPostMsg = 0;
	iEndMsg = 0;
	m_IsFocus = false;
	m_bMouseOnEdit = FALSE;
	m_FocusBK = CreateSolidBrush(RGB(0,255,0));
	m_KillFocusBK= CreateSolidBrush(RGB(0, 125, 0));
	KeyPad = NULL; 
	m_FocusFlags = FALSE;
}

CEditJF::~CEditJF()
{
	if (NULL != KeyPad)
	{
		KeyPad->DestroyWindow();
		delete KeyPad;
	}
}

BEGIN_MESSAGE_MAP(CEditJF, CEdit)
	ON_WM_LBUTTONDOWN()
	ON_WM_ERASEBKGND()
	ON_WM_MOUSEMOVE()
	ON_MESSAGE(WM_UPDATETEXT, &CEditJF::OnUpdateText)
	ON_MESSAGE(WM_BUTTONENTER, &CEditJF::OnEnter)
	ON_MESSAGE(WM_BUTTONCLEAR, &CEditJF::OnClear)
	ON_MESSAGE(WM_BUTTONCLOSE, &CEditJF::OnEnd)
	ON_MESSAGE(WM_MOUSELEAVE, &CEditJF::OnMouseleave)
	ON_WM_SETFOCUS()
	ON_WM_CTLCOLOR_REFLECT()
	ON_WM_KILLFOCUS()
END_MESSAGE_MAP()


void CEditJF::PreSubclassWindow()
{
	SetNum(1234);
	SetTextFont(12, TRUE, FALSE, _T("仿宋"));
	CEdit::PreSubclassWindow();
}


void CEditJF::OnLButtonDown(UINT nFlags, CPoint point)
{
	CEdit::OnLButtonDown(nFlags, point);
	m_IsFocus = true;
	Invalidate();
	if (iPreMsg != 0)
		GetParent()->PostMessage(iPreMsg);
	Text.Format(_T("%d"), lNumber);
	lOrgNumber = lNumber;
	if (NULL== KeyPad)
	{
		KeyPad = new CMyKeyBoardNumDlgKB(this, lMinRange, lMaxRange);
		KeyPad->Create(IDD_DIALOGNUMPAD, NULL);
		KeyPad->RefText(&Text);
		KeyPad->ShowWindow(SW_SHOWNORMAL);
	}
	m_IsFocus = false;
	Invalidate();
	CEdit::OnLButtonDown(nFlags, point);
}

BOOL CEditJF::OnEraseBkgnd(CDC* pDC)
{
	CEdit::OnEraseBkgnd(pDC);
	CRect rect;
	GetClientRect(rect);
	rect.DeflateRect(-2, -2, -2, -2);
	if (m_bMouseOnEdit)
	{
		pDC->Draw3dRect(rect, mClrRgb, mClrRgb);
		pDC->FillSolidRect(rect, mClrRgb);
	}
	else
	{
		pDC->Draw3dRect(rect, mlClrRgb, mlClrRgb);
		pDC->FillSolidRect(rect, mlClrRgb);
	}	
	return TRUE;
}

void CEditJF::OnMouseMove(UINT nFlags, CPoint point)
{
	TRACKMOUSEEVENT		csTME;
	if (!m_bMouseOnEdit)
	{
		m_bMouseOnEdit = TRUE;
		Invalidate();
		csTME.cbSize = sizeof(csTME);
		csTME.dwFlags = TME_LEAVE;
		csTME.hwndTrack = m_hWnd;
		::_TrackMouseEvent(&csTME);
	}
	Invalidate();
	CEdit::OnMouseMove(nFlags, point);
}


afx_msg LRESULT CEditJF::OnUpdateText(WPARAM wParam, LPARAM lParam)
{
	SetWindowText(Text);
	return ERROR_SUCCESS;
}

afx_msg LRESULT CEditJF::OnEnter(WPARAM wParam, LPARAM lParam)
{
	long lNewNumber = _ttoi(Text);
	CString strMin, strMax;
	strMin.Format(_T("%d"), lMinRange);
	strMax.Format(_T("%d"), lMaxRange);
	if (lNewNumber <= lMaxRange && lNewNumber >= lMinRange)
	{
		lNumber = _ttol(Text);
		if (iPostMsg != 0)
			GetParent()->PostMessage(iPostMsg);
	}
	else
	{
		MessageBox(_T("输入数值超出")+ strMin+_T("-") + strMax + _T("范围"), _T("信息提示:"), MB_ICONERROR);
	}
	SetNum(lNumber);
	return ERROR_SUCCESS;
}

afx_msg LRESULT CEditJF::OnClear(WPARAM wParam, LPARAM lParam)
{
	lNumber = lOrgNumber;
	Text.Format(_T("%d"), lOrgNumber);
	OnUpdateText(wParam, lParam);
	if (iPostMsg != 0)
		GetParent()->PostMessage(iPostMsg);
	if (iEndMsg != 0)
		GetParent()->PostMessage(iEndMsg);
	delete KeyPad;
	KeyPad = NULL;
	return ERROR_SUCCESS;
}

afx_msg LRESULT CEditJF::OnEnd(WPARAM wParam, LPARAM lParam)
{
	OnEnter(wParam, lParam);
	if (iEndMsg != 0)
	GetParent()->PostMessage(iEndMsg);
	m_IsFocus = FALSE;
	m_bMouseOnEdit = FALSE;
	delete KeyPad;
	KeyPad =NULL;
	return ERROR_SUCCESS;
}

afx_msg LRESULT CEditJF::OnMouseleave(WPARAM wParam, LPARAM lParam)
{
	if (m_bMouseOnEdit)
	{
		m_bMouseOnEdit = FALSE;
		Invalidate();
	}
	return ERROR_SUCCESS;
}

bool CEditJF::SetTextFont(const LOGFONT& lgfnt)
{
	m_fntText.DeleteObject();
	m_fntText.CreateFontIndirect(&lgfnt);
	SetFont(&m_fntText, TRUE);
	Invalidate();
	return true;
}

bool CEditJF::SetTextFont(LONG nHeight, bool bBold, bool bItalic, const CString& sFaceName)
{
	LOGFONT lgfnt;
	lgfnt.lfHeight = -MulDiv(nHeight, GetDeviceCaps(GetDC()->m_hDC, LOGPIXELSY), 72);
	lgfnt.lfWidth = 0;
	lgfnt.lfEscapement = 0;
	lgfnt.lfOrientation = 0;
	lgfnt.lfWeight = bBold ? FW_BOLD : FW_DONTCARE;
	lgfnt.lfItalic = bItalic ? TRUE : FALSE;
	lgfnt.lfUnderline = FALSE;
	lgfnt.lfStrikeOut = FALSE;
	lgfnt.lfCharSet = DEFAULT_CHARSET;
	lgfnt.lfOutPrecision = OUT_DEFAULT_PRECIS;
	lgfnt.lfClipPrecision = CLIP_DEFAULT_PRECIS;
	lgfnt.lfQuality = DEFAULT_QUALITY;
	lgfnt.lfPitchAndFamily = DEFAULT_PITCH | FF_DONTCARE;
	wcscpy_s(lgfnt.lfFaceName, sFaceName);
	return SetTextFont(lgfnt);
}

void CEditJF::SizeToDialog()
{
	INT iWidth, iHeight, iStartX, iStartY;
	CRect rectTab;
	CRect rectParent;

	if (GetParent() != NULL)
	{
		if (GetParent()->GetParent() != NULL)
			GetParent()->GetParent()->GetWindowRect(&rectTab);
		else
		{
			rectTab.top = 0;
			rectTab.left = 0;
			rectTab.bottom = GetSystemMetrics(SM_CYSCREEN);
			rectTab.right = GetSystemMetrics(SM_CXSCREEN);
		}

		GetParent()->GetWindowRect(&rectParent);
		CRect rectOrg;
		GetWindowRect(&rectOrg);
		iStartX = (int)(((float)rectTab.Width() / rectParent.Width()) * (rectOrg.left - rectParent.left)) + (rectParent.left);
		iStartY = (int)(((float)rectTab.Height() / rectParent.Height()) * (rectOrg.top - rectParent.top)) + (rectParent.top);
		iWidth = (int)(((float)rectTab.Width() / rectParent.Width()) * rectOrg.Width());
		iHeight = (int)(((float)rectTab.Height() / rectParent.Height()) * rectOrg.Height());
		SetWindowPos(NULL, iStartX, iStartY, iWidth, iHeight, SWP_NOACTIVATE);
	}
}

void CEditJF::SetMsg(int iPre, int iPost, int iEnd)
{
	iPreMsg = iPre;
	iPostMsg = iPost;
	iEndMsg = iEnd;
}

void CEditJF::SetRange(long lMin, long lMax)
{
	lMinRange = lMin;
	lMaxRange = lMax;
}

void CEditJF::SetNum(long lNum)
{
	if (Text == _T("-"))
		SetWindowText(_T("-"));
	else
	{
		lNumber = lNum;
		Text.Format(_T("%ld"), lNumber);
		OnUpdateText(0, 0);
	}
}

void CEditJF::GetNum(long* plNum)
{
	CString Text;
	GetWindowText(Text);
	*plNum = _ttol(Text);
}

void CEditJF::GetNum(int* piNum)
{
	CString Text;
	GetWindowText(Text);
	*piNum = _ttoi(Text);
}

void CEditJF::SetMouseMoveClr(COLORREF mClr)
{
	mClrRgb = mClr;
	Invalidate();
}

void CEditJF::SetMouseLeaveClr(COLORREF mlClr)
{
	mlClrRgb = mlClr;
	Invalidate();
}

void CEditJF::SetFocusDraw3DFramClr(COLORREF mfClr)
{
	mfClrRgb = mfClr;
	Invalidate();
}

void CEditJF::SetFocusBkClr(COLORREF mBkClr)
{
	m_ColorBkFocus = mBkClr;
	m_brsBkGndFocus.Detach();
	m_brsBkGndFocus.CreateSolidBrush(m_ColorBkFocus);
	Invalidate();

}

void CEditJF::SetKillFocusBkClr(COLORREF mKbkClr)
{
	m_ColorBkKillerFocus = mKbkClr;
	m_brsBkGnd.Detach();
	m_brsBkGnd.CreateSolidBrush(m_ColorBkKillerFocus);
	Invalidate();
}

void CEditJF::SetEditTextClr(COLORREF mEditClr)
{
	m_clrTextFocus = mEditClr;
	Invalidate();
}

void CEditJF::SetNormalTextClr(COLORREF mNormalClr)
{
	m_clrText = mNormalClr;
	Invalidate();
}

void CEditJF::SetTextBordBkClr(COLORREF mEditBk)
{
	m_clrBkGndFocus = mEditBk;
	Invalidate();
}

void CEditJF::SetTextBordNormalBkClr(COLORREF mNormalBk)
{
	m_clrBkGnd = mNormalBk;
	Invalidate();
}

void CEditJF::OnSetFocus(CWnd* pOldWnd)
{
	CEdit::OnSetFocus(pOldWnd);
	CRect rect;
	CClientDC pDC(this);
	GetClientRect(rect);
	rect.DeflateRect(-2, -2, -2, -2);
	pDC.Draw3dRect(rect, mfClrRgb, mfClrRgb);
	pDC.FillSolidRect(rect, mfClrRgb);
	m_FocusFlags = TRUE;
}


HBRUSH CEditJF::CtlColor(CDC* pDC, UINT nCtlColor)
{	
	pDC->SetBkMode(TRANSPARENT);
	/*pDC->SetBkColor(m_IsFocus ? m_clrBkGndFocus : m_clrBkGnd);
	pDC->SetTextColor(m_IsFocus ? m_clrTextFocus : m_clrText);
	return m_IsFocus ? (HBRUSH)m_brsBkGndFocus : (HBRUSH)m_brsBkGnd;*/
	
	if (m_FocusFlags)
	{
		pDC->SetBkColor(m_clrBkGndFocus);
		pDC->SetTextColor(m_clrTextFocus);
		return (HBRUSH)m_brsBkGndFocus;
	}
	else
	{
		pDC->SetBkColor(m_clrBkGnd);
		pDC->SetTextColor(m_clrText);
		return (HBRUSH)m_brsBkGnd;
	}
}


void CEditJF::OnKillFocus(CWnd* pNewWnd)
{
	CEdit::OnKillFocus(pNewWnd);

	CRect rect;
	CClientDC pDC(this);
	GetClientRect(rect);
	rect.DeflateRect(-3, -3, -3, -3);
	pDC.Draw3dRect(rect, mClrRgb, mClrRgb);
	pDC.FillSolidRect(rect, mClrRgb);
	m_FocusFlags = FALSE;
}

 软键盘对话框H文件

#pragma once
#include"CMyButton.h"
#define WM_UPDATETEXT         WM_USER+2001
#define WM_BUTTONENTER        WM_USER+2002
#define WM_BUTTONCLEAR        WM_USER+2003
#define WM_BUTTONCLOSE        WM_USER+2004

class CMyKeyBoardNumDlgKB : public CDialogEx
{
	DECLARE_DYNAMIC(CMyKeyBoardNumDlgKB)

public:
	void RefText(CString* pT);
	CMyKeyBoardNumDlgKB(CWnd* pParent, LONG min, LONG max);
	virtual~CMyKeyBoardNumDlgKB();
	void AddDigit(char numKey);
#ifdef AFX_DESIGN_TIME
	enum { IDD = IDD_DIALOGNUMPAD };
#endif

protected:
	CString* pText;
	CWnd* pP;
	BOOL bInputDigital;
	LONG lMin;
	LONG lMax;
	virtual void DoDataExchange(CDataExchange* pDX);  
	DECLARE_MESSAGE_MAP()
public:
	CStatic m_Static1;
	CStatic m_StaticMin;
	CStatic m_Static2;
	CStatic m_StaticMax;
	CMyButton m_UpOne;
	CMyButton m_DownOne;
	CMyButton m_UpTen;
	CMyButton m_DownTen;
	CMyButton m_Btn0;
	CMyButton m_Btn1;
	CMyButton m_Btn4;
	CMyButton m_Btn7;
	CMyButton m_Btn2;
	CMyButton m_Btn5;
	CMyButton m_Btn8;
	CMyButton m_Btn9;
	CMyButton m_Btn3;
	CMyButton m_Btn6;
	CMyButton m_BtnSign;
	CMyButton m_BtnEnter;
	CMyButton m_BtnClear;
	CMyButton m_BtnEnter2;
	afx_msg void OnBnClickedButtonStepUp();
	afx_msg void OnBnClickedButtonStepDown();
	afx_msg void OnBnClickedButtonUp();
	afx_msg void OnBnClickedButtonDown();
	afx_msg void OnBnClickedButton7();
	afx_msg void OnBnClickedButton4();
	afx_msg void OnBnClickedButton1();
	afx_msg void OnBnClickedButton0();
	afx_msg void OnBnClickedButton8();
	afx_msg void OnBnClickedButton5();
	afx_msg void OnBnClickedButton2();
	afx_msg void OnBnClickedButtonclear();
	afx_msg void OnBnClickedButton9();
	afx_msg void OnBnClickedButton6();
	afx_msg void OnBnClickedButton3();
	afx_msg void OnBnClickedButtonsign();
	afx_msg void OnBnClickedButtonenter();
	afx_msg void OnBnClickedButtonenter2();
	virtual BOOL OnInitDialog();
	virtual void PostNcDestroy();
	afx_msg void OnClose();
};

 软键盘对话框CPP文件


#include "pch.h"
#include "MFCApplicationKeyBoardNumPad.h"
#include "CMyKeyBoardNumDlgKB.h"
#include "afxdialogex.h"



IMPLEMENT_DYNAMIC(CMyKeyBoardNumDlgKB, CDialogEx)

CMyKeyBoardNumDlgKB::CMyKeyBoardNumDlgKB(CWnd* pParent, LONG min, LONG max)
	: CDialogEx(IDD_DIALOGNUMPAD, pParent)
{
	pP = pParent;
	lMin = min;
	lMax = max;
	bInputDigital = FALSE;
	pText = NULL;
}

CMyKeyBoardNumDlgKB::~CMyKeyBoardNumDlgKB()
{
}

void CMyKeyBoardNumDlgKB::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_STATIC_MIN, m_StaticMin);
	DDX_Control(pDX, IDC_STATIC_MAX, m_StaticMax);
	DDX_Control(pDX, IDC_STATIC2, m_Static2);
	DDX_Control(pDX, IDC_STATIC1, m_Static1);
	DDX_Control(pDX, IDC_BUTTONSIGN, m_BtnSign);
	DDX_Control(pDX, IDC_BUTTONENTER2, m_BtnEnter2);
	DDX_Control(pDX, IDC_BUTTONENTER, m_BtnEnter);
	DDX_Control(pDX, IDC_BUTTONCLEAR, m_BtnClear);
	DDX_Control(pDX, IDC_BUTTON9, m_Btn9);
	DDX_Control(pDX, IDC_BUTTON8, m_Btn8);
	DDX_Control(pDX, IDC_BUTTON7, m_Btn7);
	DDX_Control(pDX, IDC_BUTTON6, m_Btn6);
	DDX_Control(pDX, IDC_BUTTON5, m_Btn5);
	DDX_Control(pDX, IDC_BUTTON4, m_Btn4);
	DDX_Control(pDX, IDC_BUTTON3, m_Btn3);
	DDX_Control(pDX, IDC_BUTTON2, m_Btn2);
	DDX_Control(pDX, IDC_BUTTON1, m_Btn1);
	DDX_Control(pDX, IDC_BUTTON0, m_Btn0);
	DDX_Control(pDX, IDC_BUTTON_UP, m_UpTen);
	DDX_Control(pDX, IDC_BUTTON_STEP_UP, m_UpOne);
	DDX_Control(pDX, IDC_BUTTON_STEP_DOWN, m_DownOne);
	DDX_Control(pDX, IDC_BUTTON_DOWN, m_DownTen);
}


BEGIN_MESSAGE_MAP(CMyKeyBoardNumDlgKB, CDialogEx)
	ON_BN_CLICKED(IDC_BUTTON_STEP_UP, &CMyKeyBoardNumDlgKB::OnBnClickedButtonStepUp)
	ON_BN_CLICKED(IDC_BUTTON_STEP_DOWN, &CMyKeyBoardNumDlgKB::OnBnClickedButtonStepDown)
	ON_BN_CLICKED(IDC_BUTTON_UP, &CMyKeyBoardNumDlgKB::OnBnClickedButtonUp)
	ON_BN_CLICKED(IDC_BUTTON_DOWN, &CMyKeyBoardNumDlgKB::OnBnClickedButtonDown)
	ON_BN_CLICKED(IDC_BUTTON7, &CMyKeyBoardNumDlgKB::OnBnClickedButton7)
	ON_BN_CLICKED(IDC_BUTTON4, &CMyKeyBoardNumDlgKB::OnBnClickedButton4)
	ON_BN_CLICKED(IDC_BUTTON1, &CMyKeyBoardNumDlgKB::OnBnClickedButton1)
	ON_BN_CLICKED(IDC_BUTTON0, &CMyKeyBoardNumDlgKB::OnBnClickedButton0)
	ON_BN_CLICKED(IDC_BUTTON8, &CMyKeyBoardNumDlgKB::OnBnClickedButton8)
	ON_BN_CLICKED(IDC_BUTTON5, &CMyKeyBoardNumDlgKB::OnBnClickedButton5)
	ON_BN_CLICKED(IDC_BUTTON2, &CMyKeyBoardNumDlgKB::OnBnClickedButton2)
	ON_BN_CLICKED(IDC_BUTTONCLEAR, &CMyKeyBoardNumDlgKB::OnBnClickedButtonclear)
	ON_BN_CLICKED(IDC_BUTTON9, &CMyKeyBoardNumDlgKB::OnBnClickedButton9)
	ON_BN_CLICKED(IDC_BUTTON6, &CMyKeyBoardNumDlgKB::OnBnClickedButton6)
	ON_BN_CLICKED(IDC_BUTTON3, &CMyKeyBoardNumDlgKB::OnBnClickedButton3)
	ON_BN_CLICKED(IDC_BUTTONSIGN, &CMyKeyBoardNumDlgKB::OnBnClickedButtonsign)
	ON_BN_CLICKED(IDC_BUTTONENTER, &CMyKeyBoardNumDlgKB::OnBnClickedButtonenter)
	ON_BN_CLICKED(IDC_BUTTONENTER2, &CMyKeyBoardNumDlgKB::OnBnClickedButtonenter2)
	ON_WM_CLOSE()
END_MESSAGE_MAP()

void CMyKeyBoardNumDlgKB::RefText(CString* pT)
{
	pText = pT;
}
void CMyKeyBoardNumDlgKB::AddDigit(char numKey)
{
	CString str, tmp;

	if (bInputDigital == FALSE)
	{
		pText->Format(_T(""));
		bInputDigital = TRUE;
	}
	if (bInputDigital == TRUE)
	{
		tmp.Format(_T("%c"), numKey);

		if (*pText == '0')
			*pText = tmp;
		else if ((*pText == '-' && tmp == '0'))
			*pText = '-';
		else
			*pText += tmp;
	}

	pP->PostMessage(WM_UPDATETEXT);
}

void CMyKeyBoardNumDlgKB::OnBnClickedButtonStepUp()
{
	long lData = _ttol(*pText);
	lData++;
	pText->Format(_T("%ld"), lData);
	pP->PostMessage(WM_BUTTONENTER);
	bInputDigital = FALSE;
}


void CMyKeyBoardNumDlgKB::OnBnClickedButtonStepDown()
{
	long lData = _ttol(*pText);
	lData--;
	pText->Format(_T("%ld"), lData);
	pP->PostMessage(WM_BUTTONENTER);
	bInputDigital = FALSE;
}


void CMyKeyBoardNumDlgKB::OnBnClickedButtonUp()
{
	long lData = _ttol(*pText);
	lData += 10;
	pText->Format(_T("%ld"), lData);
	pP->PostMessage(WM_BUTTONENTER);
	bInputDigital = FALSE;
}


void CMyKeyBoardNumDlgKB::OnBnClickedButtonDown()
{
	long lData = _ttol(*pText);
	lData -= 10;
	pText->Format(_T("%ld"), lData);
	pP->PostMessage(WM_BUTTONENTER);
	bInputDigital = FALSE;
}


void CMyKeyBoardNumDlgKB::OnBnClickedButton7()
{
	AddDigit('7');
}


void CMyKeyBoardNumDlgKB::OnBnClickedButton4()
{
	AddDigit('4');
}


void CMyKeyBoardNumDlgKB::OnBnClickedButton1()
{
	AddDigit('1');
}


void CMyKeyBoardNumDlgKB::OnBnClickedButton0()
{
	AddDigit('0');
}


void CMyKeyBoardNumDlgKB::OnBnClickedButton8()
{
	AddDigit('8');
}


void CMyKeyBoardNumDlgKB::OnBnClickedButton5()
{
	AddDigit('5');
}


void CMyKeyBoardNumDlgKB::OnBnClickedButton2()
{
	AddDigit('2');
}


void CMyKeyBoardNumDlgKB::OnBnClickedButtonclear()
{
	pP->PostMessage(WM_BUTTONCLEAR);
	EndDialog(IDOK);
}


void CMyKeyBoardNumDlgKB::OnBnClickedButton9()
{
	AddDigit('9');
}


void CMyKeyBoardNumDlgKB::OnBnClickedButton6()
{
	AddDigit('6');
}


void CMyKeyBoardNumDlgKB::OnBnClickedButton3()
{
	AddDigit('3');
}

void CMyKeyBoardNumDlgKB::OnBnClickedButtonsign()
{
	if (bInputDigital == FALSE)
	{
		pText->Format(_T(""));
		bInputDigital = TRUE;
	}

	long lData = _ttol(*pText) * (-1);
	if (lData != 0)
	{
		pText->Format(_T("%ld"), lData);
	}
	else
		pText->Format(_T("-"));
	pP->PostMessage(WM_UPDATETEXT);
}


void CMyKeyBoardNumDlgKB::OnBnClickedButtonenter()
{
	pP->PostMessage(WM_BUTTONENTER);
	bInputDigital = FALSE;
}


void CMyKeyBoardNumDlgKB::OnBnClickedButtonenter2()
{
	pP->PostMessage(WM_BUTTONCLOSE);
	EndDialog(IDOK);
}

BOOL CMyKeyBoardNumDlgKB::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	INT cx = GetSystemMetrics(SM_CXSCREEN);
	INT cy = GetSystemMetrics(SM_CYSCREEN);

	CRect rect, rectPara;
	GetClientRect(&rect);
	pP->GetWindowRect(&rectPara);

	SetWindowPos(
		NULL,
		rectPara.left-7,
		rectPara.top+ rectPara.Height(),
		rect.Width(),
		rect.Height(),
		SWP_SHOWWINDOW
	);
	bInputDigital = FALSE;

	CString strTextMin, strTextMax;
	strTextMin.Format(_T("%ld"), lMin);
	strTextMax.Format(_T("%ld"), lMax);
	m_StaticMin.SetWindowText(strTextMin);
	m_StaticMax.SetWindowText(strTextMax);
	HWND tHwnd = GetSafeHwnd();
	SetWindowLong(tHwnd, GWL_EXSTYLE, GetWindowLong(tHwnd, GWL_EXSTYLE) ^ WS_EX_LAYERED);
	SetLayeredWindowAttributes(0, 200, LWA_ALPHA);
	return TRUE;
	return TRUE;  
}



void CMyKeyBoardNumDlgKB::PostNcDestroy()
{
	// TODO: 在此添加专用代码和/或调用基类
	CDialogEx::PostNcDestroy();
}


void CMyKeyBoardNumDlgKB::OnClose()
{
	pP->PostMessage(WM_BUTTONCLEAR);
	EndDialog(IDOK);
	CDialogEx::OnClose();
}

 键盘按钮派生类H文件

#pragma once

class CMyButton : public CButton
{
	DECLARE_DYNAMIC(CMyButton)

public:
	CMyButton();
	virtual ~CMyButton();
	virtual void  DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
protected:
	DECLARE_MESSAGE_MAP()
};


 键盘按钮派生类

#include "pch.h"
#include"MFCApplicationKeyBoardNumPadDlg.h"
#include "CMyButton.h"

IMPLEMENT_DYNAMIC(CMyButton, CButton)

CMyButton::CMyButton()
{

}
CMyButton::~CMyButton()
{
}
BEGIN_MESSAGE_MAP(CMyButton, CButton)
END_MESSAGE_MAP()
void CMyButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
	CString bntCaption = _T("");
	CDC* pDc = CDC::FromHandle(lpDrawItemStruct->hDC);
	int nSaveDC = pDc->SaveDC();
	CRect drawRect;

	drawRect.CopyRect(&(lpDrawItemStruct->rcItem));
	if (lpDrawItemStruct->itemState & ODS_SELECTED)
	{
		pDc->DrawFrameControl(&drawRect, DFC_BUTTON, lpDrawItemStruct->CtlType);
		static int nSteoColor = 0;
		CBrush pBrush;
		pBrush.CreateSolidBrush(RGB(100 + nSteoColor, 130, nSteoColor));
		pDc->FillRect(&drawRect, &pBrush);
		CRect textRect;
		textRect.CopyRect(&drawRect);
		GetWindowText(bntCaption);
		CSize sz = pDc->GetTextExtent(bntCaption);
		textRect.top += (textRect.Height() - sz.cy) / 2;
		pDc->SetBkMode(TRANSPARENT);
		pDc->SetTextColor(RGB(0, 255, 50));
		pDc->DrawText(bntCaption, &textRect, DT_RIGHT | DT_CENTER | DT_BOTTOM);
	}
	if (!(lpDrawItemStruct->itemState & ODS_SELECTED))
	{
		static int	nSteoColor = 50;
		pDc->RestoreDC(nSaveDC);
		pDc->DrawFrameControl(&drawRect, DFC_BUTTON, lpDrawItemStruct->CtlType);

		CBrush pBrush;
		pBrush.CreateSolidBrush(RGB(100 + nSteoColor, 130, nSteoColor));
		pDc->FillRect(&drawRect, &pBrush);
		CRect textRect;
		textRect.CopyRect(&drawRect);
		GetWindowText(bntCaption);
		CSize sz = pDc->GetTextExtent(bntCaption);
		textRect.top += (textRect.Height() - sz.cy) / 2;
		pDc->SetBkMode(TRANSPARENT);
		pDc->SetTextColor(RGB(0, 0, 255));
		pDc->DrawText(bntCaption, &textRect, DT_RIGHT | DT_CENTER | DT_BOTTOM);
	}

}




CPP文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值