MFC(Microsoft Foundation Class)是Microsoft公司提供的一套GUI编程开发库,MFC的使用可以大大简化GUI编程的难度和复杂程度。但是MFC自带的控件样式较为单一,美观程度与时俱进的要求运用不足。于是,一些MFC程序员自发创建了很多MFC UI库,使得MFC程序的美观程度得到了极大提升。
本文将介绍几个常用的MFC UI库,并详细阐述它们的使用方法和案例,以供MFC程序员参考。
一、BCGControlBar Library:
BCGControlBar Library是一款由BCGSoft公司开发的MFC UI库,可以简单方便地为MFC程序提供美观、高效的可视化管理工具。
使用:
1.首先需要下载安装BCGControlBar Library。
2.创建MFC对话框或窗口程序(基本类型为Dialog或SDI或MDI)
3.将BCGControlBar头文件和LIB文件添加到项目中,并在stdafx.h中添加相应的头文件,最后在应用中添加初始化代码。
4.在资源编辑器中加入需要使用的BCGControlBar控件。
案例:
以下是基于BCGControlBar Library的一个简单计算器程序的代码(默认基于SDI结构):
首先需要添加 INIT_INSTANCE中代码,用来初始化BCGControlBar:
BOOL CTestApp::InitInstance()
{
// ...
InitContextMenuManager();
InitKeyboardManager();
InitTooltipManager();
// 初始化BCGControlBar
CBCGPWinApp::InitInstance ();
CBCGPToolBar::AddToolBarForImageCollection (IDR_MAINFRAME);
// ...
return TRUE;
}
在资源编辑器中加入需要使用的控件(例如Button),参考下面的代码定义持有对话框的对话框类(这里重载了WM_PAINT消息,使程序的主框框具有圆角):
class CalculatorDlg : public CBCGPDialog
{
public:
CalculatorDlg(CWnd* pParent = NULL)
: CBCGPDialog(IDD_CALCULATOR, pParent)
{
}
protected:
virtual LRESULT OnPaint(WPARAM wp, LPARAM lp)
{
CPaintDC dc(this);
CRect rect;
GetClientRect (&rect);
CRgn rgn1;
CRgn rgn2;
CRgn rgn3;
rgn1.CreateRectRgn (rect.left, rect.top + 6, rect.right, rect .bottom);
rgn2.CreateRectRgn (rect.left + 6, rect.top, rect.right - 6, rect.bottom - 6);
rgn3.CreateRoundRectRgn (rect.left, rect.top, rect.right, rect .bottom - 6, 12, 12);
CRgn rgn;
rgn.CreateRectRgn(0, 0, 0, 0);
rgn.CombineRgn (&rgn1, &rgn2, RGN_OR);
rgn.OffsetRgn (0, -1);
rgn.CombineRgn (&rgn, &rgn3, RGN_OR);
CBrush br (RGB (38, 38, 38));
dc.FillRgn(&rgn, &br);
return 0L;
}
// ...
};
最后,在对话框初始化部分中,使用以下代码来初始化Button:
BOOL CalculatorDlg::OnInitDialog()
{
CBCGPDialog::OnInitDialog();
SetIcon(m_hIcon, TRUE);
SetIcon(m_hIcon, FALSE);
CBCGPButton& btn = ((CBCGPButton*) GetDlgItem(IDC_CALCBUTTON));
btn.SetImage(IDB_BUTTON);
btn.SetMouseCursorHand();
btn.SetTooltip(_T(“Calculator”));
btn.SizeToContent();
return TRUE;
}
注:IDB_BUTTON是一个包含按钮图像的图片,可以使用任何绘图工具创建。
二、Control Toolkit Library:
Control Toolkit Library是一套基于MFC的现代、易于使用的UI库,具有各种控件、图形和其他鼓励创新的特性。
使用:
1.下载并安装 Control Toolkit Library。
2.创建一个新的MFC应用程序(基本类型为SDI,请使用默认设置)。
3.将Control Toolkit库文件复制到MFC应用程序的目录下,并在资源编辑器中添加需要使用的控件。
4.在应用程序中添加以下代码来初始化Control Toolkit:
BOOL CGUIApp::InitInstance()
{
InitCommonControls();
// ...
InitGui();
InitGuiResource();
InitLookAndFeel();
InitLookSkin();
InitColor();
InitDraw();
InitCxImage();
return TRUE;
}
5.在需要使用的控件中添加初始化代码,如下所示:
BOOL CSplashScreenDlg::OnInitDialog()
{
PremultipliedAlphaHelper().EnablePerPixelAlpha (GetSafeHwnd());
SetBitmap (IDB_SPLASH);
CPopupDlg::OnInitDialog ();
return TRUE;
}
案例:
以下是基于Control Toolkit Library的一个简单的画图程序的代码(默认基于SDI结构)。此程序允许用户从一个列表中选择一种颜色,并在画布上绘制自由线条:
void CMyPaintView::OnLButtonDown(UINT nFlags, CPoint point)
{
if(GetCapture() == NULL)
SetCapture();
if(m_bMouseDown)
return;
m_bMouseDown = true;
m_lastPoint = point;
m_currentPoint = point;
UpdateLine(m_lastPoint, m_currentPoint);
CView::OnLButtonDown(nFlags, point);
}
void CMyPaintView::OnLButtonUp(UINT nFlags, CPoint point)
{
if(GetCapture() == this)
ReleaseCapture();
if(!m_bMouseDown)
return;
m_bMouseDown = false;
m_currentPoint = point;
UpdateLine(m_lastPoint, m_currentPoint);
CView::OnLButtonUp(nFlags, point);
}
void CMyPaintView::OnMouseMove(UINT nFlags, CPoint point)
{
if(!m_bMouseDown ||m_crsSelect.rgbReserved != 0)
return;
m_currentPoint = point;
UpdateLine(m_lastPoint, m_currentPoint);
CView::OnMouseMove(nFlags, point);
}
// 更新线条
void CMyPaintView::UpdateLine(CPoint ptFrom, CPoint ptTo)
{
m_memDC.BitBlt (0, 0, m_sizeCXImage.cx, m_sizeCXImage.cy, m_dcPaint, 0, 0, SRCCOPY);
// 选择一个颜色,绘制线条
switch(m_iIndexColor)
{
case 1:
m_memDC.CreatePen(PS_SOLID, 10, RGB(255,0,0));
break;
case 2:
m_memDC.CreatePen(PS_SOLID, 10, RGB (0,255,0));
break;
case 3:
m_memDC.CreatePen(PS_SOLID, 10, RGB (0,0,255));
break;
case 4:
m_memDC.CreatePen(PS_SOLID, 10, RGB (0,255,255));
break;
defulat:
m_memDC.CreatePen(PS_SOLID, 10, RGB (255,255,255));
}
// 绘制线条
m_memDC.MoveTo(ptFrom);
m_memDC.LineTo(ptTo);
Invalidate(FALSE);
}
三、Codejock Toolkit Pro:
Codejock Toolkit Pro是一套高度可定制的MFC UI库,其中包含了许多强大的GUI控件。该库的界面视觉效果美观,使用方便,功能强大。
使用:
1.下载并安装Codejock Toolkit Pro。
2.创建一个新的MFC应用程序(基本类型为SDI,如果要将窗口嵌入MFC对话框中,则为Control Container),然后将Codejock库文件添加到项目中。
3.在应用程序中添加以下代码来初始化Codejock界面控件:
BOOL CMyApp::InitInstance()
{
// ...
CXTPImageManager::InitLibrary();
CXTPWinDwmWrapper().SetProcessDPIAware();
return TRUE;
}
4.在资源编辑器中添加任何需要的Codejock库控件,并使用相应的代码为它们提供动作和行为。
案例:
以下是基于Control Toolkit Library的一个简单的GUI界面(基于SDI或对话框结构):
首先,在对话框类中添加以下初始化相关成员变量:
private:
CXTPButton m_btnOK;
CXTPButton m_btnCancel;
void CMyDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDOK, m_btnOK);
DDX_Control(pDX, IDCANCEL, m_btnCancel);
}
BOOL CMyDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// ...
CXTPPaintManager* pManager = new CXTPPaintManager();
pManager->SetTheme(xtpThemeOffice2016, xtpPaintManagerStyleOffice2016Colorful, xtpPaintManagerDefault);
m_btnOK.SetTheme(xtpButtonThemeOffice2016);
m_btnOK.SetPushButtonStyle(xtpButtonNormal);
m_btnOK.SetWindowText(_T("OK"));
m_btnOK.ShowShadow(TRUE);
m_btnOK.EnableWindow(TRUE);
m_btnOK.SetAlignment(TA_CENTER);
m_btnOK.SetHeight(31);
m_btnOK.SetWidth(100);
m_btnOK.SetPaintManager(pManager);
m_btnCancel.SetTheme(xtpButtonThemeOffice2016);
m_btnCancel.SetPushButtonStyle(xtpButtonNormal);
m_btnCancel.SetWindowText(_T("Cancel"));
m_btnCancel.ShowShadow(TRUE);
m_btnCancel.EnableWindow(TRUE);
m_btnCancel.SetAlignment(TA_CENTER);
m_btnCancel.SetHeight(31);
m_btnCancel.SetWidth(100);
m_btnCancel.SetPaintManager(pManager);
// ...
return TRUE;
}
接下来,可以在对话框类中添加处理按钮事件的代码:
void CMyDlg::OnOK()
{
// 你的代码 …
CDialog::OnOK();
}
四、其他MFC UI库:
除了上述介绍的库外,还有许多其他的MFC UI库可供使用。以下为一些常用的MFC UI库:
1. SkinCrafter Library: 一组可定制的MFC皮肤控件,可用于创建现代GUI界面。
2. Ultimate Toolbox:一套高度可定制并具有良好文档的GUI控件库。
3. Xtreme Toolkit Pro:一组具有动画效果的Windows控件。
4. Microsoft Foundation Class Library:MFC内置的控件库,用于创建Windows应用程序的GUI。
总结:
本文为MFC UI库的介绍和使用方法做了一些简单的介绍。不同的UI库有不同的特点和使用方式,具体的选择应该基于实际情况和需求。MFC UI库的使用可以大大提高MFC程序的美观性和可读性。
壹涵网络我们是一家专注于网站建设、企业营销、网站关键词排名、AI内容生成、新媒体营销和短视频营销等业务的公司。我们拥有一支优秀的团队,专门致力于为客户提供优质的服务。
我们致力于为客户提供一站式的互联网营销服务,帮助客户在激烈的市场竞争中获得更大的优势和发展机会!
发表评论 取消回复