CDynamicEditBox 从 CEdit 继承,根据输入内容实时改变高度,同时通知父窗口改变高度
//头文件 DynamicEditBox.h
#pragma once
// CDynamicEditBox
#define WM_USER_EDITBOX_CHANGE (WM_USER + 0x200) //消息定义
class CDynamicEditBox : public CEdit
{
DECLARE_DYNAMIC(CDynamicEditBox)
public:
CDynamicEditBox();
virtual ~CDynamicEditBox();
protected:
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnEnChange();
virtual BOOL PreTranslateMessage(MSG* pMsg);
private:
int m_iLastLineCount;
int m_iInitialBoxHeight;
};
//实现文件 DynamicEditBox.cpp
// DynamicEditBox.cpp : 实现文件
//
#include "stdafx.h"
#include "DynamicEdit.h"
#include "DynamicEditBox.h"
// CDynamicEditBox
IMPLEMENT_DYNAMIC(CDynamicEditBox, CEdit)
CDynamicEditBox::CDynamicEditBox() : m_iLastLineCount(0)
,m_iInitialBoxHeight(0)
{
}
CDynamicEditBox::~CDynamicEditBox()
{
}
BEGIN_MESSAGE_MAP(CDynamicEditBox, CEdit)
ON_CONTROL_REFLECT(EN_CHANGE, &CDynamicEditBox::OnEnChange)
END_MESSAGE_MAP()
// CDynamicEditBox 消息处理程序
void CDynamicEditBox::OnEnChange()
{
// TODO: 如果该控件是 RICHEDIT 控件,则它将不会
// 发送该通知,除非重写 CEdit::OnInitDialog()
// 函数并调用 CRichEditCtrl().SetEventMask(),
// 同时将 ENM_CHANGE 标志“或”运算到掩码中。
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
if(GetLineCount() == m_iLastLineCount)
{
return;
}
CDC *pDC = GetDC();
CFont *pFont = GetFont();
TEXTMETRIC tm;
pDC->SelectObject(pFont);
pDC->GetTextMetrics(&tm);
ReleaseDC(pDC);
int iHeightChange = (GetLineCount() - m_iLastLineCount) * tm.tmHeight;
m_iLastLineCount = GetLineCount();
CRect rectBox;
GetWindowRect(&rectBox);
rectBox.bottom += iHeightChange;
SetWindowPos(NULL, 0, 0, rectBox.Width(), rectBox.Height(), SWP_NOMOVE);
CWnd *pParentWnd = GetParent();
ASSERT(pParentWnd);
::SendMessage(pParentWnd->m_hWnd, WM_USER_EDITBOX_CHANGE, WPARAM(iHeightChange), 0);
}
BOOL CDynamicEditBox::PreTranslateMessage(MSG* pMsg)
{
// TODO: 在此添加专用代码和/或调用基类
if(0 == m_iInitialBoxHeight && 0 == m_iLastLineCount)
{
CRect rectBox;
GetWindowRect(&rectBox);
m_iInitialBoxHeight = rectBox.Height();
m_iLastLineCount = GetLineCount();
}
return CEdit::PreTranslateMessage(pMsg);
}
父窗口接收消息,并根据消息的参数来改变窗口的大小
BOOL CDynamicEditDlg::OnWndMsg(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
// TODO: 在此添加专用代码和/或调用基类
if(message == WM_USER_EDITBOX_CHANGE)
{
int iChangeHeight = (int)wParam;
CRect rectWnd;
GetWindowRect(&rectWnd);
rectWnd.bottom += iChangeHeight;
SetWindowPos(NULL, 0, 0, rectWnd.Width(), rectWnd.Height(), SWP_NOMOVE);
}
return CDialog::OnWndMsg(message, wParam, lParam, pResult);
}
效果图: