CEdit重绘编辑区时,大小改变后发生的错误

qq_24604661 2020-09-17 11:03:42
重绘了编辑框的可编辑区,但是编辑框大小改变后,ON_WM_NCCALCSIZE()没有再次触发,导致编辑框无法输入;:ON_WM_NCPAINT()再次触发,但是填充编辑框区域有误。
void CCenterEdit::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS FAR* lpncsp)
{


//calculate client area height needed for a font
CFont *pFont = GetFont();
CRect rectText;
rectText.SetRectEmpty();

CDC *pDC = GetDC();

CFont *pOld = pDC->SelectObject(pFont);
pDC->DrawText(_T("Ky"), rectText, DT_CALCRECT | DT_LEFT);
UINT uiVClientHeight = rectText.Height();

pDC->SelectObject(pOld);
ReleaseDC(pDC);

//calculate NC area to center text.

CRect rectWnd, rectClient;
GetClientRect(rectClient);
GetWindowRect(rectWnd);

ClientToScreen(rectClient);
int i = GetDlgCtrlID();
UINT uiCenterOffset = (rectClient.Height() - uiVClientHeight) / 2;
UINT uiCY = (rectWnd.Height() - rectClient.Height()) / 2;
UINT uiCX = (rectWnd.Width() - rectClient.Width()) / 2;

rectWnd.OffsetRect(-rectWnd.left, -rectWnd.top);
m_rectNCTop = rectWnd;

m_rectNCTop.DeflateRect(uiCX, uiCY, uiCX, uiCenterOffset + uiVClientHeight + uiCY);

m_rectNCBottom = rectWnd;

m_rectNCBottom.DeflateRect(uiCX, uiCenterOffset + uiVClientHeight + uiCY, uiCX, uiCY);

lpncsp->rgrc[0].top += uiCenterOffset;
lpncsp->rgrc[0].bottom -= uiCenterOffset;

lpncsp->rgrc[0].left += uiCX;
lpncsp->rgrc[0].right -= uiCY;
}
void CCenterEdit::OnNcPaint()
{
Default();
CWindowDC dc(this);
CBrush Brush(RGB(6, 213, 226));


dc.FillRect(m_rectNCBottom, &Brush);
dc.FillRect(m_rectNCTop, &Brush);
}
CEdit未改变大小时

CEdit改变时,无法编辑,填充区域不全
...全文
130 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
schlafenhamster 2020-09-18
  • 打赏
  • 举报
回复
多行 edit

// CVertCenterEdit message handlers
void CVertCenterEdit::SetEditVertCenter()
{ // set rc.Height() = size.cy !
CRect rc;
GetClientRect(&rc);
CDC* pDC=GetDC();
CFont *pFont =GetFont();
HGDIOBJ hOld = pDC->SelectObject(pFont);//&m_FontVertEdit);
//
SIZE size;
GetTextExtentPoint32W (pDC->m_hDC, L"f", 1, &size) ;//34
pDC->SelectObject(hOld);
//
afxDump << rc.Height() << "\n";// 76
//
if(rc.Height() > size.cy)
rc.DeflateRect(0, (rc.Height() - size.cy)/2);
else
afxDump << "rc.Height too small !" << "\n";
//
SetRect(&rc);
}

void CVertCenterEdit::PreSubclassWindow()
{
// TODO: Add your specialized code here and/or call the base class
#ifndef EDIT_NO_FONT
m_FontVertEdit.CreateFont(34, 0, 0, 0, FW_BOLD, FALSE, FALSE, FALSE
, ANSI_CHARSET, OUT_TT_PRECIS, CLIP_TT_ALWAYS, PROOF_QUALITY
, VARIABLE_PITCH | FF_SWISS, TEXT("SANS SERIF"));
SetFont(&m_FontVertEdit);
#endif
SetEditVertCenter();
CEdit::PreSubclassWindow();
}
zgl7903 2020-09-17
  • 打赏
  • 举报
回复
大小改变 试试 处理 WM_WINDOWPOSCHANGING 或 WM_SZE 引发重绘

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧