CEdit用了一个垂直居中的类后,怎么边框没法改变?

tixisong 2014-09-27 09:58:31
最终效果要垂直左右都居中,失去和获得焦点改变边框及背景颜色。贴代码:

// MyEdit.cpp : 实现文件
//

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


// CMyEdit

IMPLEMENT_DYNAMIC(CMyEdit, CEdit)

CMyEdit::CMyEdit()
{
m_BkColor = RGB(220,229,240);
m_TxtColor = RGB(7,83,181);
m_BkBrush.CreateSolidBrush(m_BkColor);

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_s(lf.lfFaceName,_T("宋体")); //字体名=@system

// CFont myFont; //定义字体对象
m_font.CreateFontIndirect(&lf); //创建逻辑字体



//CEdit::SetFont(&m_font);

}

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




BEGIN_MESSAGE_MAP(CMyEdit, CEdit)
ON_WM_CTLCOLOR_REFLECT()
ON_CONTROL_REFLECT(EN_CHANGE, &CMyEdit::OnEnChange)
ON_WM_NCCALCSIZE()
ON_WM_NCPAINT()
ON_WM_SETFOCUS()
END_MESSAGE_MAP()


void CMyEdit::SetTextFont()
{
CEdit::SetFont(&m_font);
Invalidate(TRUE);
}


void CMyEdit::SetBkColor(COLORREF clr)
{
m_BkColor = clr;
}
void CMyEdit::SetTxtColor(COLORREF clr)
{
m_TxtColor = clr;
}

HBRUSH CMyEdit::CtlColor(CDC* pDC, UINT nCtlColor)
{
pDC ->SetBkMode(TRANSPARENT);
pDC ->SetTextColor(m_TxtColor);
m_BkBrush.Detach();
m_BkBrush.CreateSolidBrush(m_BkColor);

CRect rect;
GetClientRect(rect);
rect.InflateRect(1,3,3,1);


pDC ->FrameRect(rect,&m_BkBrush2);

if(m_rectNCTop.IsRectEmpty())
{
SetWindowPos(NULL, 0, 0, 0, 0, SWP_NOOWNERZORDER | SWP_NOSIZE | SWP_NOMOVE | SWP_FRAMECHANGED);
}
return (HBRUSH)m_BkBrush.GetSafeHandle();
}


void CMyEdit::OnEnChange()
{
Invalidate();
}

void CMyEdit::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS FAR* lpncsp)
{
CRect rectWnd, rectClient;

//calculate client area height needed for a font
CFont *pFont = GetFont();
CRect rectText;
rectText.SetRectEmpty();

CDC *pDC = GetDC();

CFont *pOld = pDC->SelectObject(pFont);
pDC->DrawText(_T("Ky"), rectText, DT_CALCRECT | DT_LEFT);
UINT uiVClientHeight = rectText.Height();

pDC->SelectObject(pOld);
ReleaseDC(pDC);

//calculate NC area to center text.

GetClientRect(rectClient);
GetWindowRect(rectWnd);


ClientToScreen(rectClient);

UINT uiCenterOffset = (rectClient.Height() - uiVClientHeight) / 2;
UINT uiCY = (rectWnd.Height() - rectClient.Height()) / 2;
UINT uiCX = (rectWnd.Width() - rectClient.Width()) / 2;

rectWnd.OffsetRect(-rectWnd.left, -rectWnd.top);
m_rectNCTop = rectWnd;

m_rectNCTop.DeflateRect(uiCX, uiCY, uiCX, uiCenterOffset + uiVClientHeight + uiCY);

m_rectNCBottom = rectWnd;

m_rectNCBottom.DeflateRect(uiCX, uiCenterOffset + uiVClientHeight + uiCY, uiCX, uiCY);

lpncsp->rgrc[0].top +=uiCenterOffset ;
lpncsp->rgrc[0].bottom -= uiCenterOffset;

lpncsp->rgrc[0].left +=uiCX;
lpncsp->rgrc[0].right -= uiCY;

}

void CMyEdit::OnNcPaint()
{
Default();

CWindowDC dc(this);

CBrush Brush(m_BkColor);
dc.FillRect(m_rectNCBottom, &Brush);
dc.FillRect(m_rectNCTop, &Brush);

/*CRect rect;
GetWindowRect(&rect);
rect.DeflateRect(3,3);
dc.FrameRect(rect,&m_BkBrush2);*/

}
void CMyEdit::PreSubclassWindow()
{
ModifyStyle(0,ES_CENTER);
CEdit::PreSubclassWindow();
}

void CMyEdit::OnSetFocus(CWnd* pOldWnd)
{
CEdit::OnSetFocus(pOldWnd);
HDC hDC=::GetWindowDC(m_hWnd);
CRect rc;
::GetWindowRect(m_hWnd,&rc);
rc=CRect(0,0,rc.right-rc.left,rc.bottom-rc.top);
HBRUSH m_HotOrderBrush1=::CreateSolidBrush(0xFDC860);
HBRUSH m_HotOrderBrush2=::CreateSolidBrush(0xE7AC49);
::FrameRect(hDC,&rc,m_HotOrderBrush1);
rc.InflateRect(-1,-1);
::FrameRect(hDC,&rc,m_HotOrderBrush2);
}


用了几个网上的垂直代码,垂直居中解决了,但OnSetFocus及OnNcPaint中改变边框却没效果了,谁遇到过?
...全文
146 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
tixisong 2014-09-28
  • 打赏
  • 举报
回复
引用 11 楼 schlafenhamster 的回复:
void CMyEdit::OnNcPaint() { // TODO: Add your message handler code here CWindowDC dc(this); CRect rect; GetWindowRect(&rect); CBrush Brush(m_BkColor); // dc.FillRect(m_rectNCBottom, &Brush); dc.FillRect(m_rectNCTop, &Brush); // afxDump << rect << "\n";//(L 295, T 532, R 502, B 595) rect.OffsetRect(-rect.left,-rect.top); dc.Draw3dRect(&rect,RGB(0,0,0),RGB(255,255,255)); // Do not call CEdit::OnNcPaint() for painting messages }
按你的方法是可以的。但这个类GDI资源泄漏很严重,感觉没用到几个gdi对象,我不知道问题出来哪里?
tixisong 2014-09-27
  • 打赏
  • 举报
回复
引用 1 楼 xianglitian 的回复:
你这个控件重绘过 是不是没有绘制相应的状态
我只试了一下,在OnSetFocus及OnNcPaint中画过,可是没效果
向立天 2014-09-27
  • 打赏
  • 举报
回复
你这个控件重绘过 是不是没有绘制相应的状态
schlafenhamster 2014-09-27
  • 打赏
  • 举报
回复
void CMyEdit::OnNcPaint() { // TODO: Add your message handler code here CWindowDC dc(this); CRect rect; GetWindowRect(&rect); CBrush Brush(m_BkColor); // dc.FillRect(m_rectNCBottom, &Brush); dc.FillRect(m_rectNCTop, &Brush); // afxDump << rect << "\n";//(L 295, T 532, R 502, B 595) rect.OffsetRect(-rect.left,-rect.top); dc.Draw3dRect(&rect,RGB(0,0,0),RGB(255,255,255)); // Do not call CEdit::OnNcPaint() for painting messages }
schlafenhamster 2014-09-27
  • 打赏
  • 举报
回复
void CMyEdit::OnPaint() { CEdit::OnPaint();// for painting messages CWindowDC dc(this); CRect rc; GetWindowRect(rc); rc.OffsetRect(-rc.left,-rc.top); rc.DeflateRect(1,1); int tmpID=GetDlgCtrlID();// int m_FocusAt afxDump << tmpID << ";" << m_FocusAt << "\n"; if(m_FocusAt==tmpID) {// red border dc.FrameRect(rc,&m_BkBrush2); } else {// no border dc.FrameRect(rc,&m_BkBrush); } } // void CMyEdit::OnKillFocus(CWnd* pNewWnd) { CEdit::OnKillFocus(pNewWnd); m_FocusAt=-1; Invalidate(); } void CMyEdit::OnSetFocus(CWnd* pOldWnd) { CEdit::OnSetFocus(pOldWnd); m_FocusAt=GetDlgCtrlID(); Invalidate(); }
schlafenhamster 2014-09-27
  • 打赏
  • 举报
回复
用的就是你的程序. focus 是在 OnPaint 中画, 你那个红框是在 NcPaint 中画的, 不行的
tixisong 2014-09-27
  • 打赏
  • 举报
回复
引用 7 楼 pcradio 的回复:
边框颜色的绘制你需要放在
HBRUSH CEdit::CtlColor(CDC* pDC, UINT nCtlColor)
里面,设置一个成员变量m_bFocused = FALSE, 拦截WM_SETFOCUS 和WM_KILLFOCUS,在里面改变m_bFocused的值,然后在绘制边框的时候,在 CtlColor中根据m_bFocus的值绘制相应颜色的边框
你说的这个我知道,我调用了OnNcCalcSize这个消息处理垂直居中,然后不管在哪里画边框都没有作用。
阿源是少年 2014-09-27
  • 打赏
  • 举报
回复
边框颜色的绘制你需要放在
HBRUSH CEdit::CtlColor(CDC* pDC, UINT nCtlColor)
里面,设置一个成员变量m_bFocused = FALSE, 拦截WM_SETFOCUS 和WM_KILLFOCUS,在里面改变m_bFocused的值,然后在绘制边框的时候,在 CtlColor中根据m_bFocus的值绘制相应颜色的边框
tixisong 2014-09-27
  • 打赏
  • 举报
回复
引用 5 楼 schlafenhamster 的回复:
你的这个截图好像是垂直居中,是怎么做的?那个红色边框能不能放大,和Edit框一样大小,鼠标移进移出(或获取焦点失去焦点)有不同效果。
schlafenhamster 2014-09-27
  • 打赏
  • 举报
回复
schlafenhamster 2014-09-27
  • 打赏
  • 举报
回复
CRect rect; GetClientRect(rect); // rect.InflateRect(1,3,3,1); ??? rect.InflateRect(1,1); // red border pDC ->FrameRect(rect,&m_BkBrush2);
schlafenhamster 2014-09-27
  • 打赏
  • 举报
回复
"怎么边框没法改变" 是指 BORDER?

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧