dialog 根据 edit box大小而变化

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);
}

效果图:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值