利用MFC进行IP地址控件的绘制
2009-03-13 17:06
281 查看
由于项目的需要,要自己绘制IP地址控件,但如果从继承CWnd重绘又觉得太麻烦,于是几经摸索终于得出IP地址控件自绘的规律,代码如下:
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//SkinIPAddressCtrl.h
#pragma once
// CSkinIPAddressCtrl
class CSkinIPAddressCtrl : public CIPAddressCtrl
{
DECLARE_DYNAMIC(CSkinIPAddressCtrl)
public:
CSkinIPAddressCtrl();
virtual ~CSkinIPAddressCtrl();
protected:
DECLARE_MESSAGE_MAP()
public:
afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
afx_msg void OnPaint();
protected:
virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);
void OnNcPaint();
};
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//SkinIPAddressCtrl.cpp
// SkinIPAddressCtrl.cpp : 实现文件
//
#include "stdafx.h"
#include "SkinIPAddressCtrl.h"
#define COLOR_EDIT RGB(109,109,109)
// CSkinIPAddressCtrl
IMPLEMENT_DYNAMIC(CSkinIPAddressCtrl, CIPAddressCtrl)
CSkinIPAddressCtrl::CSkinIPAddressCtrl()
{
}
CSkinIPAddressCtrl::~CSkinIPAddressCtrl()
{
}
BEGIN_MESSAGE_MAP(CSkinIPAddressCtrl, CIPAddressCtrl)
ON_WM_CTLCOLOR()
ON_WM_ERASEBKGND()
END_MESSAGE_MAP()
// CSkinIPAddressCtrl 消息处理程序
HBRUSH CSkinIPAddressCtrl::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CIPAddressCtrl::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: 在此更改 DC 的任何属性
// TODO: 如果默认的不是所需画笔,则返回另一个画笔
pDC->SetBkColor(COLOR_EDIT);
return g_hbrEdit;//自己定义的全局画刷句柄
}
BOOL CSkinIPAddressCtrl::OnEraseBkgnd(CDC* pDC)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
return TRUE;//CIPAddressCtrl::OnEraseBkgnd(pDC);
}
//画客户区
void CSkinIPAddressCtrl::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: 在此处添加消息处理程序代码
// 不为绘图消息调用 CIPAddressCtrl::OnPaint()
//先填充背景,再画“.”
CRect recClient;
this->GetClientRect(&recClient);
dc.FillSolidRect(&recClient,COLOR_EDIT);
CRect recTemp = recClient;
for(int x=1;x<4;x++)
{
int nWidth = (recClient.Width()/2)*x;
recTemp.right = recTemp.left + nWidth;
CString str = _T(" .");
dc.DrawText(str,&recTemp,DT_CENTER);
}
}
//画非客户区,如果不画就显得比其它控件小,因为IP控件有边框
void CSkinIPAddressCtrl::OnNcPaint()
{
CDC *dc = GetWindowDC();
CRect recWnd;
GetWindowRect(&recWnd);
recWnd.right = recWnd.Width();
recWnd.bottom = recWnd.Height();
recWnd.left = recWnd.top = 0;
dc->FillSolidRect(&recWnd,COLOR_EDIT);
ReleaseDC(dc);
}
LRESULT CSkinIPAddressCtrl::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// TODO: 在此添加专用代码和/或调用基类
if(message == WM_PAINT)
{
OnPaint();
return 0;
}
else if(message == WM_NCPAINT)
{
OnNcPaint();
return 0;
}
return CIPAddressCtrl::WindowProc(message, wParam, lParam);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//SkinIPAddressCtrl.h
#pragma once
// CSkinIPAddressCtrl
class CSkinIPAddressCtrl : public CIPAddressCtrl
{
DECLARE_DYNAMIC(CSkinIPAddressCtrl)
public:
CSkinIPAddressCtrl();
virtual ~CSkinIPAddressCtrl();
protected:
DECLARE_MESSAGE_MAP()
public:
afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
afx_msg void OnPaint();
protected:
virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);
void OnNcPaint();
};
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//SkinIPAddressCtrl.cpp
// SkinIPAddressCtrl.cpp : 实现文件
//
#include "stdafx.h"
#include "SkinIPAddressCtrl.h"
#define COLOR_EDIT RGB(109,109,109)
// CSkinIPAddressCtrl
IMPLEMENT_DYNAMIC(CSkinIPAddressCtrl, CIPAddressCtrl)
CSkinIPAddressCtrl::CSkinIPAddressCtrl()
{
}
CSkinIPAddressCtrl::~CSkinIPAddressCtrl()
{
}
BEGIN_MESSAGE_MAP(CSkinIPAddressCtrl, CIPAddressCtrl)
ON_WM_CTLCOLOR()
ON_WM_ERASEBKGND()
END_MESSAGE_MAP()
// CSkinIPAddressCtrl 消息处理程序
HBRUSH CSkinIPAddressCtrl::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CIPAddressCtrl::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: 在此更改 DC 的任何属性
// TODO: 如果默认的不是所需画笔,则返回另一个画笔
pDC->SetBkColor(COLOR_EDIT);
return g_hbrEdit;//自己定义的全局画刷句柄
}
BOOL CSkinIPAddressCtrl::OnEraseBkgnd(CDC* pDC)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
return TRUE;//CIPAddressCtrl::OnEraseBkgnd(pDC);
}
//画客户区
void CSkinIPAddressCtrl::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: 在此处添加消息处理程序代码
// 不为绘图消息调用 CIPAddressCtrl::OnPaint()
//先填充背景,再画“.”
CRect recClient;
this->GetClientRect(&recClient);
dc.FillSolidRect(&recClient,COLOR_EDIT);
CRect recTemp = recClient;
for(int x=1;x<4;x++)
{
int nWidth = (recClient.Width()/2)*x;
recTemp.right = recTemp.left + nWidth;
CString str = _T(" .");
dc.DrawText(str,&recTemp,DT_CENTER);
}
}
//画非客户区,如果不画就显得比其它控件小,因为IP控件有边框
void CSkinIPAddressCtrl::OnNcPaint()
{
CDC *dc = GetWindowDC();
CRect recWnd;
GetWindowRect(&recWnd);
recWnd.right = recWnd.Width();
recWnd.bottom = recWnd.Height();
recWnd.left = recWnd.top = 0;
dc->FillSolidRect(&recWnd,COLOR_EDIT);
ReleaseDC(dc);
}
LRESULT CSkinIPAddressCtrl::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// TODO: 在此添加专用代码和/或调用基类
if(message == WM_PAINT)
{
OnPaint();
return 0;
}
else if(message == WM_NCPAINT)
{
OnNcPaint();
return 0;
}
return CIPAddressCtrl::WindowProc(message, wParam, lParam);
}
相关文章推荐
- MFC中利用TeeChart控件完成三维图形绘制
- MFC利用浏览器控件进行对话框与html的交互
- 利用SWFUpload V2.2.0 免费控件进行大文件上传!
- MFC控件的绘制与响应顺序——ZOrder
- Python 利用matplotlib绘制热力图 correlation heatmap X,Y 坐标轴字体重叠显示问题,将字体进行旋转
- MFC+OpenCV 利用Show方法使图像不拉伸显示在Picture控件上
- 利用MFC中的picture control 控件显示图像
- 完美自绘制CListCtrl控件2[MFC]
- MFC控件的绘制与响应顺序——ZOrder
- MFC双缓冲绘制多边形,将图形透明贴在控件上
- OpenCV 利用MFC的Picture控件显示和处理图像
- VS2010利用MFC的MSCcom控件的方法(WIN8系统)
- MFC中CEdit控件实现多行,并且可在界面进行修改
- cmake编译dcmtk,并利用vs2010 进行开发mfc 程序
- 利用微软Speech SDK 5.1在MFC中进行语音识别开发时的主要步骤
- MFC--工具条插入下拉框控件(利用m_comboButton)
- 利用WPF控件进行XNA开发
- MFC 控件显示层次调整(叠放次序)和绘制控制问题
- 调用MFC建立窗口进行绘制的极简版(for greenhands)——单文件
- --=== 利用微软网格控件进行编辑输入==--