一般创建单行编辑控件后,文本显示都是靠上方显示的:
查了好多资料,最后得出单行编辑控件要想文本显示在垂直居中只有重绘了,
这就要控件子类化,
今天我在查看编辑控件消息是发现了.EM_SETRECT这个消息,
EM_SETRECT消息
设置多行编辑控件 的格式矩形 。 格式设置矩形是控件在其中绘制文本的限制矩形。 限制矩形与编辑控件窗口的大小无关。
此消息仅由多行编辑控件处理。 可以将此消息发送到编辑控件或富编辑控件。
所以就想,既然单行不行,就创建多行的样式嘛,干嘛非要创建单行呢
于是:
HINSTANCE hInstance = GetModuleHandle(NULL);
HWND hEdit = CreateWindowEx(WS_EX_CLIENTEDGE,
TEXT("Edit"), nullptr,
WS_VISIBLE | WS_CHILD | ES_MULTILINE | ES_LEFT | ES_AUTOHSCROLL,
10, 10, 200, 30,
hWnd, (HMENU)1001,hInstance , 0);
这样创建出来还是单行编辑控件一样的外观嘛.
在发关EM_SETRECT消息
RECT rcEdit;
GetClientRect(hEdit, &rcEdit); //获得编辑控件客服区大小
OffsetRect(&rcEdit, 2, 4); //向右偏移2,向下偏移4个像素
SendMessage(hEdit, EM_SETRECT, 0, (LPARAM)&rcEdit);//设置文本显示的矩形区域
没设置的效果
设置后的效果
这样就得到文本垂直居中的效果
这样虽然得到想相的效果,但是有点就是在WM_SIZE中移动控件后,
控件重绘后又回到以前的显示位置,
所以要在控件移动后才重新设置文本显示矩形区域位置
HWND hEdit = GetDlgItem(hWnd, 1001);
MoveWindow(hEdit, 10, 10, 300, 30, 1);
RECT rcEdit;
GetClientRect(hEdit, &rcEdit);
OffsetRect(&rcEdit, 2, 4);
SendMessage(hEdit, EM_SETRECT, 0, (LPARAM)&rcEdit);