按钮上用dc输出文字,文字被遮住

时间:2023-02-10 21:57:44
大家好
我的需求是用cbuttonst定义了一个按钮m_bt
给这个按钮自定义一个标题,用dc  textout的方法来输出
实现方法是这样的
CButtonST  m_bt;
m_bt.GetDC()->TextOut(100,100,_T(“aaaa”));
但是输出的文本aaaa会被按钮挡住(偶尔会刷出来一下,字是在按钮上面,但是异动按钮,或者遮挡等其他操作,字又被按钮盖住)
请教大家有没有办法
我现在只能用最原始的m_bt.SetWindowText(str)的方法,但是我感觉这个方法不好
请大家帮帮我,谢谢了

7 个解决方案

#1


按钮上用dc输出文字,文字被遮住  真搞不懂你为啥说  SetWindowText不好。在btn的paint里面就是获取文字 然后绘制出来的 。 你的这个只是创建的时候 会显示下 ,在鼠标移动上去后,就会触发按钮的事件 ,刷新,显示新的内容 ,你的这个文字根本就没画上去 。 你也可以自己去改源码 ,加函数。

#2


按钮重绘,想怎么改就怎么改

#3


按钮重绘。。。。。。。。。。。

#4


引用 1 楼 smilecabbage 的回复:
按钮上用dc输出文字,文字被遮住  真搞不懂你为啥说  SetWindowText不好。在btn的paint里面就是获取文字 然后绘制出来的 。 你的这个只是创建的时候 会显示下 ,在鼠标移动上去后,就会触发按钮的事件 ,刷新,显示新的内容 ,你的这个文字根本就没画上去 。 你也可以自己去改源码 ,加函数。

是因为输出的文字比较复杂,要多行显示,而且同一个按钮里面有一部分文字加色,另外一部分文字又不同的颜色,需求比较复杂,

#5



CPP
#include "stdafx.h"
#include "BTColor.h"

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

/////////////////////////////////////////////////////////////////////////////
// CBTColor


CBTColor::CBTColor()
{
btBackColor = RGB(0,0,0);
btTextColor = RGB(255,255,255);
}

CBTColor::~CBTColor()
{
}


BEGIN_MESSAGE_MAP(CBTColor, CButton)
//{{AFX_MSG_MAP(CBTColor)
// NOTE - the ClassWizard will add and remove mapping macros here.
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CBTColor message handlers

void CBTColor::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
{
// TODO: Add your code to draw the specified item
CDC dc;
    RECT rect;
    dc.Attach(lpDrawItemStruct ->hDC);   // Get the Button DC to CDC  
    rect = lpDrawItemStruct->rcItem;     //Store the Button rect to our local rect.
    dc.Draw3dRect(&rect,RGB(255,255,255),RGB(0,0,0)); 

    dc.FillSolidRect(&rect,btBackColor);//Here you can define the required color to appear on the Button.

    UINT state=lpDrawItemStruct->itemState;  //This defines the state of the Push button either pressed or not. 

    if((state & ODS_SELECTED))
    {
        dc.DrawEdge(&rect,EDGE_SUNKEN,BF_RECT);
    }
    else
    {
        dc.DrawEdge(&rect,EDGE_RAISED,BF_RECT);
    }
   dc.SetBkColor(btBackColor);   //Setting the Text Background color
   dc.SetTextColor(btTextColor);     //Setting the Text Color
   TCHAR buffer[MAX_PATH];           //To store the Caption of the button.
   ZeroMemory(buffer,MAX_PATH);     //Intializing the buffer to zero
::GetWindowText(lpDrawItemStruct->hwndItem,buffer,MAX_PATH); //Get the Caption of Button Window 
    dc.DrawText(buffer,&rect,DT_LEFT|DT_VCENTER|DT_SINGLELINE);
    
    dc.Detach();  // Detach the Button DC                
}

void CBTColor::SetTextColor(COLORREF color)
{//文字颜色设定
btTextColor = color;
}

void CBTColor::SetColor(COLORREF color)
{//背景颜色设定
btBackColor = color;
Invalidate();
}

#if !defined(AFX_BTCOLOR_H__8EDE92C1_055E_4CF0_BB82_281DDEC65EF6__INCLUDED_)
#define AFX_BTCOLOR_H__8EDE92C1_055E_4CF0_BB82_281DDEC65EF6__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// BTColor.h : header file
//
enum
{//色彩
COLOR_INIT = RGB(0,0,0),
COLOR_SEL  = RGB(255,0,0),
COLOR_CHNAM  = RGB(0,255,0),
COLOR_TEXT = RGB(255,255,255),
COLOR_NOEBLE = RGB(140,140,140),
};

/////////////////////////////////////////////////////////////////////////////
// CBTColor window

class CBTColor : public CButton
{
// COLORREF btColor;
COLORREF btBackColor;
COLORREF btTextColor;
int btleft;
// Construction
public:
CBTColor();

// Attributes
public:

// Operations
public:

// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CBTColor)
public:
virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
//}}AFX_VIRTUAL

// Implementation
public:
void SetLeft();
void BTDown(int n);
void BTTab();
void BTInit();
void SetColor(COLORREF color);
void SetTextColor(COLORREF color);
virtual ~CBTColor();

// Generated message map functions
protected:
//{{AFX_MSG(CBTColor)
// NOTE - the ClassWizard will add and remove member functions here.
//}}AFX_MSG

DECLARE_MESSAGE_MAP()
};

/////////////////////////////////////////////////////////////////////////////

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_BTCOLOR_H__8EDE92C1_055E_4CF0_BB82_281DDEC65EF6__INCLUDED_)


#6


引用 4 楼 xiao_dong_dong 的回复:
Quote: 引用 1 楼 smilecabbage 的回复:

按钮上用dc输出文字,文字被遮住  真搞不懂你为啥说  SetWindowText不好。在btn的paint里面就是获取文字 然后绘制出来的 。 你的这个只是创建的时候 会显示下 ,在鼠标移动上去后,就会触发按钮的事件 ,刷新,显示新的内容 ,你的这个文字根本就没画上去 。 你也可以自己去改源码 ,加函数。

是因为输出的文字比较复杂,要多行显示,而且同一个按钮里面有一部分文字加色,另外一部分文字又不同的颜色,需求比较复杂,

这个你就更得自己在CbuttonST里面添加上函数接口了  ,设置好参数, 在DrawItem中添加绘制什么多行,变色的代码了。然后在外面直接调用对应的函数接口就可以了

#7


恩,谢谢大家了,我自己再写写,调一下

#1


按钮上用dc输出文字,文字被遮住  真搞不懂你为啥说  SetWindowText不好。在btn的paint里面就是获取文字 然后绘制出来的 。 你的这个只是创建的时候 会显示下 ,在鼠标移动上去后,就会触发按钮的事件 ,刷新,显示新的内容 ,你的这个文字根本就没画上去 。 你也可以自己去改源码 ,加函数。

#2


按钮重绘,想怎么改就怎么改

#3


按钮重绘。。。。。。。。。。。

#4


引用 1 楼 smilecabbage 的回复:
按钮上用dc输出文字,文字被遮住  真搞不懂你为啥说  SetWindowText不好。在btn的paint里面就是获取文字 然后绘制出来的 。 你的这个只是创建的时候 会显示下 ,在鼠标移动上去后,就会触发按钮的事件 ,刷新,显示新的内容 ,你的这个文字根本就没画上去 。 你也可以自己去改源码 ,加函数。

是因为输出的文字比较复杂,要多行显示,而且同一个按钮里面有一部分文字加色,另外一部分文字又不同的颜色,需求比较复杂,

#5



CPP
#include "stdafx.h"
#include "BTColor.h"

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

/////////////////////////////////////////////////////////////////////////////
// CBTColor


CBTColor::CBTColor()
{
btBackColor = RGB(0,0,0);
btTextColor = RGB(255,255,255);
}

CBTColor::~CBTColor()
{
}


BEGIN_MESSAGE_MAP(CBTColor, CButton)
//{{AFX_MSG_MAP(CBTColor)
// NOTE - the ClassWizard will add and remove mapping macros here.
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CBTColor message handlers

void CBTColor::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
{
// TODO: Add your code to draw the specified item
CDC dc;
    RECT rect;
    dc.Attach(lpDrawItemStruct ->hDC);   // Get the Button DC to CDC  
    rect = lpDrawItemStruct->rcItem;     //Store the Button rect to our local rect.
    dc.Draw3dRect(&rect,RGB(255,255,255),RGB(0,0,0)); 

    dc.FillSolidRect(&rect,btBackColor);//Here you can define the required color to appear on the Button.

    UINT state=lpDrawItemStruct->itemState;  //This defines the state of the Push button either pressed or not. 

    if((state & ODS_SELECTED))
    {
        dc.DrawEdge(&rect,EDGE_SUNKEN,BF_RECT);
    }
    else
    {
        dc.DrawEdge(&rect,EDGE_RAISED,BF_RECT);
    }
   dc.SetBkColor(btBackColor);   //Setting the Text Background color
   dc.SetTextColor(btTextColor);     //Setting the Text Color
   TCHAR buffer[MAX_PATH];           //To store the Caption of the button.
   ZeroMemory(buffer,MAX_PATH);     //Intializing the buffer to zero
::GetWindowText(lpDrawItemStruct->hwndItem,buffer,MAX_PATH); //Get the Caption of Button Window 
    dc.DrawText(buffer,&rect,DT_LEFT|DT_VCENTER|DT_SINGLELINE);
    
    dc.Detach();  // Detach the Button DC                
}

void CBTColor::SetTextColor(COLORREF color)
{//文字颜色设定
btTextColor = color;
}

void CBTColor::SetColor(COLORREF color)
{//背景颜色设定
btBackColor = color;
Invalidate();
}

#if !defined(AFX_BTCOLOR_H__8EDE92C1_055E_4CF0_BB82_281DDEC65EF6__INCLUDED_)
#define AFX_BTCOLOR_H__8EDE92C1_055E_4CF0_BB82_281DDEC65EF6__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// BTColor.h : header file
//
enum
{//色彩
COLOR_INIT = RGB(0,0,0),
COLOR_SEL  = RGB(255,0,0),
COLOR_CHNAM  = RGB(0,255,0),
COLOR_TEXT = RGB(255,255,255),
COLOR_NOEBLE = RGB(140,140,140),
};

/////////////////////////////////////////////////////////////////////////////
// CBTColor window

class CBTColor : public CButton
{
// COLORREF btColor;
COLORREF btBackColor;
COLORREF btTextColor;
int btleft;
// Construction
public:
CBTColor();

// Attributes
public:

// Operations
public:

// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CBTColor)
public:
virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
//}}AFX_VIRTUAL

// Implementation
public:
void SetLeft();
void BTDown(int n);
void BTTab();
void BTInit();
void SetColor(COLORREF color);
void SetTextColor(COLORREF color);
virtual ~CBTColor();

// Generated message map functions
protected:
//{{AFX_MSG(CBTColor)
// NOTE - the ClassWizard will add and remove member functions here.
//}}AFX_MSG

DECLARE_MESSAGE_MAP()
};

/////////////////////////////////////////////////////////////////////////////

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_BTCOLOR_H__8EDE92C1_055E_4CF0_BB82_281DDEC65EF6__INCLUDED_)


#6


引用 4 楼 xiao_dong_dong 的回复:
Quote: 引用 1 楼 smilecabbage 的回复:

按钮上用dc输出文字,文字被遮住  真搞不懂你为啥说  SetWindowText不好。在btn的paint里面就是获取文字 然后绘制出来的 。 你的这个只是创建的时候 会显示下 ,在鼠标移动上去后,就会触发按钮的事件 ,刷新,显示新的内容 ,你的这个文字根本就没画上去 。 你也可以自己去改源码 ,加函数。

是因为输出的文字比较复杂,要多行显示,而且同一个按钮里面有一部分文字加色,另外一部分文字又不同的颜色,需求比较复杂,

这个你就更得自己在CbuttonST里面添加上函数接口了  ,设置好参数, 在DrawItem中添加绘制什么多行,变色的代码了。然后在外面直接调用对应的函数接口就可以了

#7


恩,谢谢大家了,我自己再写写,调一下