垂直中心编译框的创建

原创 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;


Mysql垂直分区和水平分区

Mysql垂直分区和水平分区数据库扩展大概分为以下几个步骤: 读写分离: 当数据库访问量还不是很大的时候,我们可以适当增加服务器,数据库主从复制的方式将读写分离; 垂直分区: 当写入操作一旦增加的...
  • u012546203
  • u012546203
  • 2017-03-22 08:45:20
  • 627

JQuery弹框,自定义弹窗

因为项目要用到弹框,所以就在网上搜了一下关于JQuery弹框,推荐使用artDialog的JQuery插件,就学习了用法。找了一下,没有针对我这种菜鸟级的,试了几次,试出来了。下面是分享一下我学习过程...
  • u013793732
  • u013793732
  • 2015-12-07 19:19:01
  • 1852

如何将Android ImageView放到布局的中心

靠左上显示 是默认的  你如果想居中的话 在LinearLayout加上如下属性: android:layout_gravity="center" 而且LinearLayout的宽度/高度...
  • xwygn
  • xwygn
  • 2011-12-10 13:08:47
  • 900

flex创建的字体属性框

  • 2011年11月15日 15:53
  • 4KB
  • 下载

垂直外边距合并的问题及解决方法

外边距合并及解决办法
  • qq_40541995
  • qq_40541995
  • 2017-10-09 13:55:26
  • 173

垂直中心扭曲算法

private void updateMesh(float fraction) { float[] src = mOrig; float[] dst = mVerts; ...
  • kingfisher20031
  • kingfisher20031
  • 2015-01-05 14:26:38
  • 137

垂直中心扭曲

private void updateMesh(float fraction) { float[] src = mOrig; float[] dst = mVerts;...
  • kingfisher20031
  • kingfisher20031
  • 2015-01-05 14:22:23
  • 205

C# Excel 行高,列宽,合并单元格,单元格边框线,冻结(转载) - 关于C#操作EXCLE常见操作比较全的

private _Workbook _workBook = null; private Worksheet _workSheet = null; private Excel.Application _...
  • liuci3234
  • liuci3234
  • 2014-05-14 16:47:13
  • 913

弹框水平垂直居中

在内容大于一屏时,弹框在屏幕上保持水平垂直居中
  • tjcjava
  • tjcjava
  • 2017-09-28 14:10:57
  • 91

input button select 垂直对齐问题

测试在这些控件中设置css的:  vertical-align:middle;即可解决ie8/ff5/safari5且测试发现,在浏览器中,ie/ff的button border是包括在height内...
  • qidizi
  • qidizi
  • 2013-04-11 21:27:48
  • 532
收藏助手
不良信息举报
您举报文章:垂直中心编译框的创建
举报原因:
原因补充:

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