垂直中心编译框的创建

原创 2014年10月02日 09:59:31

1.编辑框(CEdit)只有水平中心的属性.

2.做一个垂直中心的编辑框,需要重新计算客户区. 即要调用 OnNcCalcSize

3.带 SWP_FRAMECHANGED 标记的 SetWindowPos 可以调用 OnNcCalcSize

4. PreSubclassWindow() 中调用 SetWindowPos 可以成功,但没作用即:  OnNcCalcSize 没被调用

5. 通过 Timer 来 成功调用 SetWindowPos 

下面是代码:

// MyEdit.cpp : implementation file
//


#include "stdafx.h"
#include "UiButton.h"
#include "MyEdit.h"


#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif


/////////////////////////////////////////////////////////////////////////////
// CMyEdit
IMPLEMENT_DYNAMIC(CMyEdit, CEdit)


CMyEdit::CMyEdit()
{
    m_TxtColor = RGB(7,83,200);
    m_BkBrush.CreateSolidBrush(RGB(220,229,240));
    m_BkBrush2.CreateSolidBrush(RGB(255,0,0));
 
    LOGFONT  lf;                   //定义字体结构  
    lf.lfWeight=10;                //字体磅数=10  
    lf.lfHeight=40;                //字体高度56    
    lf.lfWidth=15;                 //字体宽度20  
    lf.lfUnderline=FALSE;          //无下划线  
    lf.lfStrikeOut=FALSE;          //无删除线  
    lf.lfItalic=FALSE;             //非斜体  
    lf.lfEscapement=0;
    lf.lfCharSet=DEFAULT_CHARSET;  //使用缺省字符集  
    _tcscpy(lf.lfFaceName,_T("宋体"));  //字体名=@system  
 
    m_font.CreateFontIndirect(&lf);  //创建逻辑字体 
//
m_FocusAt=-1;
}


CMyEdit::~CMyEdit()
{
    m_BkBrush.DeleteObject();
}


BEGIN_MESSAGE_MAP(CMyEdit, CEdit)
//{{AFX_MSG_MAP(CMyEdit)
ON_WM_CTLCOLOR_REFLECT()
ON_WM_NCCALCSIZE()
ON_WM_NCPAINT()
ON_WM_SETFOCUS()
ON_WM_KILLFOCUS()
ON_WM_TIMER()
ON_WM_PAINT()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()


/////////////////////////////////////////////////////////////////////////////
// CMyEdit message handlers
void CMyEdit::SetDefaultFont()
{
    CEdit::SetFont(&m_font);
    Invalidate(TRUE);
}
 
HBRUSH CMyEdit::CtlColor(CDC* pDC, UINT nCtlColor) 
{
// TODO: Change any attributes of the DC here
    pDC ->SetBkMode(TRANSPARENT);
    pDC ->SetTextColor(m_TxtColor);
//
    return (HBRUSH)m_BkBrush.GetSafeHandle();
}
//
// client area should be excluded!
void CMyEdit::OnNcPaint() 
{
    CWindowDC dc(this);
//
CRect rc;
    GetWindowRect(&rc);
rc.OffsetRect(-rc.left,-rc.top);
CRgn rgn;
rgn.CreateRectRgnIndirect(&rc);
//
CRect rc1;
    GetClientRect(&rc1);
rc1.OffsetRect((rc.Width()-rc1.Width())/2,(rc.Height()-rc1.Height())/2);
CRgn rgn1;
rgn1.CreateRectRgnIndirect(&rc1);
//
rgn.CombineRgn(&rgn,&rgn1,RGN_XOR);
    dc.FillRgn(&rgn, &m_BkBrush);
//
dc.Draw3dRect(&rc,RGB(0,0,0),RGB(255,255,255));
// Do not call CEdit::OnNcPaint() for painting messages
}
//
void CMyEdit::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS FAR* lpncsp) 
{// calculate client area height needed for a font
CWindowDC dc(this);


    CRect rcEdit;


    CFont *pFont = GetFont();
    CFont *pOldFont = dc.SelectObject(pFont);
// get text area (height)
    dc.DrawText(_T("Wy"), rcEdit, DT_CALCRECT | DT_LEFT);
// free
    dc.SelectObject(pOldFont);
// calculate NC area to center text.
    CRect rcWnd;
GetWindowRect(rcWnd);
//
    CRect rcClient;
GetClientRect(rcClient);
    ClientToScreen(rcClient);
 
    int OffsetY = (rcClient.Height() - rcEdit.Height()) / 2;
    int CX = (rcWnd.Width() - rcClient.Width()) / 2;
 
// An application should modify the rgrc[0] rectangle 
// to reflect the size and position of the client area.
    lpncsp->rgrc[0].top    += OffsetY;
    lpncsp->rgrc[0].bottom -= OffsetY;
// 
    lpncsp->rgrc[0].left  += CX;//2
    lpncsp->rgrc[0].right -= CX;//2
// CEdit::OnNcCalcSize(bCalcValidRects, lpncsp);
}


void CMyEdit::PreSubclassWindow() 
{
SetTimer(1,1,0);
CEdit::PreSubclassWindow();
}


void CMyEdit::OnTimer(UINT nIDEvent) 
{
// TODO: Add your message handler code here and/or call default
KillTimer(1);
    ModifyStyle(0,ES_CENTER);
SetWindowPos(NULL,0,0,0,0,SWP_NOOWNERZORDER|SWP_NOSIZE|SWP_NOMOVE|SWP_FRAMECHANGED);
//
CEdit::OnTimer(nIDEvent);
}
//
void CMyEdit::OnKillFocus(CWnd* pNewWnd) 
{
CEdit::OnKillFocus(pNewWnd);
m_FocusAt=-1;
DrawFocus();
}
//
void CMyEdit::OnSetFocus(CWnd* pOldWnd) 
{
CEdit::OnSetFocus(pOldWnd);
m_FocusAt=GetDlgCtrlID();
DrawFocus();
}
//
void CMyEdit::DrawFocus()
{
CWindowDC dc(this);
CRect rc;
GetWindowRect(rc);
rc.OffsetRect(-rc.left,-rc.top);
rc.DeflateRect(1,1);
if(m_FocusAt==GetDlgCtrlID())
{//  red border
dc.FrameRect(rc,&m_BkBrush2);// red
}
else
{// no border
dc.FrameRect(rc,&m_BkBrush);
}
}
//
void CMyEdit::OnPaint() 
{
CEdit::OnPaint();// for painting messages
// afxDump << "OnPaint()" << "\n";
CWindowDC dc(this);
CRect rc;
GetWindowRect(rc);
rc.OffsetRect(-rc.left,-rc.top);
rc.DeflateRect(1,1);
int tmpID=GetDlgCtrlID();
// afxDump << tmpID << ";" << m_FocusAt << "\n";
if(m_FocusAt==tmpID)
{//  draw red border
dc.FrameRect(rc,&m_BkBrush2);
}
else
{// erase border
dc.FrameRect(rc,&m_BkBrush);
}
}

// 变量 .h

protected:
CBrush   m_BkBrush;
CBrush   m_BkBrush2;
    COLORREF m_TxtColor;
CFont    m_font;
int      m_FocusAt;


遮罩 + 登陆框垂直居中显示

在线演示点击注册、登录按钮时时显示灰色透明遮罩和登陆弹出框。弹出框居中显示在body下面写遮罩(和header、footer等并齐)。HTML代码: 登陆框 × CSS样式:...
  • erdouzhang
  • erdouzhang
  • 2017年03月06日 16:45
  • 249

自适应弹出框-垂直居中

自适应弹出框 .box-mask { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: #...
  • liyuedan
  • liyuedan
  • 2015年05月12日 17:37
  • 8199

通过 WM_NCCALCSIZE 消息设置VC组合框或编辑框文本垂直居中

设置组合框的文本垂直居中显示,除了重绘之外,还可以直接在其父对话框中通过在 WM_NCCALCSIZE 消息的响应函数中来搞定它,首先可以通过SetItemHeight设置组合框高度,然后进行下面的操...
  • yaoyuanyylyy
  • yaoyuanyylyy
  • 2013年08月05日 21:32
  • 1475

设置页面元素垂直居中的几种方法

一、对于行内元素 若该行内元素只有一行,且该行内元素父元素的高度一定,可以设置该行内元素的line-height属性,属性值为父元素的高度。 二、对于块元素 通过设置vertical-a...
  • MOONCOM
  • MOONCOM
  • 2017年02月07日 11:22
  • 1256

bootstrap 模态框(modal)实现水平垂直居中显示 含具体分析

欢迎来到Altaba的博客  2017年1月22日        众所周知,bootstrap是一款非常实用的CSS框架(主要用于样式的快速搭建),由于其简洁,美观,快捷,响应式等特点备受大家喜欢,但...
  • Altaba
  • Altaba
  • 2017年01月22日 17:10
  • 11721

bootstrap modal 垂直居中对齐

bootstrap modal 垂直居中对齐   文章参考 http://www.bubuko.com/infodetail-666582.html http://v3...
  • yucaifu1989
  • yucaifu1989
  • 2016年05月16日 15:55
  • 11385

Bootstrap登录框自适应水平居中+垂直居中

用户登录 /*web background*/ .container{ ...
  • shenzhen_zsw
  • shenzhen_zsw
  • 2017年07月18日 22:31
  • 2631

不定宽块状元素居中

为什么选择方法一加入table标签? 是利用table标签的长度自适应性---即不定义其长度也不默认父元素body的长度(table其长度根据其内文本长度决定),因此可以看做一个定宽度块元素,然后再利...
  • qq_33665647
  • qq_33665647
  • 2016年07月30日 21:43
  • 227

bootstrap modal弹出框的垂直居中

bootstrap modal弹出框的垂直居中本人前端小菜鸡一只,公司项目尝试采用bootstrap,我身先士卒为同事趟“坑”,无奈UI妹子刁难非得让modal弹出框垂直居中,为了前端开发岗位的荣誉,...
  • baidu_35407267
  • baidu_35407267
  • 2016年06月23日 22:49
  • 1026

bootstrap模态框(modal)垂直居中

相信modal垂直居中的问题,大家都百度、谷歌过,或者自己研究过。modal框默认是在屏幕上方左右居中显示,但是有的人偏偏去搞成上下左右都居中,大屏幕好像没问题,但是移动端就会导致modal框变形。所...
  • u010884130
  • u010884130
  • 2016年03月08日 09:56
  • 2368
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:垂直中心编译框的创建
举报原因:
原因补充:

(最多只允许输入30个字)