【VC】实现CWnd类的自定义,并实现自定义控件!

本例实现一个ColorWnd类,实现通过鼠标单击,刷新不同的颜色背景。

class CColorWnd : public CWnd
{
	DECLARE_DYNAMIC(CColorWnd)

public:
	CColorWnd();
	virtual ~CColorWnd();
	virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
	afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
	afx_msg void OnPaint();

protected:
	DECLARE_MESSAGE_MAP()

public:
	BOOL Create(CRect rcLayout,CWnd *pParenWnd,UINT nID,DWORD dwStyle = WS_CHILD|WS_VISIBLE);	

};
MPLEMENT_DYNAMIC(CColorWnd, CWnd)

CColorWnd::CColorWnd()
{

}

CColorWnd::~CColorWnd()
{

}

BEGIN_MESSAGE_MAP(CColorWnd, CWnd)
	ON_WM_PAINT()
	ON_WM_SIZE()
	ON_WM_LBUTTONDOWN()
END_MESSAGE_MAP()

BOOL CColorWnd::PreCreateWindow(CREATESTRUCT& cs)
{
	WNDCLASS wndcls;
	memset(&wndcls, 0, sizeof(WNDCLASS));

	wndcls.style = CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW | CS_NOCLOSE;
	wndcls.lpfnWndProc = ::DefWindowProc;
	wndcls.hInstance = AfxGetInstanceHandle();
	wndcls.hIcon =  NULL;
	wndcls.hCursor =NULL;
	wndcls.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1);
	wndcls.lpszMenuName = NULL;
	wndcls.lpszClassName = _T("ColorWnd");
	if(!AfxRegisterClass(&wndcls))
	{
		TRACE("Class Registration Failed!\n");
		return FALSE;
	}
	cs.lpszClass = wndcls.lpszClassName;

	return CWnd::PreCreateWindow(cs);
}

BOOL CColorWnd::Create(CRect rcLayout,CWnd *pParenWnd,UINT nID,DWORD dwStyle)
{
	if (rcLayout.Width() < 50)
	{
		rcLayout.right += 40;
	}
	LPCTSTR lpszClassName = AfxRegisterWndClass(NULL,LoadCursor(NULL, IDC_ARROW),(HBRUSH)GetStockObject(NULL_BRUSH));

	return CWnd::Create(lpszClassName,NULL,dwStyle,rcLayout,pParenWnd,nID,NULL);
}

void CColorWnd::OnLButtonDown(UINT nFlags, CPoint point)
{
	Invalidate(TRUE);

	CWnd::OnLButtonDown(nFlags, point);
}

void CColorWnd::OnPaint()
{
	CPaintDC dc(this);
	CRect rcWnd;
	GetWindowRect(&rcWnd);
	rcWnd.SetRect(0,0,rcWnd.Width(),rcWnd.Height());

	int nRed = rand()%255;
	int nBlue = rand()%255;

	CBrush brush(RGB(nRed,nBlue,0));
	dc.FillRect(rcWnd,&brush);
	brush.DeleteObject();
}

CColorWnd m_ColorWnd;

m_ColorWnd.Create(CRect(300,150,350,180),this,1202);

通过鼠标单击m_ColorWnd的区域,实现自动刷新背景色! 本例是Dialog工程。

时间: 2024-10-09 11:54:47

【VC】实现CWnd类的自定义,并实现自定义控件!的相关文章

MFC浅析(7) CWnd类虚函数的调用时机、缺省实现

CWnd类虚函数的调用时机.缺省实现 FMD(http://www.fmdstudio.net) 1. Create 2. PreCreateWindow 3. PreSubclassWindow 4. PreTranslateMessage 5. WindowProc 6. OnCommand 7. OnNotify 8. OnChildNotify 9. DefWindowProc 10. DestroyWindow 11. PostNcDestroy CWnd作为MFC中最基本的与窗口打交

修改tt模板让ADO.NET C# POCO Entity Generator With WCF Support 生成的实体类继承自定义基类

折腾几天记载一下,由于项目实际需要,从edmx生成的实体类能自动继承自定义的基类,这个基类不是从edmx文件中添加的Entityobject. 利用ADO.NET C# POCO Entity Generator With WCF Support生成的tt文件(比如model.tt)中找到 partial class partial class 修改tt模板让ADO.NET C# POCO Entity Generator With WCF Support 生成的实体类继承自定义基类

在复数类中自定义类型转换函数实现复数和非复数之间的运算

实现复数+double型数据,并且打印运算后实部上的数据 #include <iostream> using namespace std; class Complex { public: Complex( )//定义默认构造函数初始化复数 { real=0; imag=0; } //使用初始化表初始化复数 Complex(double r, double i):real(r),imag(i){} //定义自定义类型转换函数 operator double() { return real; }

CWnd类

CWnd类的成员 1.数据成员 m_hWnd 指明与这个CWnd对象相关联的HWND句柄 2.构造和析构 CWnd 构造一个CWnd对象 DestroyWindow 销毁相关联的Windows窗口 3.初始化 Create 创建并初始化与CWnd对象相关联的子窗口 PreCreateWindow 在与CWnd对象相关联的窗口被创建之前调用 CalcWindowRect 调用这个函数以计算窗口客户区的矩形 GetStyle 返回当前的窗口风格 GetExStyle 返回窗口的扩展风格 Attach

.Net 配置文件——继承ConfigurationSection实现自定义处理类处理自定义配置节点

除了使用继承IConfigurationSectionHandler的方法定义处理自定义节点的类,还可以通过继承ConfigurationSection类实现同样效果. 首先说下.Net配置文件中一个潜规则: 在配置节点时,对于想要进行存储的参数数据,可以采用两种方式:一种是存储到节点的属性中,另一种是存储在节点的文本中. 因为一个节点可以有很多属性,但是只要一个innertext,而要在程序中将这两种形式区分开会带来复杂性. 为了避免这个问题,.net的配置文件只是用属性存储而不使用inner

Comparable比较器实现类的自定义升/降排序

1,基本规则 1.0  let your class implements Comparable interface , override  method : int compareTo(Object another) 1.1 升序 obj1 > obj2 return 正数 obj1 == obj2 return 0 obj1 < obj2 return 负数 1.2 降序 与升序相反 1.3 if class already implements Comparable interface,

.Net 配置文件--继承ConfigurationSection实现自定义处理类处理自定义配置节点

除了使用继承IConfigurationSectionHandler的方法定义处理自定义节点的类,还可以通过继承ConfigurationSection类实现同样效果. 首先说下.Net配置文件中一个潜规则: 在配置节点时,对于想要进行存储的参数数据,可以采用两种方式:一种是存储到节点的属性中,另一种是存储在节点的文本中. 因为一个节点可以有很多属性,但是只要一个innertext,而要在程序中将这两种形式区分开会带来复杂性. 为了避免这个问题,.net的配置文件只是用属性存储而不使用inner

关于比较器类的自定义

Job类 /**   * Define the comparator that controls    * how the keys are sorted before they   * are passed to the {@link Reducer}.   * @param cls the raw comparator   * @see #setCombinerKeyGroupingComparatorClass(Class)   */    publicvoid setSortCompar

asp.net MVC中如何用Membership类和自定义的数据库进行登录验证

asp.net MVC 内置的membershipProvider可以实现用户登陆验证,但是它用的是自动创建的数据库,所以你想用本地数据库数据去验证,是通过不了的. 如果我们想用自己的数据库的话,可以写自己的membershipProvider!下面介绍如果创建自己的membershipProvider: 1.写自己的MembershipProvider类,这个类继承自命名空间System.Web.Security下的MembershipProvider类 这个类放在哪无所谓,这里我放在新建My