mfc中CStatic遇见的不显示问题。

时间:2022-06-06 00:42:29
CMyStatic窗体类,继承自CStatic,并且我在CMyStatic中添加了WM_PAINT事件,这个事件是mfc自动生成的,我什么也没有修改,然后我在对话框中关联了一个CMyStatic m_staticTest变量,并且在OnInitDialog()虚函数中添加了m_staticTest.SetWindowText("test");一行代码,编译,运行,静态文本中的文字没有显示,什么原因,请大神给解答。

30 个解决方案

#1


CMyStatic中添加了WM_PAINT事件

先不要 WM_PAINT事件 试试

#2


引用 1 楼 schlafenhamster 的回复:
CMyStatic中添加了WM_PAINT事件

先不要 WM_PAINT事件 试试


我是用的mfc自动生成的WM_PAINT事件,我没有添加任何代码,删除这个事件,就能显示,我想知道为什么。

#3


如果你响应了WM_PAINT事件,"我没有添加任何代码" ,你必须写代码.不写就没东西被 paint !

#4


那mfc中自带的CStatic怎么向静态文中控件中的添加的文本呢,他们也没有在WM_Paint消息中天剑任何东西。

#5


引用 3 楼 schlafenhamster 的回复:
如果你响应了WM_PAINT事件,"我没有添加任何代码" ,你必须写代码.不写就没东西被 paint !

那mfc中自带的CStatic怎么向静态控件中的添加的文本呢,他们也没有在WM_Paint消息中添加任何东西。

#6


引用 5 楼 lijunbiao2080 的回复:
Quote: 引用 3 楼 schlafenhamster 的回复:

如果你响应了WM_PAINT事件,"我没有添加任何代码" ,你必须写代码.不写就没东西被 paint !

那mfc中自带的CStatic怎么向静态控件中的添加的文本呢,他们也没有在WM_Paint消息中添加任何东西。

“我没有添加任何代码”的意思是事件里面的代码都是mfc默认生成的,我没有修改。

#7


有个概念要搞清楚.
你响应了WM_PAINT事件, 表示 你要 自己控制Paint过程,系统就不会调默认的piant.

所以不响应 WM_PAINT事件, 就是系统调用默认的OnPaint 函数.

MFC SDK 都要注意,
你响应了WM_PAINT事件,就一定要写Paint内容.

#8


本帖最后由 VisualEleven 于 2014-10-19 17:40:19 编辑
那怎么我在CMyStatic中的OnPaint()添加了系统默认的CWnd::OnPaint();这个CWnd::OnPaint()就是调用了系统默认的处理函数
void CWnd::OnPaint()
{
   if (m_pCtrlCont != NULL)
   {
  // Paint windowless controls
  CPaintDC dc(this);
  m_pCtrlCont->OnPaint(&dc);
   }

   Default();
}
LRESULT CWnd::Default()
{
// call DefWindowProc with the last message
_AFX_THREAD_STATE* pThreadState = _afxThreadState.GetData();
return DefWindowProc(pThreadState->m_lastSentMsg.message,
pThreadState->m_lastSentMsg.wParam, pThreadState->m_lastSentMsg.lParam);
}
还是没有作用,不知道什么原因,我对mfc了解不多,希望给予解答,多谢了。

#9


本帖最后由 VisualEleven 于 2014-10-19 17:42:01 编辑
引用 7 楼 schlafenhamster 的回复:
有个概念要搞清楚.
你响应了WM_PAINT事件, 表示 你要 自己控制Paint过程,系统就不会调默认的piant.

所以不响应 WM_PAINT事件, 就是系统调用默认的OnPaint 函数.

MFC SDK 都要注意,
你响应了WM_PAINT事件,就一定要写Paint内容.


那怎么我在CMyStatic中的OnPaint()添加了系统默认的CWnd::OnPaint();这个CWnd::OnPaint()就是调用了系统默认的处理函数
void CWnd::OnPaint()
{
   if (m_pCtrlCont != NULL)
   {
  // Paint windowless controls
  CPaintDC dc(this);
  m_pCtrlCont->OnPaint(&dc);
   }

   Default();
}
LRESULT CWnd::Default()
{
// call DefWindowProc with the last message
_AFX_THREAD_STATE* pThreadState = _afxThreadState.GetData();
return DefWindowProc(pThreadState->m_lastSentMsg.message,
pThreadState->m_lastSentMsg.wParam, pThreadState->m_lastSentMsg.lParam);
}

还是没有作用,不知道什么原因,我对mfc了解不多,希望给予解答,多谢了。

#10


函数是,没有什么 CWnd !!
void  CMyStatic::OnPaint()
{
        CStatic::OnPaint();// 调父类
}

#11


引用 楼主 lijunbiao2080 的回复:
CMyStatic窗体类,继承自CStatic,并且我在CMyStatic中添加了WM_PAINT事件,这个事件是mfc自动生成的,我什么也没有修改,然后我在对话框中关联了一个CMyStatic m_staticTest变量,并且在OnInitDialog()虚函数中添加了m_staticTest.SetWindowText("test");一行代码,编译,运行,静态文本中的文字没有显示,什么原因,请大神给解答。


m_staticTest.SetWindowText("test"); 之后 m_staticTest.Invalidate()一下。

#12


把 CPaintDC dc(this);这句注释掉即可显示..

#13


引用 11 楼 tixisong 的回复:
Quote: 引用 楼主 lijunbiao2080 的回复:

CMyStatic窗体类,继承自CStatic,并且我在CMyStatic中添加了WM_PAINT事件,这个事件是mfc自动生成的,我什么也没有修改,然后我在对话框中关联了一个CMyStatic m_staticTest变量,并且在OnInitDialog()虚函数中添加了m_staticTest.SetWindowText("test");一行代码,编译,运行,静态文本中的文字没有显示,什么原因,请大神给解答。


m_staticTest.SetWindowText("test"); 之后 m_staticTest.Invalidate()一下。

你给的方法,我试了,显示,帮忙分析一下什么原因,如果满意了,我会追加分数的。

#14


引用 13 楼 lijunbiao2080 的回复:
Quote: 引用 11 楼 tixisong 的回复:

Quote: 引用 楼主 lijunbiao2080 的回复:

CMyStatic窗体类,继承自CStatic,并且我在CMyStatic中添加了WM_PAINT事件,这个事件是mfc自动生成的,我什么也没有修改,然后我在对话框中关联了一个CMyStatic m_staticTest变量,并且在OnInitDialog()虚函数中添加了m_staticTest.SetWindowText("test");一行代码,编译,运行,静态文本中的文字没有显示,什么原因,请大神给解答。


m_staticTest.SetWindowText("test"); 之后 m_staticTest.Invalidate()一下。

你给的方法,我试了,显示,帮忙分析一下什么原因,如果满意了,我会追加分数的。

说错了,不显示,你可以自己试一试。

#15


引用 12 楼 he4225073 的回复:
把 CPaintDC dc(this);这句注释掉即可显示..


注释掉,还是不显示,帮忙分析一下什么原因导致的不显示,怎么解决,如果满意了,我会追加分数的。

#16


引用 7 楼 schlafenhamster 的回复:
有个概念要搞清楚.
你响应了WM_PAINT事件, 表示 你要 自己控制Paint过程,系统就不会调默认的piant.

所以不响应 WM_PAINT事件, 就是系统调用默认的OnPaint 函数.

MFC SDK 都要注意,
你响应了WM_PAINT事件,就一定要写Paint内容.


+1

#17



#pragma once

// CUIStatic

class CUIStatic : public CWnd
{
DECLARE_DYNAMIC(CUIStatic)

public:
CUIStatic();
virtual ~CUIStatic();
CString szText;

BOOL bShowFrame;
COLORREF FrameColor;


protected:
DECLARE_MESSAGE_MAP()
virtual void PreSubclassWindow();
public:
afx_msg void OnPaint();
int m_font_size;
void Set_Font_Size(int size);
void SetText(CString & sz_Text);
};




// UIStatic.cpp : 实现文件
//
#include "stdafx.h"

#include "UIStatic.h"

// CUIStatic

IMPLEMENT_DYNAMIC(CUIStatic, CWnd)

CUIStatic::CUIStatic()
{
m_font_size = 120;
FrameColor = RGB(12, 100, 189);
bShowFrame = TRUE;
}

CUIStatic::~CUIStatic()
{
}

BEGIN_MESSAGE_MAP(CUIStatic, CWnd)
ON_WM_PAINT()
END_MESSAGE_MAP()

// CUIStatic 消息处理程序


void CUIStatic::PreSubclassWindow()
{
ModifyStyle(0,SS_OWNERDRAW | WS_TABSTOP);
CWnd::PreSubclassWindow();
}

void CUIStatic::Set_Font_Size(int size)
{
m_font_size = size;
}


void CUIStatic::SetText(CString & sz_Text)
{
szText = sz_Text;
Invalidate();

}

void CUIStatic::OnPaint()
{
CPaintDC dc(this); // device context for painting
CRect rc;
GetClientRect(rc);

//是否显示边框,比如时钟就没有边框
if(bShowFrame)
{
CPen pen,*pOldPen;
pen.CreatePen(PS_SOLID, 2, FrameColor);
pOldPen = dc.SelectObject(&pen);
CBrush *pBrush = CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
CBrush *pOldBrush = dc.SelectObject(pBrush);//选入设备描述表
dc.RoundRect(&rc,CPoint(5,5));
dc.SelectObject(pOldPen);
pen.DeleteObject();
}
if(szText.IsEmpty())
return;
CFont font,*pOldFont;
font.CreatePointFont(m_font_size, szFontName);
pOldFont = dc.SelectObject(&font);
CSize szEd = dc.GetTextExtent(szText);
CPoint pt((rc.right - szEd.cx) / 2,(rc.bottom - szEd.cy) /2);
dc.SetBkMode(TRANSPARENT);
// dc.SetBkColor(RGB(20, 130, 228));
dc.SetTextColor(RGB(0,0,0));
dc.TextOut(pt.x,pt.y,szText);
dc.SelectObject(pOldFont);
font.DeleteObject();
//
}



这个是我之前写的一个,用settext添加文字

#18


引用 16 楼 jianghandaxue 的回复:
Quote: 引用 7 楼 schlafenhamster 的回复:

有个概念要搞清楚.
你响应了WM_PAINT事件, 表示 你要 自己控制Paint过程,系统就不会调默认的piant.

所以不响应 WM_PAINT事件, 就是系统调用默认的OnPaint 函数.

MFC SDK 都要注意,
你响应了WM_PAINT事件,就一定要写Paint内容.


+1

那我在这个事件里添加了系统默认的函数,为什么还是不显示。

#19


函数是,没有什么 CWnd !!
void CMyStatic::OnPaint()
{
         CStatic::OnPaint();// 调父类
}


不能没有 CStatic::OnPaint(); 这就是 默认的paint

#20


引用 19 楼 schlafenhamster 的回复:
函数是,没有什么 CWnd !!
void CMyStatic::OnPaint()
{
         CStatic::OnPaint();// 调父类
}


不能没有 CStatic::OnPaint(); 这就是 默认的paint

你自己可以试一下,调用默认的也没有效果。

#21


“我在CMyStatic中添加了WM_PAINT事件,这个事件是mfc自动生成的”

这个事件是mfc 不会 自动生成的

你把它  删除 看看。

#23


class CMyStatic : public CStatic
{
DECLARE_DYNAMIC(CMyStatic)

public:
CMyStatic();
virtual ~CMyStatic();
DECLARE_MESSAGE_MAP()

public:
COLORREF m_clrText;
COLORREF m_clrBk;
CBrush m_bkBrush;

public:
afx_msg HBRUSH CtlColor(CDC* pDC, UINT /*nCtlColor*/);
void SetBkColor(COLORREF clrBk);
void SetTextColor(COLORREF clrText);

};

#24


引用 21 楼 schlafenhamster 的回复:
“我在CMyStatic中添加了WM_PAINT事件,这个事件是mfc自动生成的”

这个事件是mfc 不会 自动生成的

你把它  删除 看看。


我试了,删除是可以的,我现在想找出真正的不显示的原因,而不是说解决办法。你说调用默认的就可以显示,我在这个函数中添加了默认的处理,怎么不显示。

#25


void CMyStatic::OnPaint()
{
        CStatic::OnPaint();// 调父类
}
 没用?
是不是被 其他窗口覆盖了.
简化工程 , 重来.

#26


我重建工程,最简单的工程,添加了这段代码,还是没效果,大神如果不相信的话,可以自己试一试,我只想找到真正的原因。

#27


引用 25 楼 schlafenhamster 的回复:
void CMyStatic::OnPaint()
{
        CStatic::OnPaint();// 调父类
}
 没用?
是不是被 其他窗口覆盖了.
简化工程 , 重来.

我重建工程,最简单的工程,添加了这段代码,还是没效果,大神如果不相信的话,可以自己试一试,我只想找到真正的原因。

#28


没办法只好自己试试。

在 CMyStatic 中 用 向导插入 WM_PAINT  消息 后,向导的代码是:

void CMyStatic::OnPaint()
{
CPaintDC dc(this);
// do not call  CStatic::OnPaint() for piant
}

你要改成:

void CMyStatic::OnPaint()
{
//  CPaintDC dc(this); // 这句 一定 要 去掉, 因为 这句 会 使 客户区 背景刷除,同时使客户区有效, 再 OnPaint 就 没用 了 ,(Onpaint 只对 无效 客户区)才有用
// do not call 
     CStatic::OnPaint();// 调父类
}

#29


引用 28 楼 schlafenhamster 的回复:
没办法只好自己试试。

在 CMyStatic 中 用 向导插入 WM_PAINT  消息 后,向导的代码是:

void CMyStatic::OnPaint()
{
CPaintDC dc(this);
// do not call  CStatic::OnPaint() for piant
}

你要改成:

void CMyStatic::OnPaint()
{
//  CPaintDC dc(this); // 这句 一定 要 去掉, 因为 这句 会 使 客户区 背景刷除,同时使客户区有效, 再 OnPaint 就 没用 了 ,(Onpaint 只对 无效 客户区)才有用
// do not call 
     CStatic::OnPaint();// 调父类
}

确实可以了,CPaintDC导致擦除,多谢了。

#30


其实12 楼已经说了,只是你 没注意.

#1


CMyStatic中添加了WM_PAINT事件

先不要 WM_PAINT事件 试试

#2


引用 1 楼 schlafenhamster 的回复:
CMyStatic中添加了WM_PAINT事件

先不要 WM_PAINT事件 试试


我是用的mfc自动生成的WM_PAINT事件,我没有添加任何代码,删除这个事件,就能显示,我想知道为什么。

#3


如果你响应了WM_PAINT事件,"我没有添加任何代码" ,你必须写代码.不写就没东西被 paint !

#4


那mfc中自带的CStatic怎么向静态文中控件中的添加的文本呢,他们也没有在WM_Paint消息中天剑任何东西。

#5


引用 3 楼 schlafenhamster 的回复:
如果你响应了WM_PAINT事件,"我没有添加任何代码" ,你必须写代码.不写就没东西被 paint !

那mfc中自带的CStatic怎么向静态控件中的添加的文本呢,他们也没有在WM_Paint消息中添加任何东西。

#6


引用 5 楼 lijunbiao2080 的回复:
Quote: 引用 3 楼 schlafenhamster 的回复:

如果你响应了WM_PAINT事件,"我没有添加任何代码" ,你必须写代码.不写就没东西被 paint !

那mfc中自带的CStatic怎么向静态控件中的添加的文本呢,他们也没有在WM_Paint消息中添加任何东西。

“我没有添加任何代码”的意思是事件里面的代码都是mfc默认生成的,我没有修改。

#7


有个概念要搞清楚.
你响应了WM_PAINT事件, 表示 你要 自己控制Paint过程,系统就不会调默认的piant.

所以不响应 WM_PAINT事件, 就是系统调用默认的OnPaint 函数.

MFC SDK 都要注意,
你响应了WM_PAINT事件,就一定要写Paint内容.

#8


本帖最后由 VisualEleven 于 2014-10-19 17:40:19 编辑
那怎么我在CMyStatic中的OnPaint()添加了系统默认的CWnd::OnPaint();这个CWnd::OnPaint()就是调用了系统默认的处理函数
void CWnd::OnPaint()
{
   if (m_pCtrlCont != NULL)
   {
  // Paint windowless controls
  CPaintDC dc(this);
  m_pCtrlCont->OnPaint(&dc);
   }

   Default();
}
LRESULT CWnd::Default()
{
// call DefWindowProc with the last message
_AFX_THREAD_STATE* pThreadState = _afxThreadState.GetData();
return DefWindowProc(pThreadState->m_lastSentMsg.message,
pThreadState->m_lastSentMsg.wParam, pThreadState->m_lastSentMsg.lParam);
}
还是没有作用,不知道什么原因,我对mfc了解不多,希望给予解答,多谢了。

#9


本帖最后由 VisualEleven 于 2014-10-19 17:42:01 编辑
引用 7 楼 schlafenhamster 的回复:
有个概念要搞清楚.
你响应了WM_PAINT事件, 表示 你要 自己控制Paint过程,系统就不会调默认的piant.

所以不响应 WM_PAINT事件, 就是系统调用默认的OnPaint 函数.

MFC SDK 都要注意,
你响应了WM_PAINT事件,就一定要写Paint内容.


那怎么我在CMyStatic中的OnPaint()添加了系统默认的CWnd::OnPaint();这个CWnd::OnPaint()就是调用了系统默认的处理函数
void CWnd::OnPaint()
{
   if (m_pCtrlCont != NULL)
   {
  // Paint windowless controls
  CPaintDC dc(this);
  m_pCtrlCont->OnPaint(&dc);
   }

   Default();
}
LRESULT CWnd::Default()
{
// call DefWindowProc with the last message
_AFX_THREAD_STATE* pThreadState = _afxThreadState.GetData();
return DefWindowProc(pThreadState->m_lastSentMsg.message,
pThreadState->m_lastSentMsg.wParam, pThreadState->m_lastSentMsg.lParam);
}

还是没有作用,不知道什么原因,我对mfc了解不多,希望给予解答,多谢了。

#10


函数是,没有什么 CWnd !!
void  CMyStatic::OnPaint()
{
        CStatic::OnPaint();// 调父类
}

#11


引用 楼主 lijunbiao2080 的回复:
CMyStatic窗体类,继承自CStatic,并且我在CMyStatic中添加了WM_PAINT事件,这个事件是mfc自动生成的,我什么也没有修改,然后我在对话框中关联了一个CMyStatic m_staticTest变量,并且在OnInitDialog()虚函数中添加了m_staticTest.SetWindowText("test");一行代码,编译,运行,静态文本中的文字没有显示,什么原因,请大神给解答。


m_staticTest.SetWindowText("test"); 之后 m_staticTest.Invalidate()一下。

#12


把 CPaintDC dc(this);这句注释掉即可显示..

#13


引用 11 楼 tixisong 的回复:
Quote: 引用 楼主 lijunbiao2080 的回复:

CMyStatic窗体类,继承自CStatic,并且我在CMyStatic中添加了WM_PAINT事件,这个事件是mfc自动生成的,我什么也没有修改,然后我在对话框中关联了一个CMyStatic m_staticTest变量,并且在OnInitDialog()虚函数中添加了m_staticTest.SetWindowText("test");一行代码,编译,运行,静态文本中的文字没有显示,什么原因,请大神给解答。


m_staticTest.SetWindowText("test"); 之后 m_staticTest.Invalidate()一下。

你给的方法,我试了,显示,帮忙分析一下什么原因,如果满意了,我会追加分数的。

#14


引用 13 楼 lijunbiao2080 的回复:
Quote: 引用 11 楼 tixisong 的回复:

Quote: 引用 楼主 lijunbiao2080 的回复:

CMyStatic窗体类,继承自CStatic,并且我在CMyStatic中添加了WM_PAINT事件,这个事件是mfc自动生成的,我什么也没有修改,然后我在对话框中关联了一个CMyStatic m_staticTest变量,并且在OnInitDialog()虚函数中添加了m_staticTest.SetWindowText("test");一行代码,编译,运行,静态文本中的文字没有显示,什么原因,请大神给解答。


m_staticTest.SetWindowText("test"); 之后 m_staticTest.Invalidate()一下。

你给的方法,我试了,显示,帮忙分析一下什么原因,如果满意了,我会追加分数的。

说错了,不显示,你可以自己试一试。

#15


引用 12 楼 he4225073 的回复:
把 CPaintDC dc(this);这句注释掉即可显示..


注释掉,还是不显示,帮忙分析一下什么原因导致的不显示,怎么解决,如果满意了,我会追加分数的。

#16


引用 7 楼 schlafenhamster 的回复:
有个概念要搞清楚.
你响应了WM_PAINT事件, 表示 你要 自己控制Paint过程,系统就不会调默认的piant.

所以不响应 WM_PAINT事件, 就是系统调用默认的OnPaint 函数.

MFC SDK 都要注意,
你响应了WM_PAINT事件,就一定要写Paint内容.


+1

#17



#pragma once

// CUIStatic

class CUIStatic : public CWnd
{
DECLARE_DYNAMIC(CUIStatic)

public:
CUIStatic();
virtual ~CUIStatic();
CString szText;

BOOL bShowFrame;
COLORREF FrameColor;


protected:
DECLARE_MESSAGE_MAP()
virtual void PreSubclassWindow();
public:
afx_msg void OnPaint();
int m_font_size;
void Set_Font_Size(int size);
void SetText(CString & sz_Text);
};




// UIStatic.cpp : 实现文件
//
#include "stdafx.h"

#include "UIStatic.h"

// CUIStatic

IMPLEMENT_DYNAMIC(CUIStatic, CWnd)

CUIStatic::CUIStatic()
{
m_font_size = 120;
FrameColor = RGB(12, 100, 189);
bShowFrame = TRUE;
}

CUIStatic::~CUIStatic()
{
}

BEGIN_MESSAGE_MAP(CUIStatic, CWnd)
ON_WM_PAINT()
END_MESSAGE_MAP()

// CUIStatic 消息处理程序


void CUIStatic::PreSubclassWindow()
{
ModifyStyle(0,SS_OWNERDRAW | WS_TABSTOP);
CWnd::PreSubclassWindow();
}

void CUIStatic::Set_Font_Size(int size)
{
m_font_size = size;
}


void CUIStatic::SetText(CString & sz_Text)
{
szText = sz_Text;
Invalidate();

}

void CUIStatic::OnPaint()
{
CPaintDC dc(this); // device context for painting
CRect rc;
GetClientRect(rc);

//是否显示边框,比如时钟就没有边框
if(bShowFrame)
{
CPen pen,*pOldPen;
pen.CreatePen(PS_SOLID, 2, FrameColor);
pOldPen = dc.SelectObject(&pen);
CBrush *pBrush = CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
CBrush *pOldBrush = dc.SelectObject(pBrush);//选入设备描述表
dc.RoundRect(&rc,CPoint(5,5));
dc.SelectObject(pOldPen);
pen.DeleteObject();
}
if(szText.IsEmpty())
return;
CFont font,*pOldFont;
font.CreatePointFont(m_font_size, szFontName);
pOldFont = dc.SelectObject(&font);
CSize szEd = dc.GetTextExtent(szText);
CPoint pt((rc.right - szEd.cx) / 2,(rc.bottom - szEd.cy) /2);
dc.SetBkMode(TRANSPARENT);
// dc.SetBkColor(RGB(20, 130, 228));
dc.SetTextColor(RGB(0,0,0));
dc.TextOut(pt.x,pt.y,szText);
dc.SelectObject(pOldFont);
font.DeleteObject();
//
}



这个是我之前写的一个,用settext添加文字

#18


引用 16 楼 jianghandaxue 的回复:
Quote: 引用 7 楼 schlafenhamster 的回复:

有个概念要搞清楚.
你响应了WM_PAINT事件, 表示 你要 自己控制Paint过程,系统就不会调默认的piant.

所以不响应 WM_PAINT事件, 就是系统调用默认的OnPaint 函数.

MFC SDK 都要注意,
你响应了WM_PAINT事件,就一定要写Paint内容.


+1

那我在这个事件里添加了系统默认的函数,为什么还是不显示。

#19


函数是,没有什么 CWnd !!
void CMyStatic::OnPaint()
{
         CStatic::OnPaint();// 调父类
}


不能没有 CStatic::OnPaint(); 这就是 默认的paint

#20


引用 19 楼 schlafenhamster 的回复:
函数是,没有什么 CWnd !!
void CMyStatic::OnPaint()
{
         CStatic::OnPaint();// 调父类
}


不能没有 CStatic::OnPaint(); 这就是 默认的paint

你自己可以试一下,调用默认的也没有效果。

#21


“我在CMyStatic中添加了WM_PAINT事件,这个事件是mfc自动生成的”

这个事件是mfc 不会 自动生成的

你把它  删除 看看。

#22


#23


class CMyStatic : public CStatic
{
DECLARE_DYNAMIC(CMyStatic)

public:
CMyStatic();
virtual ~CMyStatic();
DECLARE_MESSAGE_MAP()

public:
COLORREF m_clrText;
COLORREF m_clrBk;
CBrush m_bkBrush;

public:
afx_msg HBRUSH CtlColor(CDC* pDC, UINT /*nCtlColor*/);
void SetBkColor(COLORREF clrBk);
void SetTextColor(COLORREF clrText);

};

#24


引用 21 楼 schlafenhamster 的回复:
“我在CMyStatic中添加了WM_PAINT事件,这个事件是mfc自动生成的”

这个事件是mfc 不会 自动生成的

你把它  删除 看看。


我试了,删除是可以的,我现在想找出真正的不显示的原因,而不是说解决办法。你说调用默认的就可以显示,我在这个函数中添加了默认的处理,怎么不显示。

#25


void CMyStatic::OnPaint()
{
        CStatic::OnPaint();// 调父类
}
 没用?
是不是被 其他窗口覆盖了.
简化工程 , 重来.

#26


我重建工程,最简单的工程,添加了这段代码,还是没效果,大神如果不相信的话,可以自己试一试,我只想找到真正的原因。

#27


引用 25 楼 schlafenhamster 的回复:
void CMyStatic::OnPaint()
{
        CStatic::OnPaint();// 调父类
}
 没用?
是不是被 其他窗口覆盖了.
简化工程 , 重来.

我重建工程,最简单的工程,添加了这段代码,还是没效果,大神如果不相信的话,可以自己试一试,我只想找到真正的原因。

#28


没办法只好自己试试。

在 CMyStatic 中 用 向导插入 WM_PAINT  消息 后,向导的代码是:

void CMyStatic::OnPaint()
{
CPaintDC dc(this);
// do not call  CStatic::OnPaint() for piant
}

你要改成:

void CMyStatic::OnPaint()
{
//  CPaintDC dc(this); // 这句 一定 要 去掉, 因为 这句 会 使 客户区 背景刷除,同时使客户区有效, 再 OnPaint 就 没用 了 ,(Onpaint 只对 无效 客户区)才有用
// do not call 
     CStatic::OnPaint();// 调父类
}

#29


引用 28 楼 schlafenhamster 的回复:
没办法只好自己试试。

在 CMyStatic 中 用 向导插入 WM_PAINT  消息 后,向导的代码是:

void CMyStatic::OnPaint()
{
CPaintDC dc(this);
// do not call  CStatic::OnPaint() for piant
}

你要改成:

void CMyStatic::OnPaint()
{
//  CPaintDC dc(this); // 这句 一定 要 去掉, 因为 这句 会 使 客户区 背景刷除,同时使客户区有效, 再 OnPaint 就 没用 了 ,(Onpaint 只对 无效 客户区)才有用
// do not call 
     CStatic::OnPaint();// 调父类
}

确实可以了,CPaintDC导致擦除,多谢了。

#30


其实12 楼已经说了,只是你 没注意.