软件开发中,为了让用户更喜欢使用我们的软件,除了具有良好的性能外,还需要美观的界面。
本文简单地介绍下对话框背景贴图和按钮贴图,以及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