CEdit属性:
在MulitLine时,Edit分为三层次:NC,Client(无字区域), 文字区域(SetRect)
在SingleLine时,Edit只分为NC与Client区域,即Client区域和文字区域重合(此时SetRect无效)
GetRect,SetRect --设置文字区域,从client中再减去一块,只对多行有效? 单行时两者始终重合。ES_MULTILINE,ES_WANTRETURN!
WM_NCCALCSIZE: LPRECT rc = (LPRECT)lParam; 计算非客户区
CRect rctText;
::SendMessage(hEditDir, EM_GETRECT, 0, (LPARAM)&rctText);
rctText.OffsetRect(0, 10);
::SendMessage(hEditDir, EM_SETRECT, 0, (LPARAM)&rctText);
子类化Edit窗口后,由于Edit窗口已经创建好了,自己的EditProc是收不到WM_NCCALCSIZE时,因此可以在子类化后Move一下Edit窗口,以重新触发这个消息
CEdit绘制顺序:
WM_NCPAINT: multi line时,ncpaint会刷掉客户区,因此需要注意剪裁; single line时,想刷掉客户区都刷不掉
EraseBk -- 刷掉 CLIENT 区域(在单行模式没用,因为跟文字区域重合了,文字区域是最后绘制的)
WM_CTLCOLOR nCtlColor == CTLCOLOR_EDIT; 这里刷掉文字区域背影;(这里可以直接绘,但是返回NULL笔刷,或者不绘制但返回一个非NULL刷子)
WM_PAINT不会弄???
case WM_NCPAINT:
{
HDC hdc;
hdc = GetDCEx(hwnd, (HRGN)wParam, DCX_WINDOW|DCX_INTERSECTRGN);
// Paint into this DC
ReleaseDC(hwnd, hdc);
}
CEdit 非客户区,客户区,文字区