请教个问题,自己绘制了一个像组合框的编辑框,就是重绘编辑框,把编辑框分成了两部分,在右面部分显示一个黑色小三角,为何鼠标点击编辑框内部的时候,右边小三角看不到了,能帮忙分析下是什么情况吗。
你的重绘代码怎么写的,编辑框获得焦点它的客户区绘图完了然后再调用你的代码才行。
鼠标不在编辑框内显示带黑色小三角
鼠标点击编辑框内黑色小三角不显示了
是神马原因?急求!!!
// SelfDraw.cpp : implementation file
//
#include "stdafx.h"
#include "DrawEdit.h"
#include "SelfDraw.h"
#ifdef DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE_;
#endif
IMPLEMENT_DYNAMIC(CSelfDraw, CEdit)
/////////////////////////////////////////////////////////////////////////////
// CSelfDraw
CSelfDraw::CSelfDraw()
{
m_nFontSize = 200;
m_clrText = RGB(0, 0, 0);
m_clrBk = RGB(255, 255, 255);
m_bItalic = FALSE;
m_bBold = FALSE;
m_bUnderLine = FALSE;
m_bFocus = FALSE;
m_bOver = FALSE;
m_csFontName = _T("宋体");
m_language = ENGLISH;
m_pFont = NULL;
//
m_nBorderWidth = 1;
m_clrNormalInFrame = RGB(174,174,202);
m_clrNormalOutFrame = RGB(102,102,153);
m_clrOverInFrame = RGB(122, 189, 32);
m_clrOverOutFrame = RGB(0, 176, 88);
m_clrFocusInFrame = RGB(255, 102, 51);
m_clrFocusOutFrame = RGB(255, 163, 132);
m_clrDiableInFrame = RGB(128, 128, 128);
m_clrDiableOutFrame = RGB(96, 96, 96);
m_clrLeftTopMarginShadow = m_clrBk;
m_nLeftMargin = 0;
m_nTopMargin = 0;
m_nRightMargin = 0;
m_nBottomMargin = 0;
m_EdtRect = CRect(0,0,0,0);
m_LRect = CRect(0,0,0,0);
m_RRect = CRect(0,0,0,0);
}
CSelfDraw::~CSelfDraw()
{
if(m_pFont)
{
delete m_pFont;
m_pFont = NULL;
}
}
BEGIN_MESSAGE_MAP(CSelfDraw, CEdit)
//{{AFX_MSG_MAP(CSelfDraw)
ON_WM_CTLCOLOR_REFLECT()
ON_CONTROL_REFLECT(EN_KILLFOCUS, OnKillfocus)
ON_CONTROL_REFLECT(EN_SETFOCUS, OnSetfocus)
ON_WM_MOUSEMOVE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CSelfDraw message handlers
HBRUSH CSelfDraw::CtlColor(CDC* pDC, UINT nCtlColor)
{
DrawEditFrame();
pDC->SetTextColor(m_clrText);
pDC->SetBkColor(m_clrBk);
pDC->SetBkMode(TRANSPARENT);
// Invalidate();
// TODO: 如果不应调用父级的处理程序,则返回非 null 画笔
return m_bkBrush;
}
void CSelfDraw::OnKillfocus()
{
m_bFocus = FALSE;
DrawEditFrame();
}
void CSelfDraw::OnSetfocus()
{
m_bFocus = TRUE;
DrawEditFrame();
}
void CSelfDraw::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
// 鼠标追踪
TRACKMOUSEEVENT mouseEvent;
mouseEvent.cbSize = sizeof(TRACKMOUSEEVENT);
mouseEvent.dwFlags = TME_HOVER | TME_LEAVE;
mouseEvent.dwHoverTime = 0;
mouseEvent.hwndTrack = m_hWnd;
_TrackMouseEvent(&mouseEvent);
CEdit::OnMouseMove(nFlags, point);
}
void CSelfDraw::OnMouseHover(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
m_bOver = TRUE;
DrawEditFrame();
//CEdit::OnMouseHover(nFlags, point);
}
void CSelfDraw::OnMouseLeave()
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
m_bOver = FALSE;
DrawEditFrame();
//CEdit::OnMouseLeave();
}
void CSelfDraw::SetTextColor( COLORREF clrText )
{
m_clrText = clrText;
}
void CSelfDraw::SetFontSize( int nFontSize )
{
m_nFontSize = nFontSize;
// 修改字体
SetFontHelper();
}
void CSelfDraw::SetFontSizePx( int nPxFontSize )
{
m_nFontSize = nPxFontSize * 6;
SetFontHelper();
}
void CSelfDraw::SetFontSizePt( int nPtFontSize )
{
CDC* pDC = this->GetDC();
// 计算磅值所对应的字体的逻辑高度
m_nFontSize = -MulDiv(nPtFontSize, pDC->GetDeviceCaps(LOGPIXELSY), 72);
// 修改字体
SetFontHelper();
}
void CSelfDraw::SetFontStyle( BOOL bBold/*=FALSE*/, BOOL bItalic/*=FALSE*/, BOOL bUnderLine/*=FALSE*/ )
{
m_bBold = bBold;
m_bItalic = bItalic;
m_bUnderLine = bUnderLine;
// 修改字体
SetFontHelper();
}
void CSelfDraw::SetBkColor( COLORREF clrBk )
{
m_clrBk = clrBk;
m_clrLeftTopMarginShadow = m_clrBk;
if(m_bkBrush.m_hObject)
{
m_bkBrush.DeleteObject();
}
m_bkBrush.CreateSolidBrush(m_clrBk);
}
void CSelfDraw::SetFontName( CString csFontName, BYTE language/*=ENGLISH*/ )
{
m_csFontName = csFontName;
m_language = language;
// 修改字体
SetFontHelper();
}
void CSelfDraw::SetFontHelper()
{
//if(m_pFont->m_hObject)
// m_pFont->DeleteObject();
if(m_pFont)
delete m_pFont;
m_pFont = new CFont;
CDC* pDC = this->GetDC();
LOGFONT lgFont;
lgFont.lfCharSet = m_language;
lgFont.lfClipPrecision = 0;
lgFont.lfEscapement = 0;
strcpy(lgFont.lfFaceName, m_csFontName);
lgFont.lfHeight = m_nFontSize;
lgFont.lfItalic = m_bItalic;
lgFont.lfOrientation = 0;
lgFont.lfOutPrecision = 0;
lgFont.lfPitchAndFamily = 2;
lgFont.lfQuality = 0;
lgFont.lfStrikeOut = 0;
lgFont.lfUnderline = m_bUnderLine;
lgFont.lfWidth = 0;
if(m_bBold)
lgFont.lfWeight = FW_BOLD;
else
lgFont.lfWeight = FW_NORMAL;
m_pFont->CreatePointFontIndirect(&lgFont);
SetFont(m_pFont);
}
void CSelfDraw::DrawEditFrame()
{
if(m_nBorderWidth==0)
return ;
// CRect m_EdtRect;
CDC* pDC = this->GetDC();
GetClientRect(&m_EdtRect);
m_LRect.SetRect( m_EdtRect.left, m_EdtRect.top, \
m_EdtRect.right-30, m_EdtRect.bottom ); //按钮主体区尺寸
m_RRect.SetRect( m_EdtRect.right-31, \
m_EdtRect.top, m_EdtRect.right, m_EdtRect.bottom ); //按钮选择区尺寸
// 留2个像素画内部阴影
int nLeft = m_nLeftMargin+2;
int nRight = m_nRightMargin + 2;
int nTop = m_nTopMargin + 2;
int nBottom = m_nBottomMargin + 2;
CPen pen;
int i=0;
pen.CreatePen(PS_SOLID, 1, m_clrBk);
CPen* pOldPen = pDC->SelectObject(&pen);
for(i=0; i<=nLeft; i++)
{
pDC->MoveTo(m_LRect.left-i, m_LRect.top-nTop);
pDC->LineTo(m_LRect.left-i, m_LRect.bottom+nBottom);
}
for(i=0; i<=nTop; i++)
{
pDC->MoveTo(m_LRect.left-nLeft, m_LRect.top-i);
pDC->LineTo(m_LRect.right+nRight, m_LRect.top-i);
}
for(i=0; i<=nRight; i++)
{
pDC->MoveTo(m_LRect.right+i, m_LRect.top-nTop);
pDC->LineTo(m_LRect.right+i, m_LRect.bottom+nBottom);
}
for(i=0; i<=nBottom; i++)
{
pDC->MoveTo(m_LRect.left-nLeft, m_LRect.bottom+i);
pDC->LineTo(m_LRect.right+nRight+1, m_LRect.bottom+i); // 右下角有一个像素未被填充,故多加1像素,原因未知
}
CPen penShadow;
penShadow.CreatePen(PS_SOLID, 1, m_clrLeftTopMarginShadow);
pDC->SelectObject(&penShadow);
pDC->MoveTo(m_LRect.left-nLeft, m_LRect.top-nTop);
pDC->LineTo(m_LRect.right+nRight+1, m_LRect.top-nTop);
pDC->MoveTo(m_LRect.left-nLeft, m_LRect.top-nTop+1);
pDC->LineTo(m_LRect.right+nRight+1, m_LRect.top-nTop+1);
pDC->MoveTo(m_LRect.left-nLeft, m_LRect.top-nTop);
pDC->LineTo(m_LRect.left-nLeft, m_LRect.bottom+nBottom+1);
pDC->SelectObject(pOldPen);
m_LRect.InflateRect(nLeft, nTop, nRight, nBottom);
//m_EdtRect.InflateRect(0, 0, 1, 1);
POINT m_pt[3], m_ptCentre; //箭头坐标(三个顶点)
m_ptCentre = m_RRect.CenterPoint(); //选择区中点位置
m_pt[0].x = m_ptCentre.x-3; //计算箭头坐标
m_pt[0].y = m_ptCentre.y-2;
m_pt[1].x = m_ptCentre.x+4;
m_pt[1].y = m_ptCentre.y-2;
m_pt[2].x = m_ptCentre.x;
m_pt[2].y = m_ptCentre.y+2;
pDC->SelectStockObject( BLACK_BRUSH ); //定义画刷(黑色)
CRgn rgn;
rgn.CreatePolygonRgn( m_pt, 3, ALTERNATE );
pDC->PaintRgn( &rgn ); //画选择区箭头
// 窗口禁用
// if(!IsWindowEnabled())
// {
// if(m_nBorderWidth>1)
// {
// for(int i=1; i<(int)m_nBorderWidth; i++)
// {
// m_EdtRect.InflateRect(1, 1);
// pDC->Draw3dRect(m_EdtRect, m_clrDiableInFrame, m_clrDiableInFrame);
// }
// }
// m_EdtRect.InflateRect(1, 1);
// pDC->Draw3dRect(m_EdtRect, m_clrDiableOutFrame, m_clrDiableOutFrame);
// ReleaseDC(pDC);
// return ;
// }
// 鼠标经过且有焦点
// if(m_bOver && m_bFocus)
// {
// if(m_nBorderWidth>1)
// {
// for(int i=1; i<(int)m_nBorderWidth; i++)
// {
// m_EdtRect.InflateRect(1, 1);
// pDC->Draw3dRect(m_EdtRect, m_clrFocusInFrame, m_clrFocusInFrame);
// }
// }
// m_EdtRect.InflateRect(1, 1);
// pDC->Draw3dRect(m_EdtRect, m_clrFocusOutFrame, m_clrFocusOutFrame);
// }
// 鼠标经过但没有焦点
// if(m_bOver && !m_bFocus)
// {
// if(m_nBorderWidth>1)
// {
// for(int i=1; i<(int)m_nBorderWidth; i++)
// {
// m_EdtRect.InflateRect(1, 1);
// pDC->Draw3dRect(m_EdtRect, m_clrOverInFrame, m_clrOverInFrame);
// }
// }
// m_EdtRect.InflateRect(1, 1);
// pDC->Draw3dRect(m_EdtRect, m_clrOverOutFrame, m_clrOverOutFrame);
// }
// 鼠标没有经过,即正常状态
// if(!m_bOver)
// {
// if(m_nBorderWidth>1)
// {
// for(int i=1; i<(int)m_nBorderWidth; i++)
// {
// m_LRect.InflateRect(0, 1);
// pDC->Draw3dRect(m_EdtRect, m_clrNormalInFrame, m_clrNormalInFrame);
// }
// }
// m_EdtRect.InflateRect(1, 1);
// pDC->Draw3dRect(m_EdtRect, m_clrNormalOutFrame, m_clrNormalOutFrame);
// }
ReleaseDC(pDC);
}
//////////////////////////////////////////////////////////////////////////
void CSelfDraw::SetBorderWidth( UINT uborderWidth )
{
if(uborderWidth<0)
return ;
m_nBorderWidth = uborderWidth;
DrawEditFrame();
}
void CSelfDraw::SetNormalFrameColor( COLORREF clrIn, COLORREF clrOut/*=RGB(255, 255, 255)*/ )
{
m_clrNormalInFrame = clrIn;
m_clrNormalOutFrame = clrOut;
DrawEditFrame();
}
void CSelfDraw::SetOverFrameColor( COLORREF clrIn, COLORREF clrOut/*=RGB(255, 255, 255)*/ )
{
m_clrOverInFrame = clrIn;
m_clrOverOutFrame = clrOut;
DrawEditFrame();
}
void CSelfDraw::SetFocusFrameColor( COLORREF clrIn, COLORREF clrOut/*=RGB(255, 255, 255)*/ )
{
m_clrFocusInFrame = clrIn;
m_clrFocusOutFrame = clrOut;
DrawEditFrame();
}
void CSelfDraw::SetDisableFrameColor( COLORREF clrIn, COLORREF clrOut/*=RGB(255, 255, 255)*/ )
{
m_clrDiableInFrame = clrIn;
m_clrDiableOutFrame = clrOut;
DrawEditFrame();
}
void CSelfDraw::SetNewMargins( UINT nLeft, UINT nTop, UINT nRight, UINT nBottom )
{
m_nLeftMargin = nLeft;
m_nTopMargin = nTop;
m_nRightMargin = nRight;
m_nBottomMargin = nBottom;
DrawEditFrame();
}
void CSelfDraw::SetLeftTopMarginShadowColor( COLORREF clrLeftTopMaginShadow )
{
m_clrLeftTopMarginShadow = clrLeftTopMaginShadow;
}
void CSelfDraw::SetTextVCenter()
{
int nTextHeight = m_nFontSize/6;
CRect m_EdtRect;
GetClientRect(&m_EdtRect);
//int nHeightMargin = (m_EdtRect.Height()-nTextHeight)/2;
int nHeightMargin = m_EdtRect.Height() - nTextHeight;
if(nHeightMargin<0)
SetNewMargins(m_nLeftMargin+2, m_nTopMargin - nHeightMargin, m_nRightMargin+1, m_nBottomMargin-nHeightMargin);
else
SetNewMargins(m_nLeftMargin+2, m_nTopMargin + nHeightMargin + 2, m_nRightMargin+1, m_nBottomMargin);
}
BOOL CSelfDraw::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: 在此添加专用代码和/或调用基类
cs.style &= ~WS_BORDER;
cs.dwExStyle &= ~WS_EX_CLIENTEDGE;
return CEdit::PreCreateWindow(cs);
}
这个是自己加的重绘的类