一、新增界面
新增dlg界面,并修改下图的属性
添加12个按钮,修改名称,以及自绘属性(此属性不修改,则重绘代码无效)
二、添加资源
将图标资源放入res文件夹内后,在资源视图中进行添加
三、交互
依次双击十二个按钮,在生成的函数中加入以下代码
void CDlgControl::OnBnClickedBtnInternet()
{
// 打开 IE 的设置窗口
::ShellExecute(NULL, "OPEN", "rundll32.exe",
"shell32.dll Control_RunDLL inetcpl.cpl", NULL, SW_SHOW);
}
void CDlgControl::OnBnClickedBtnSound()
{
// 打开 声音的设置窗口
::ShellExecute(NULL, "OPEN", "rundll32.exe",
"shell32.dll Control_RunDLL mmsys.cpl @1", NULL, SW_SHOW);
}
void CDlgControl::OnBnClickedBtnTime()
{
// 启动日期和时间设置
::ShellExecute(NULL, "OPEN", "rundll32.exe",
"shell32.dll Control_RunDLL timedate.cpl", NULL, SW_SHOW);
}
void CDlgControl::OnBnClickedBtnDisplay()
{
// 启动显示设置面板
::ShellExecute(NULL, "OPEN", "rundll32.exe",
"shell32.dll Control_RunDLL desk.cpl", NULL, SW_SHOW);
}
void CDlgControl::OnBnClickedBtnAccess()
{
// 启动辅助选项
::ShellExecute(NULL, "OPEN", "rundll32.exe",
"shell32.dll Control_RunDLL access.cpl", NULL, SW_SHOW);
}
void CDlgControl::OnBnClickedBtnMouse()
{
// 打开鼠标设置
::ShellExecute(NULL, "OPEN", "rundll32.exe",
"shell32.dll Control_RunDLL main.cpl @0", NULL, SW_SHOW);
}
void CDlgControl::OnBnClickedBtnKey()
{
// 启动键盘设置
::ShellExecute(NULL, "OPEN", "rundll32.exe",
"shell32.dll Control_RunDLL main.cpl @1", NULL, SW_SHOW);
}
void CDlgControl::OnBnClickedBtnField()
{
// 打开区域设置
::ShellExecute(NULL, "OPEN", "rundll32.exe",
"shell32.dll Control_RunDLL intl.cpl", NULL, SW_SHOW);
}
void CDlgControl::OnBnClickedBtnApp()
{
// 启动添加软件设置
::ShellExecute(NULL, "OPEN", "rundll32.exe",
"shell32.dll Control_RunDLL appwiz.cpl", NULL, SW_SHOW);
}
void CDlgControl::OnBnClickedBtnAdd()
{
// 启动添加硬件设置
::ShellExecute(NULL, "OPEN", "rundll32.exe",
"shell32.dll Control_RunDLL hdwwiz.cpl", NULL, SW_SHOW);
}
void CDlgControl::OnBnClickedBtnSys()
{
// 打开系统设置
::ShellExecute(NULL, "OPEN", "rundll32.exe",
"shell32.dll Control_RunDLL sysdm.cpl", NULL, SW_SHOW);
}
void CDlgControl::OnBnClickedBtnManager()
{
// 启动计算机管理设置
::ShellExecute(NULL, "OPEN", "compmgmt.msc",
"shell32.dll Control_RunDLL compmgmt.cpl", NULL, SW_SHOW);
}
四、重载按钮
MFC中想要实现特殊的按钮属性,比如icon、颜色等,只能重载属性来做
以下代码是将按键重载为黑色,按键文本为白色,添加图标显示
.h文件
#if !defined(AFX_ICONBTN_H__02A1419C_0E38_4922_ABE2_3D6D23E7A6B7__INCLUDED_)
#define AFX_ICONBTN_H__02A1419C_0E38_4922_ABE2_3D6D23E7A6B7__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// IconBtn.h : header file
//
/
// CIconBtn window
class CIconBtn : public CButton
{
// Construction
public:
CIconBtn();
CImageList m_ImageList;
int m_ImageIndex; // 图标索引
BOOL IsPressed; // 按钮是否被按下
// Attributes
public:
// Operations
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CIconBtn)
public:
virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
//}}AFX_VIRTUAL
// Implementation
public:
void SetImageIndex(UINT Index);
virtual ~CIconBtn();
// Generated message map functions
protected:
//{{AFX_MSG(CIconBtn)
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
/
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_ICONBTN_H__02A1419C_0E38_4922_ABE2_3D6D23E7A6B7__INCLUDED_)
.cpp文件
// IconBtn.cpp : implementation file
//
#include "pch.h"
#include "resource.h"
#include "CleanMasterDlg.h"
#include "IconBtn.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/
// CIconBtn
CIconBtn::CIconBtn()
{
m_ImageList.Create(32,32,ILC_COLOR24|ILC_MASK,1,0); // 创建图像列表
m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON_INTERNET)); // 加载图标
m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON_SOUND)); // 加载图标
m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON_TIME)); // 加载图标
m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON_DISPLAY)); // 加载图标
m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON_ACCESS)); // 加载图标
m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON_MOUSE)); // 加载图标
m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON_KEY)); // 加载图标
m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON_FILED)); // 加载图标
m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON_APP)); // 加载图标
m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON_ADD)); // 加载图标
m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON_SYS)); // 加载图标
m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON_MANAGER)); // 加载图标
IsPressed = FALSE;
}
CIconBtn::~CIconBtn()
{
}
BEGIN_MESSAGE_MAP(CIconBtn, CButton)
//{{AFX_MSG_MAP(CIconBtn)
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/
// CIconBtn message handlers
void CIconBtn::SetImageIndex(UINT Index)
{
m_ImageIndex = Index;
}
void CIconBtn::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
CDC dc;
dc.Attach(lpDrawItemStruct->hDC);
UINT state = lpDrawItemStruct->itemState; // 获取状态
// 获取图像列中图像大小
IMAGEINFO imageinfo;
m_ImageList.GetImageInfo(m_ImageIndex,&imageinfo);
CSize imagesize;
imagesize.cx = imageinfo.rcImage.right - imageinfo.rcImage.left;
imagesize.cy = imageinfo.rcImage.bottom - imageinfo.rcImage.top;
// 在按钮垂直方向居中显示位图
CRect rect;
GetClientRect(rect);
CPoint point;
point.x = 5;
point.y = (rect.Height() - imagesize.cy)/2;
CRect focusRect(rect);
focusRect.DeflateRect(2,2,2,2);
// 按钮被选中或者获得焦点时
if((state&ODS_SELECTED)||(state&ODS_FOCUS))
{
CPen pen(PS_DASHDOTDOT,1,RGB(0,0,0));
CBrush brush;
dc.FillSolidRect(rect, RGB(0,0,0));
brush.CreateStockObject(NULL_BRUSH);
dc.SelectObject(&brush);
dc.SelectObject(&pen);
// 绘制焦点矩形
dc.DrawFocusRect(focusRect);
// 绘制立体效果
dc.DrawEdge(rect,BDR_RAISEDINNER|BDR_RAISEDOUTER,BF_BOTTOMLEFT|BF_TOPRIGHT);
// 获得焦点时绘制黑色边框
dc.Draw3dRect(rect,RGB(0,0,0),RGB(0,0,0));
}
else // 默认情况下
{
CPen pen(PS_DOT,1,RGB(192,192,192));
CBrush brush;
brush.CreateStockObject(NULL_BRUSH);
dc.FillSolidRect(rect, RGB(0, 0, 0));
dc.SelectObject(&brush);
dc.SelectObject(&pen);
dc.Rectangle(focusRect);
dc.DrawEdge(rect,BDR_RAISEDINNER|BDR_RAISEDOUTER,BF_BOTTOMLEFT|BF_TOPRIGHT);
}
if(IsPressed) // 在按钮被按下时绘制按下效果
{
dc.DrawFocusRect(focusRect);
dc.DrawEdge(rect,BDR_SUNKENINNER |BDR_SUNKENOUTER,BF_BOTTOMLEFT|BF_TOPRIGHT);
dc.Draw3dRect(rect,RGB(0,0,0),RGB(0,0,0));
}
m_ImageList.Draw(&dc, m_ImageIndex, point, ILD_NORMAL | ILD_TRANSPARENT); //绘制图标要放到绘制按钮背景的后面,不然会覆盖图标
// 绘制按钮文本
CString text;
GetWindowText(text);
rect.DeflateRect(point.x+imagesize.cx,0,0,0);
dc.SetBkMode(TRANSPARENT);
dc.SetBkColor(RGB(0, 0, 0));
dc.SetTextColor(RGB(255,255,255));
dc.DrawText(text,rect,DT_CENTER|DT_SINGLELINE|DT_VCENTER);
}
void CIconBtn::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
IsPressed = TRUE;
CButton::OnLButtonDown(nFlags, point);
}
void CIconBtn::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
IsPressed = FALSE;
CButton::OnLButtonUp(nFlags, point);
}
五、调用
5.1 子界面调用
右键类向导,生成此函数,在对应的代码里加入以下代码,从而使子界面变为黑色
生成界面初始化函数,加入以下代码
5.2 主界面调用
双击控制面板操作,
- 让选中框选中
- 生成子界面,并显示到主界面上
六、运行