您的位置:首页 > 其它

利用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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mfc