垂直中心编译框的创建

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


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

垂直B2C困境之乐蜂-探索新模式-以明星为中心提供个性化产品

垂直B2C困境之乐蜂:不再纠结,以明星为中心 http://www.sina.com.cn  2012年08月09日 00:28  新浪科技微博 乐蜂网CEO王立成   《...

Java_Swing图形界面-1选项卡的创建-2使其靠左垂直对齐

Java_Swing图形界面-1选项卡的创建-2使其靠左垂直对齐

《jquery视差滚动专题》使用jQuery创建的垂直视差背景

在近现代的网页设计最大的趋势之一是利用视差滚动效应。当把一个网站的滚动功能相结合时,视差滚动效果可以有一个强烈的视觉冲击,你可能已经看到现在不少网站上的视差效果。我也写过这方面的文章,jquery实现...

Bootstrap创建垂直滚动监听

Bootstrap Example body { position: relative; } #section1 {padding-top:50px...

HTML基础 form-textarea创建带有水平垂直滚动条的多行文本框并设置其大小

镇场诗:慈心积善融学习,技术誓为大家学。善心速造多好事,前人栽树后乘凉。我今于此写经验,愿见文者得启发。 ———————————————————————————————————————————————...

使用jQuery创建的垂直视差背景

根据站长百科:视差是一个明显的位移或在明显位置视线沿着两条不同的线路观看对象的差异性。 在我的演示,背景将开始与一个城市,和背后,丘陵,山地和天空。当用户向下滚动,我们的影响将会给他们的向上移动...

GdiplusFlat(10)自绘Edit Control边框的实现(附Edit Control垂直居中问题)

本博文由CSDN博主zuishikonghuan所作,版权归zuishikonghuan所有,转载请注明出处: 在上几篇中,我们说到了通过GdipCreateFromHDC函数将HDC(设备上下文句柄...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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