VS对话框按钮贴图和Static控件自定义

软件开发中,为了让用户更喜欢使用我们的软件,除了具有良好的性能外,还需要美观的界面。

本文简单地介绍下对话框背景贴图和按钮贴图,以及Static控件自定义成各种Static效果。

首先贴个图,让大家看看效果

1.新建对话框应用程序

2.添加图片资源

3.背景贴图

重写OnPaint函数

void CDlgBmpTestDemoDlg::OnPaint()
{
	CPaintDC dc(this); // 用于绘制的设备上下文
	//绘制背景
	CBitmap bitmap;
	bitmap.LoadBitmap(MAKEINTRESOURCE(IDB_BITMAP_PIC));
	BITMAP bmpInfo;
	bitmap.GetBitmap(&bmpInfo);
	CDC bitmapDC;
	bitmapDC.CreateCompatibleDC(&dc);
	CBitmap* pOldBitmap = bitmapDC.SelectObject(&bitmap);
	dc.BitBlt(0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, &bitmapDC,0, 0, SRCCOPY);
	bitmapDC.SelectObject(pOldBitmap);
	bitmap.DeleteObject();
}

设置位置和大小

<span style="white-space:pre">	</span>//对话框背景图片宽和高
	const int nBkBmpWidth = 480;
	const int nBkBmpHeight = 300;
	int xPos = 0;
	int yPos = 0;

	//获得电脑显示器的像素宽度和像素高度
	int ax = GetDC()->GetDeviceCaps(HORZRES) - nBkBmpWidth;
	int ay = GetDC()->GetDeviceCaps(VERTRES) - nBkBmpHeight;

	int nWidth = 0;
	int nHeight = 0;
	if(ax <= 0)
	{	ax = 0;	}
	else
	{	ax = ax/2;	}
	if(ay <= 0)
	{	ay = 0;	}
	else
	{	ay = ay/2;	}

	RECT clientRect;
	RECT rt;
	clientRect.left = ax;
	clientRect.top = ay;
	clientRect.right = clientRect.left + nBkBmpWidth;
	clientRect.bottom = clientRect.top + nBkBmpHeight;
	MoveWindow(&clientRect);

效果

4.按钮贴图

OwnerDraw的属性设置为True

定义变量

	CBitmapButton m_btnOne;

加载图片资源

	m_btnOne.LoadBitmaps(IDB_BITMAP_BTN);

设置按钮位置和大小

	const int nBottomBtnWidth = 95;
	const int nBottomBtnHeight = 30;
	const int nPadding = 8;//按钮的水平间距
	xPos = 0;
	yPos = 0;
	yPos = clientRect.top + 250;

	//xPos = clientRect.left + nPadding;
	xPos = clientRect.left + nPadding*4 + nBottomBtnWidth*3;
	m_btnOne.MoveWindow(xPos,yPos,nBottomBtnWidth,nBottomBtnHeight);

效果

5.Static标题自定义

DlgTitleStatic.h

#pragma once

// CDlgTitleStatic

class CDlgTitleStatic : public CStatic
{
	DECLARE_DYNAMIC(CDlgTitleStatic)

public:
	CDlgTitleStatic();
	virtual ~CDlgTitleStatic();

protected:
	DECLARE_MESSAGE_MAP()

private:
	CString m_sTitleText;
	LOGFONT m_LogFontTitle;
	UINT  m_nFormat;
	DWORD m_dwColor;
public:
	afx_msg void OnPaint();
	void SetTitleText(CString sTitleText);
};

DlgTitleStatic.cpp

// DlgTitleStatic.cpp : 实现文件
//

#include "stdafx.h"
#include "DlgBmpTestDemo.h"
#include "DlgTitleStatic.h"

// CDlgTitleStatic

IMPLEMENT_DYNAMIC(CDlgTitleStatic, CStatic)

CDlgTitleStatic::CDlgTitleStatic()
{
	m_LogFontTitle.lfHeight = 32;
	m_LogFontTitle.lfWeight = 600;
	m_LogFontTitle.lfOrientation= 0;
	m_LogFontTitle.lfEscapement = 0;
	m_LogFontTitle.lfWidth = 14;
	m_LogFontTitle.lfItalic = false;
	m_LogFontTitle.lfUnderline = false;
	m_LogFontTitle.lfStrikeOut = false;
	m_LogFontTitle.lfCharSet = GB2312_CHARSET;
	m_LogFontTitle.lfOutPrecision = OUT_DEFAULT_PRECIS;
	m_LogFontTitle.lfClipPrecision = CLIP_DEFAULT_PRECIS;
	m_LogFontTitle.lfQuality = DRAFT_QUALITY;
	m_LogFontTitle.lfPitchAndFamily = DEFAULT_PITCH;
	wcscpy_s(m_LogFontTitle.lfFaceName,_T("黑体"));

	m_nFormat = DT_SINGLELINE|DT_CENTER	|DT_VCENTER|DT_END_ELLIPSIS;
	//m_nFormat = DT_LEFT |DT_TOP	|DT_END_ELLIPSIS;

	m_dwColor = RGB(255,0,0);

	m_sTitleText = _T("对话框测试");
}

CDlgTitleStatic::~CDlgTitleStatic()
{
}

BEGIN_MESSAGE_MAP(CDlgTitleStatic, CStatic)
	ON_WM_PAINT()
END_MESSAGE_MAP()

// CDlgTitleStatic 消息处理程序

void CDlgTitleStatic::OnPaint()
{
	CPaintDC dc(this); // device context for painting
	// TODO: 在此处添加消息处理程序代码
	// 不为绘图消息调用 CStatic::OnPaint()

	RECT rect;
	GetClientRect(&rect);

	CBrush brush0(RGB(250,250,250));
	dc.FillRect(&rect,&brush0);

	HFONT hFont = ::CreateFontIndirect(&m_LogFontTitle);
	HFONT hOldFont = (HFONT)::SelectObject(dc.m_hDC,hFont);
	dc.SetTextColor(m_dwColor);//画文字
	int oldMode = dc.SetBkMode(TRANSPARENT);
	dc.DrawText(m_sTitleText,&rect,m_nFormat);
	hFont = (HFONT)::SelectObject(dc.m_hDC,hOldFont);
	::DeleteObject(hFont);
	dc.SetBkMode(oldMode);
}

void CDlgTitleStatic::SetTitleText(CString sTitleText)
{
	m_sTitleText = sTitleText;
}

变量

	CDlgTitleStatic m_stcDlgTitle;

设置标题内容和位置

	//改变对话框标题静态文本框位置
	rt.left = clientRect.left + 10;
	rt.top = clientRect.top + 30;
	m_stcDlgTitle.MoveWindow(rt.left,rt.top,460,35);
	m_stcDlgTitle.SetTitleText(TEXT("对话框测试"));

效果

6.Static区域自定义

DlgAreaStatic.h

#pragma once

// CDlgAreaStatic

class CDlgAreaStatic : public CStatic
{
	DECLARE_DYNAMIC(CDlgAreaStatic)

public:
	CDlgAreaStatic();
	virtual ~CDlgAreaStatic();

protected:
	DECLARE_MESSAGE_MAP()
private:
	UINT  m_nFormat;
	CString m_sAreaTitleText;
	LOGFONT m_LogFontAreaTitle;
	DWORD m_dwColor;
public:
	afx_msg void OnPaint();
	void SetAreaTitle(CString sAreaTitle);
};

DlgAreaStatic.cpp

// DlgAreaStatic.cpp : 实现文件
//

#include "stdafx.h"
#include "DlgBmpTestDemo.h"
#include "DlgAreaStatic.h"

// CDlgAreaStatic

IMPLEMENT_DYNAMIC(CDlgAreaStatic, CStatic)

CDlgAreaStatic::CDlgAreaStatic()
{
	m_sAreaTitleText = _T("Title");

	m_LogFontAreaTitle.lfHeight = 20;
	m_LogFontAreaTitle.lfWeight = 400;
	m_LogFontAreaTitle.lfOrientation= 0;
	m_LogFontAreaTitle.lfEscapement = 0;
	m_LogFontAreaTitle.lfWidth = 10;
	m_LogFontAreaTitle.lfItalic = false;
	m_LogFontAreaTitle.lfUnderline = false;
	m_LogFontAreaTitle.lfStrikeOut = false;
	m_LogFontAreaTitle.lfCharSet = GB2312_CHARSET;
	m_LogFontAreaTitle.lfOutPrecision = OUT_DEFAULT_PRECIS;
	m_LogFontAreaTitle.lfClipPrecision = CLIP_DEFAULT_PRECIS;
	m_LogFontAreaTitle.lfQuality = DRAFT_QUALITY;
	m_LogFontAreaTitle.lfPitchAndFamily = DEFAULT_PITCH;
	wcscpy_s(m_LogFontAreaTitle.lfFaceName,_T("黑体"));

	m_dwColor = RGB(0,0,0);

	m_nFormat = DT_SINGLELINE|DT_LEFT|DT_TOP|DT_END_ELLIPSIS;
}

CDlgAreaStatic::~CDlgAreaStatic()
{
}

BEGIN_MESSAGE_MAP(CDlgAreaStatic, CStatic)
	ON_WM_PAINT()
END_MESSAGE_MAP()

// CDlgAreaStatic 消息处理程序

void CDlgAreaStatic::OnPaint()
{
	CPaintDC dc(this); // device context for painting
	// TODO: 在此处添加消息处理程序代码
	// 不为绘图消息调用 CStatic::OnPaint()
	RECT rect;
	GetClientRect(&rect);

	CBrush brush0(RGB(192,192,192));
	dc.FillRect(&rect,&brush0);

	RECT rt = rect;	

	HFONT hFont = ::CreateFontIndirect(&m_LogFontAreaTitle);
	HFONT hOldFont = (HFONT)::SelectObject(dc.m_hDC,hFont);
	dc.SetTextColor(RGB(0,0,0));//画文字
	dc.SetBkMode(TRANSPARENT);
	dc.DrawEdge(&rect,EDGE_SUNKEN,BF_RECT);
	rt.left = rect.left + 21;
	rt.top  = rect.top + 8;
	rt.bottom = rt.top + 40;
	dc.DrawText(m_sAreaTitleText,&rt,m_nFormat);
	hFont = (HFONT)::SelectObject(dc.m_hDC,hOldFont);
	::DeleteObject(hFont);
}

void CDlgAreaStatic::SetAreaTitle(CString sAreaTitle)
{
	m_sAreaTitleText = sAreaTitle;
}

变量

	CDlgAreaStatic m_stcArea;

设置区域位置和大小

	xPos = clientRect.left + 10;
	yPos = clientRect.top + 70;
	m_stcArea.MoveWindow(xPos,yPos,460,160);
	m_stcArea.SetAreaTitle(_T("区域划分"));

效果

7.Static文本自定义

DlgTextStatic.h

#pragma once

// CDlgTextStatic

class CDlgTextStatic : public CStatic
{
	DECLARE_DYNAMIC(CDlgTextStatic)

public:
	CDlgTextStatic();
	virtual ~CDlgTextStatic();

protected:
	DECLARE_MESSAGE_MAP()
private:
	CString m_sTitleText;
	LOGFONT m_LogFontTitle;
	UINT  m_nFormat;
	DWORD m_dwColor;
public:
	afx_msg void OnPaint();
	void SetTitleText(CString sTitleText);
};

DlgTextStatic.cpp

// DlgTextStatic.cpp : 实现文件
//

#include "stdafx.h"
#include "DlgBmpTestDemo.h"
#include "DlgTextStatic.h"

// CDlgTextStatic

IMPLEMENT_DYNAMIC(CDlgTextStatic, CStatic)

CDlgTextStatic::CDlgTextStatic()
{
	m_LogFontTitle.lfHeight = 20;
	m_LogFontTitle.lfWeight = 400;
	m_LogFontTitle.lfOrientation= 0;
	m_LogFontTitle.lfEscapement = 0;
	m_LogFontTitle.lfWidth = 10;
	m_LogFontTitle.lfItalic = false;
	m_LogFontTitle.lfUnderline = false;
	m_LogFontTitle.lfStrikeOut = false;
	m_LogFontTitle.lfCharSet = GB2312_CHARSET;
	m_LogFontTitle.lfOutPrecision = OUT_DEFAULT_PRECIS;
	m_LogFontTitle.lfClipPrecision = CLIP_DEFAULT_PRECIS;
	m_LogFontTitle.lfQuality = DRAFT_QUALITY;
	m_LogFontTitle.lfPitchAndFamily = DEFAULT_PITCH;
	wcscpy_s(m_LogFontTitle.lfFaceName,_T("黑体"));

//	m_nFormat = DT_SINGLELINE|DT_CENTER	|DT_VCENTER|DT_END_ELLIPSIS;
	m_nFormat = DT_LEFT |DT_TOP	|DT_END_ELLIPSIS;

	m_dwColor = RGB(0,0,255);

	m_sTitleText = _T("Title");
}

CDlgTextStatic::~CDlgTextStatic()
{
}

BEGIN_MESSAGE_MAP(CDlgTextStatic, CStatic)
	ON_WM_PAINT()
END_MESSAGE_MAP()

// CDlgTextStatic 消息处理程序

void CDlgTextStatic::OnPaint()
{
	CPaintDC dc(this); // device context for painting
	// TODO: 在此处添加消息处理程序代码
	// 不为绘图消息调用 CStatic::OnPaint()
	RECT rect;
	GetClientRect(&rect);

	CBrush brush0(RGB(192,192,192));
	dc.FillRect(&rect,&brush0);

	HFONT hFont = ::CreateFontIndirect(&m_LogFontTitle);
	HFONT hOldFont = (HFONT)::SelectObject(dc.m_hDC,hFont);
	dc.SetTextColor(m_dwColor);//画文字
	int oldMode = dc.SetBkMode(TRANSPARENT);
	dc.DrawText(m_sTitleText,&rect,m_nFormat);
	hFont = (HFONT)::SelectObject(dc.m_hDC,hOldFont);
	::DeleteObject(hFont);
	dc.SetBkMode(oldMode);
}

void CDlgTextStatic::SetTitleText(CString sTitleText)
{
	m_sTitleText = sTitleText;
}

变量

	CDlgTextStatic m_stcTip;

初始化

	m_stcTip.SetTitleText(_T("这只是一个说明"));

设置位置和大小

	<a target=_blank href="http://download.csdn.net/detail/bingdianlanxin/8392241">源码下载</a>xPos = clientRect.left + 80;
	yPos = clientRect.top + 120;
	m_stcTip.MoveWindow(xPos,yPos,300,40);

效果

8.Static数值自定义

DlgSignalStatic.h

#pragma once

// CDlgSignalStatic

#define SSTC_STATUS_YES 0
#define SSTC_STATUS_NO  1
#define SSTC_STATUS_DEFAULT 2

class CDlgSignalStatic : public CStatic
{
	DECLARE_DYNAMIC(CDlgSignalStatic)

public:
	CDlgSignalStatic();
	virtual ~CDlgSignalStatic();

protected:
	DECLARE_MESSAGE_MAP()
private:
	public:
	CString m_sSignalName;
	CString m_sSignalValue;
	CString m_sSignalUnit;
	int     m_nSignalStatus;

	int m_nNameWidth;
	int m_nValueWidth;
	int m_nUnitWidth;
	int m_nStatusWidth;
	int m_nHeight;

	DWORD m_dwSignalBgColor;
	DWORD m_dwSignalTxtColor;
	DWORD m_dwStatusColor;
	DWORD m_dwNameColor;

	LOGFONT m_LogFont;
public:
	afx_msg void OnPaint();
	void UpdateSignalValue(CString sValue);
	void UpdateSignalStatus(int flag);
};

DlgSignalStatic.cpp

// DlgSignalStatic.cpp : 实现文件
//

#include "stdafx.h"
#include "DlgBmpTestDemo.h"
#include "DlgSignalStatic.h"

// CDlgSignalStatic

IMPLEMENT_DYNAMIC(CDlgSignalStatic, CStatic)

CDlgSignalStatic::CDlgSignalStatic()
{
	m_sSignalName = _T("--");
	m_sSignalValue = _T("--");
	m_sSignalUnit = _T("--");
	m_nSignalStatus = SSTC_STATUS_DEFAULT;

	m_nStatusWidth = 40;
	m_nHeight = 30;

	m_nNameWidth = 60;
	m_nValueWidth = 120;
	m_nUnitWidth = 80;

	m_dwSignalBgColor = RGB(0,0,0);
	m_dwSignalTxtColor = RGB(0,255,0);
	m_dwStatusColor = RGB(255,0,255);
	m_dwNameColor = RGB(0,0,255);

	m_LogFont.lfHeight = 20;
	m_LogFont.lfWeight = 400;
	m_LogFont.lfOrientation= 0;
	m_LogFont.lfEscapement = 0;
	m_LogFont.lfWidth = 10;
	m_LogFont.lfItalic = false;
	m_LogFont.lfUnderline = false;
	m_LogFont.lfStrikeOut = false;
	m_LogFont.lfCharSet = GB2312_CHARSET;
	m_LogFont.lfOutPrecision = OUT_DEFAULT_PRECIS;
	m_LogFont.lfClipPrecision = CLIP_DEFAULT_PRECIS;
	m_LogFont.lfQuality = DRAFT_QUALITY;
	m_LogFont.lfPitchAndFamily = DEFAULT_PITCH;
	wcscpy_s(m_LogFont.lfFaceName,_T("黑体"));
}

CDlgSignalStatic::~CDlgSignalStatic()
{
}

BEGIN_MESSAGE_MAP(CDlgSignalStatic, CStatic)
	ON_WM_PAINT()
END_MESSAGE_MAP()

// CDlgSignalStatic 消息处理程序

void CDlgSignalStatic::OnPaint()
{
	CPaintDC dc(this); // device context for painting
	// TODO: 在此处添加消息处理程序代码
	// 不为绘图消息调用 CStatic::OnPaint()
	RECT rect;
	GetClientRect(&rect);

	CBrush brush0(RGB(192,192,192));
	dc.FillRect(&rect,&brush0);

	RECT rt = rect;	

	UINT  nFormat;
	HFONT hFont = ::CreateFontIndirect(&m_LogFont);
	HFONT hOldFont = (HFONT)::SelectObject(dc.m_hDC,hFont);
	dc.SetBkMode(TRANSPARENT);

	//name
	nFormat = DT_SINGLELINE|DT_LEFT|DT_VCENTER|DT_END_ELLIPSIS;
	dc.SetTextColor(m_dwNameColor);//画文字

	rt.right = rt.left + m_nNameWidth;
	rt.bottom  = rt.top + m_nHeight;
	dc.DrawText(m_sSignalName,&rt,nFormat);

	//value
	nFormat = DT_SINGLELINE|DT_LEFT|DT_VCENTER|DT_END_ELLIPSIS;
	rt.left  = rt.right;
	rt.right = rt.left + m_nValueWidth;
	dc.FillSolidRect(&rt,m_dwSignalBgColor);
	dc.SetTextColor(m_dwSignalTxtColor);
	dc.DrawText(m_sSignalValue,&rt,nFormat);

	//unit
	rt.left = rt.right;
	rt.right = rt.left + m_nUnitWidth;
	dc.SetTextColor(m_dwNameColor);
	dc.DrawText(m_sSignalUnit,&rt,nFormat);

	CPen bkPen(PS_SOLID,3,RGB(192,192,192));
	if(SSTC_STATUS_YES == m_nSignalStatus)//画勾
	{
		rt.left = rt.right+ 100;
		rt.right = rt.left + 200;

		dc.SelectObject(&bkPen);
		int x = rt.left + 25;
		int y = rt.top + 4;
		int j = 0;
		for(j=0;j<17;j++)
		{
			dc.MoveTo(x,y);
			dc.LineTo(x,y+1);
			x--;
			y++;
		}
		x = rt.left + 25;
		y--;
		for(j=0;j<17;j++)
		{
			dc.MoveTo(x,y);
			dc.LineTo(x,y+1);
			x--;
			y--;
		}

		CPen pen(PS_SOLID,1,m_dwStatusColor);
		dc.SelectObject(&pen);
		x = rt.left + 30;
		y = rt.top + 4;
		j = 0;
		for(j=0;j<16;j++)
		{
			dc.MoveTo(x,y);
			dc.LineTo(x,y+5);
			x--;
			y++;
		}
		for(j=0;j<8;j++)
		{
			dc.MoveTo(x,y);
			dc.LineTo(x,y+5);
			x--;
			y--;
		}
	}
	else if(SSTC_STATUS_NO == m_nSignalStatus)//画叉
	{
		rt.left = rt.right+ 100;
		rt.right = rt.left + 200;
		dc.SelectObject(&bkPen);
		int x = rt.left + 30;
		int y = rt.top + 4;
		int j = 0;
		for(j=0;j<16;j++)
		{
			dc.MoveTo(x,y);
			dc.LineTo(x,y+5);
			x--;
			y++;
		}
		for(j=0;j<8;j++)
		{
			dc.MoveTo(x,y);
			dc.LineTo(x,y+5);
			x--;
			y--;
		}

		CPen pen(PS_SOLID,3,RGB(255,0,0));
		dc.SelectObject(&pen);
		x = rt.left + 25;
		y = rt.top + 4;
		j = 0;
		for(j=0;j<17;j++)
		{
			dc.MoveTo(x,y);
			dc.LineTo(x,y+1);
			x--;
			y++;
		}
		x = rt.left + 25;
		y--;
		for(j=0;j<17;j++)
		{
			dc.MoveTo(x,y);
			dc.LineTo(x,y+1);
			x--;
			y--;
		}
	}
	else//什么都不画
	{
	}
	hFont = (HFONT)::SelectObject(dc.m_hDC,hOldFont);
	::DeleteObject(hFont);
}

void CDlgSignalStatic::UpdateSignalValue(CString sValue)
{
	m_sSignalValue = sValue;

	RECT rect;
	GetClientRect(&rect);

	InvalidateRect(&rect,TRUE);
}

void CDlgSignalStatic::UpdateSignalStatus(int flag)
{
	m_nSignalStatus = flag;

	RECT rect;
	GetClientRect(&rect);

	InvalidateRect(&rect,TRUE);
}

变量

	CDlgSignalStatic m_stcValue;

初始化

	m_stcValue.m_sSignalName = _T("数值");
	m_stcValue.m_sSignalValue = _T("50");
	m_stcValue.m_sSignalUnit = _T(" %");

设置位置和大小

	xPos = clientRect.left + 80;
	yPos = clientRect.top + 150;
	m_stcValue.MoveWindow(xPos,yPos,300,40);

效果

9.对话框类

DlgBmpTestDemoDlg.h

// DlgBmpTestDemoDlg.h : 头文件
//

#pragma once
#include "afxwin.h"
#include "DlgTitleStatic.h"
#include "DlgAreaStatic.h"
#include "DlgTextStatic.h"
#include "DlgSignalStatic.h"

// CDlgBmpTestDemoDlg 对话框
class CDlgBmpTestDemoDlg : public CDialog
{
// 构造
public:
	CDlgBmpTestDemoDlg(CWnd* pParent = NULL);	// 标准构造函数

// 对话框数据
	enum { IDD = IDD_DLGBMPTESTDEMO_DIALOG };

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV 支持

// 实现
protected:
	HICON m_hIcon;

	// 生成的消息映射函数
	virtual BOOL OnInitDialog();
	afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
	afx_msg void OnPaint();
	afx_msg HCURSOR OnQueryDragIcon();
	DECLARE_MESSAGE_MAP()
public:
	CDlgTitleStatic m_stcDlgTitle;
	CDlgAreaStatic m_stcArea;
	CDlgTextStatic m_stcTip;
	CDlgSignalStatic m_stcValue;
	CBitmapButton m_btnOne;
	void initUi(void);
	afx_msg void OnBnClickedBtnOne();
};

DlgBmpTestDemoDlg.cpp

// DlgBmpTestDemoDlg.cpp : 实现文件
//

#include "stdafx.h"
#include "DlgBmpTestDemo.h"
#include "DlgBmpTestDemoDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

// 用于应用程序“关于”菜单项的 CAboutDlg 对话框

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// 对话框数据
	enum { IDD = IDD_ABOUTBOX };

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

// 实现
protected:
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()

// CDlgBmpTestDemoDlg 对话框

CDlgBmpTestDemoDlg::CDlgBmpTestDemoDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CDlgBmpTestDemoDlg::IDD, pParent)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

	m_stcTip.SetTitleText(_T("这只是一个说明"));

	m_stcValue.m_sSignalName = _T("数值");
	m_stcValue.m_sSignalValue = _T("50");
	m_stcValue.m_sSignalUnit = _T(" %");
}

void CDlgBmpTestDemoDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_STATIC_DLG_TITLE, m_stcDlgTitle);
	DDX_Control(pDX, IDC_BTN_ONE, m_btnOne);
	DDX_Control(pDX, IDC_STATIC_AREA, m_stcArea);
	DDX_Control(pDX, IDC_STATIC_TIP, m_stcTip);
	DDX_Control(pDX, IDC_STATIC_VALUE, m_stcValue);
}

BEGIN_MESSAGE_MAP(CDlgBmpTestDemoDlg, CDialog)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	//}}AFX_MSG_MAP
	ON_BN_CLICKED(IDC_BTN_ONE, &CDlgBmpTestDemoDlg::OnBnClickedBtnOne)
END_MESSAGE_MAP()

// CDlgBmpTestDemoDlg 消息处理程序

BOOL CDlgBmpTestDemoDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// 将“关于...”菜单项添加到系统菜单中。

	// IDM_ABOUTBOX 必须在系统命令范围内。
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	// TODO: 在此添加额外的初始化代码
	initUi();

	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

void CDlgBmpTestDemoDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。

void CDlgBmpTestDemoDlg::OnPaint()
{
	CPaintDC dc(this); // 用于绘制的设备上下文
	if (IsIconic())
	{
		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// 使图标在工作区矩形中居中
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// 绘制图标
		dc.DrawIcon(x, y, m_hIcon);

	}
	else
	{
		CDialog::OnPaint();
	}

	//绘制背景
	CBitmap bitmap;
	bitmap.LoadBitmap(MAKEINTRESOURCE(IDB_BITMAP_PIC));
	BITMAP bmpInfo;
	bitmap.GetBitmap(&bmpInfo);
	CDC bitmapDC;
	bitmapDC.CreateCompatibleDC(&dc);
	CBitmap* pOldBitmap = bitmapDC.SelectObject(&bitmap);
	dc.BitBlt(0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, &bitmapDC,0, 0, SRCCOPY);
	bitmapDC.SelectObject(pOldBitmap);
	bitmap.DeleteObject();
}

//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CDlgBmpTestDemoDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}

void CDlgBmpTestDemoDlg::initUi(void)
{
	//================================使对话框居中显示 START===============================
	//对话框背景图片宽和高
	const int nBkBmpWidth = 480;
	const int nBkBmpHeight = 300;
	int xPos = 0;
	int yPos = 0;

	//获得电脑显示器的像素宽度和像素高度
	int ax = GetDC()->GetDeviceCaps(HORZRES) - nBkBmpWidth;
	int ay = GetDC()->GetDeviceCaps(VERTRES) - nBkBmpHeight;

	int nWidth = 0;
	int nHeight = 0;
	if(ax <= 0)
	{	ax = 0;	}
	else
	{	ax = ax/2;	}
	if(ay <= 0)
	{	ay = 0;	}
	else
	{	ay = ay/2;	}

	RECT clientRect;
	RECT rt;
	clientRect.left = ax;
	clientRect.top = ay;
	clientRect.right = clientRect.left + nBkBmpWidth;
	clientRect.bottom = clientRect.top + nBkBmpHeight;
	MoveWindow(&clientRect);
	//================================使对话框居中显示 END===============================

	GetWindowRect(&clientRect);
	ScreenToClient(&clientRect);

	//改变对话框标题静态文本框位置
	rt.left = clientRect.left + 10;
	rt.top = clientRect.top + 30;
	m_stcDlgTitle.MoveWindow(rt.left,rt.top,460,35);
	m_stcDlgTitle.SetTitleText(TEXT("对话框测试"));

	//===============================区域划分===============================
	// 区域
	xPos = clientRect.left + 10;
	yPos = clientRect.top + 70;
	m_stcArea.MoveWindow(xPos,yPos,460,160);
	m_stcArea.SetAreaTitle(_T("区域划分"));

	//text
	xPos = clientRect.left + 80;
	yPos = clientRect.top + 120;
	m_stcTip.MoveWindow(xPos,yPos,300,40);
	//value
	xPos = clientRect.left + 80;
	yPos = clientRect.top + 150;
	m_stcValue.MoveWindow(xPos,yPos,300,40);

	//===============================对话框底部按钮===============================
	const int nBottomBtnWidth = 95;
	const int nBottomBtnHeight = 30;
	const int nPadding = 8;//按钮的水平间距
	xPos = 0;
	yPos = 0;
	yPos = clientRect.top + 250;

	//xPos = clientRect.left + nPadding;
	xPos = clientRect.left + nPadding*4 + nBottomBtnWidth*3;
	m_btnOne.MoveWindow(xPos,yPos,nBottomBtnWidth,nBottomBtnHeight);

	//加载图片资源
	m_btnOne.LoadBitmaps(IDB_BITMAP_BTN);

}

void CDlgBmpTestDemoDlg::OnBnClickedBtnOne()
{
	// TODO: 在此添加控件通知处理程序代码
	OnOK();
}

10.文档结构

 

源码下载

时间: 2024-12-10 03:40:05

VS对话框按钮贴图和Static控件自定义的相关文章

用按钮打开对话框选取图片按大小显示在控件中

[cpp] view plaincopy 打开按钮相应消息 [cpp] view plaincopy void CLoadBmpDlg::OnBtnOpenBmp() { // TODO: Add your control notification handler code here ////选取图片文件 [cpp] view plaincopy CFileDialog file_open_dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY,"BMP Files(*.bmp)

amCharts 股票走势K线图金融图表控件下载及详细介绍

amCharts股票走势图的主要目的是为了显示金融图表控件,但它可以用于任何日期(时间)为基础的数据可视化. 股票走势图,是一个功能强大的应用程序,让你忘了最枯燥的部分构建复杂的统计系统.它具有内置的期间和数据集选择工具,并能较长组数据.这使您可以向下钻取图表不用任何额外的编码,只使用一个数据文件.单击"最大"按钮下面的图表,你会发现该图表显示月度数据.点击"1月"的按钮,你会看到,现在的图表显示每天的数据. 主要特点: 支持线,柱,烛台,OHLC,步线的图表类型.

Windows static控件(静态文本框控件)

文本不克不及主动换行,超越窗口规模会被隐蔽: 每次更改文本都要先擦除配景再从新输入,比拟费事. 实践开辟中普通运用静态文本框控件来输入文本.静态文本框是Windows 的一种规范控件,可以用来在窗口上显示一段文本,而且文本轻易遭到掌握.除了静态文本框,Windows的规范控件还有许多种,例如按钮.下拉菜单.单选按钮.复选框等.其实,控件也是一种窗口,也运用 CreateWindow 函数来创立.然则它们运用的窗口类的名字比拟特别,是由Windows预界说的:静态文本框控件的窗口类名是static

Static控件响应鼠标事件

tatic控件默认是不支持响应鼠标消息的,如果把其ID从IDC_STATIC改成其他的,可见其可以响应BN_CLICKED消息,但这远远不够.但是MS也没有把路堵死,我们可以利用SetWindowLong,动态增加 其SS_NOTIFY风格,使其支持鼠标响应. 1.不重载CStatic,使静态文本控件支持鼠标消息的办法 //可以在InitDialog中添加 DWORD dwStyle = m_static1.GetStyle(); dwStyle |= SS_NOTIFY; SetWindowL

WPF的ListView控件自定义布局用法实例

本文实例讲述了WPF的ListView控件自定义布局用法.分享给大家供大家参考,具体如下: 概要: 以源码的形式贴出,免得忘记后,再到网上查资料.在VS2008+SP1环境下调试通过 引用的GrayscaleEffect模块,可根据参考资料<Grayscale Effect...>中的位置下载. 正文: 如何布局是在App.xaml中定义源码如下 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27

android控件---自定义带文本的ImageButton

由于SDK提供的ImageButton只能添加图片,不能添加文字:而Button控件添加的文字只能显示在图片内部:当我们需要添加文字在图片外部时就不能满足我们的需求了,顾只能自己写个自定义ImageButton.说是ImageButton,其实并不是继承于ImageButton,而是从LinearLayout继承,由于LinearLayout是线性排列,通过setOrientation(LinearLayout.VERTICAL)的方式达到View垂直排列的目的,所以很简单,只需要添加两个Vie

如何在MFC对话框应用程序中使用ColorPicker控件

在日常的应用程序开发中,当涉及到曲线绘制时,为了将多条不同类型的曲线区分开,常常需要将它们指定不同的颜色.今天在这里简单的记录一下,如何实现及使用ColorPicker控件.程序用到4个文件依次为:ColourPicker.cpp.ColourPicker.h.ColourPopup.cpp.ColourPopup.h.应用程序的执行效果如下图所示: 本实现过程通过在Button按钮中进行重绘.基于Visual Studio 2008的工程下载地址:位置一.位置二.

ASP.NET一个页面多个Button按钮事件避免数据验证控件RequiredFieldValidator冲突方法

说明:在ASP.NET 1.1中除了hack code没有更好的办法.ASP.NET 2.0中给所有的validator控件和按钮(button.linkbutton等等)增加了ValidatorGroup属性,就可以轻松地解决这 个问题.如果在页面中有一个TextBox并且紧挨着他有一个RequiredFieldValidator 和Button控件,可以将RequiredFieldValidator和Button的ValidationGroup属性设置成一样的值从而使得点 击button时只

WPF自定义控件与样式(5)-Calendar/DatePicker日期控件自定义样式及扩展

一.前言 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等,若有不明白的地方可以参考本系列前面的文章,文末附有部分文章链接. 本文主要内容: 日历控件Calendar自定义样式: 日期控件DatePicker自定义样式,及Label标签.水印.清除日期功能扩展: 二.Calendar自定义样式 先看看效果: 从上面图可以看出,日历的显示其实有三种状态,如下面的分解图: "日"部分的显示: "月"部分的显示: &qu