实现功能:点击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文件