用MFC编写界面的几个技巧
- 格式:pdf
- 大小:174.46 KB
- 文档页数:3
VC++MFC界面技巧--按钮VC++ MFC界面技巧--按钮来源:互联网★ 5--2--1 图标按钮图标按钮可谓是按钮控件使用图像最简单的方式,除此之外图标按钮的优点还在于显示在按钮上的图标能够使用透明色,因而不必再去为处理非矩形图像在按钮颜色发生变化时边缘颜色的处理而费心。
不过也正是使用图标导致了图标按钮的天生弱点。
图标太小了,仅仅才32×32 像素大小,在有的场合仅靠使用这么小的图像就有些显得力不从心了。
在讲图标按钮如何使用之前,先得告诉读者句柄的概念。
句柄是什么?很多教科书上都这样定义:句柄是一个用于代表对象的 32 位整型值。
不过这对于很多初学者而言,并不是太好理解。
其实也可以将未赋值的句柄理解为一个指向“空白”(void *)的指针,事实上也如此,在Winnt.h 中,句柄就是如此被声明的:typedef void *HANDLE; 当句柄被赋值之后,它就成为指向某个特定位置的指针,即代表了某个特定的对象。
之所以在现在提及句柄,是因为句柄是Windows 编程中的一个关键性概念。
尽管在前面除第三章外的内容中很少涉及它,不过在下面的学习中我们将会很频繁的使用到句柄。
技术概要:使用图标按钮很简单,大的步骤仅仅就三步:①.从外部导入一个图标或自己创建一个图标作为资源。
②.从资源中载入所要使用的图标。
③.在要使用图标的按钮上设置图标。
具体实现:■第一步导入图标没有什么特别之处,同前面 2.2 节中使用静态图像控件导入位图是非常类似的。
无非就是使用Insert 菜单上的Resource 命令,导入或创建一个图标即可。
■第二步载入图标就涉及到一些细节问题了。
使用函数LoadIcon()载入图标。
因为LoadIcon() 是类CWinApp 的成员函数,同时函数LoadIcon() 返回所载入图标的句柄。
所以我们采用以下方法来调用函数 LoadIcon():h_Icon = AfxGetApp() -> LoadIcon(IDI_Icon);当然,在该语句之前还必须要有对图标句柄 h_Icon 的定义:HICON h_Icon;■第三步为按钮设置图标了,这通过调用函数SetIcon() 来实现。
MFC编程基础教程MFC(Microsoft Foundation Classes)是一套基于C++的应用程序框架,用于开发可视化的Windows应用程序。
MFC提供了丰富的工具和类库,使程序开发人员能够更加轻松地创建Windows应用程序。
一、MFC框架的介绍MFC是一种C++编程框架,用于开发Windows应用程序。
MFC提供了一系列的类和方法,用于处理窗口、消息处理、资源管理等常见的任务。
MFC框架的核心是一个称为CWinApp的类,它是应用程序的入口点。
二、MFC的基本概念1.窗口:MFC使用窗口来显示应用程序的用户界面。
窗口可以是主窗口、对话框、工具栏、菜单等。
2.消息处理函数:MFC使用消息机制来处理用户输入和系统事件。
消息处理函数是在收到特定的消息时执行的代码块。
3.控件:控件是用于用户交互的窗口元素,例如按钮、文本框、列表框等。
4.对象模型:MFC使用面向对象的概念来管理窗口和控件。
每个窗口或控件都是一个C++对象,有自己的属性和方法。
三、MFC应用程序的创建1.创建一个MFC应用程序的步骤:a. 新建项目:在Visual Studio中创建一个MFC应用程序项目。
c.编写代码:编写消息处理函数和其他代码,实现应用程序的功能。
d.编译和运行:编译项目并运行应用程序。
四、MFC消息处理1.应用程序的消息循环:MFC应用程序的消息循环负责接收和处理用户输入和系统事件。
2.消息映射表:消息映射表是一个用于将消息与消息处理函数关联的数据结构。
3.常见的消息类型:MFC提供了大量的消息类型,包括鼠标和键盘消息、窗口消息、菜单消息等。
五、MFC控件的使用1.控件的创建和操作:使用MFC提供的类和方法来创建和操作控件。
2.控件的属性设置:通过设置控件的属性来改变它的外观和行为。
3.控件事件的处理:通过处理控件的事件来响应用户的操作。
六、MFC对话框的使用2.对话框控件的操作:对话框中的控件可以像其他控件一样进行操作。
1.4 利用MFC进行开发的通用方法介绍以下是我在最初学习VC时所常用的开发思路和方法,希望能对初学VC的朋友有所帮助和启发。
1、开发需要读写文件的应用程序并且有简单的输入和输出可以利用单文档视结构。
2、开发注重交互的简单应用程序可以使用对话框为基础的窗口,如果文件读写简单这可利用CFile进行。
3、开发注重交互并且文件读写复杂的的简单应用程序可以利用以CFormView为基础视的单文档视结构。
4、利用对话框得到用户输入的数据,在等级提高后可使用就地输入。
5、在对多文档要求不强烈时尽量避免多文档视结构,可以利用分隔条产生单文档多视结构。
6、在要求在多个文档间传递数据时使用多文档视结构。
7、学会利用子窗口,并在自定义的子窗口包含多个控件达到封装功能的目的。
8、尽量避免使用多文档多视结构。
9、不要使用多重继承并尽量减少一个类中封装过多的功能。
1.5 MFC中常用类,宏,函数介绍常用类CRect:用来表示矩形的类,拥有四个成员变量:top left bottom right。
分别表是左上角和右下角的坐标。
可以通过以下的方法构造:CRect( int l, int t, int r, int b ); 指明四个坐标CRect( const RECT& srcRect ); 由RECT结构构造CRect( LPCRECT lpSrcRect ); 由RECT结构构造CRect( POINT point, SIZE size ); 有左上角坐标和尺寸构造CRect( POINT topLeft, POINT bottomRight ); 有两点坐标构造下面介绍几个成员函数:int Width( ) const; 得到宽度int Height( ) const; 得到高度CSize Size( ) const; 得到尺寸CPoint& TopLeft( ); 得到左上角坐标CPoint& BottomRight( ); 得到右下角坐标CPoint CenterPoint( ) const; 得当中心坐标此外矩形可以和点(CPoint)相加进行位移,和另一个矩形相加得到“并”操作后的矩形。
MFC基础,图标,光标,标题,工具栏,状态栏等(最细致的讲解改变窗口大小和标题修改:在Cmainframe中的precreatewindow中cs.cx=600;cs.cy=600;cs.style=cs.style&~FWS_ADDTOTITLE;cs.lpszName="jiaotong";光标,背景在CMyview中的precreatewindow中cs.lpszClass=AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW,LoadCursor(NULL,IDC_HELP),(HBRUSH)GetStockObject(BLACK_BRUSH),0);动态图标修改:首先在resources中的Icon中插入两个图标然后按照以下步骤1.在mainframe类里的m_wndStatusBar中添加HICON的一个数组,大小为2public:HICON m_hIcons[2];2.在CMainFrame::OnCreate里加载图标m_hIcons[1]=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON1));m_hIcons[2]=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON2)); SetClassLong(m_hWnd,GCL_HICON,(LONG)m_hIcons[1]);//将开始的图标设置为第一个图标SetTimer(1,1000,NULL);3.自定义一个定时器(点击右键选择add windows Message。
在里面选择VM_TIMER)void CMainFrame::OnTimer(UINT nIDEvent){static int i=1;SetClassLong(m_hWnd,GCL_HICON,(LONG)m_hIcons[i+1]);i=++i%2;CFrameWnd::OnTimer(nIDEvent);}工具栏添加属性:1。
MFC 界面分屏操作
近期陆续有学员问到在MFC编程中怎样做到界面分屏,看到很多学员在这里很有疑惑,我在这里将MFC分屏操作流程向大家分享一下,希望能帮助到大家~
在开发MFC应用程序的时候,我们经常看到其他C/S 软件的界面格局是这样的
那么,他们怎么做到的呢?我们可以使用界面窗体融合
首先,我们先创建一个单文档视图的MFC项目,点击完成
在MFC 框架中,为我们提供了一个csplitterwnd 类——拆分窗口类,提供分离窗口的功能。
那么,在框架类CMainFrame中,我们要添加一个csplitterwnd 类型的成员变量,以供我们使用。
下面,我们要重写框架类CMainFrame 中的OnCreateClient 事件
在事件中,我们要进行界面切分操作,并添加如下代码,那么,问题来了,我们该怎样切分窗口?切分后的窗口该由哪个类来控制它
值得注意的是:我们在创建完视图之后,要将它原先return 的界面视图注销掉,返回我们切分后的视图界面,我们也看到在RUNTIME_CLASS 宏函数中我们的值是空的,这里就是要我们添加我们自己的MFC类
我们就需要我们自定义的窗口视图了,我们可以先创建两个类,值得注意的是:我们创建的MFC 类它的基类必须是视图类
我们创建好之后,返回到我们的框架类CMainFrame中,并找到我们刚刚重写的OnCreateClient函数,将我们新建的视图类添加至RUNTIME_CLASS 宏函数的参数内
发现还是报错,为什么呢?加上头文件即可。
那么,分屏的效果就出来了。
画直线:ye在cview 中加入private:CPoint m_point; //自己加的在onlbutoondown 加入m_point=point; //自己加的在onlbuttonup 加入HDC hdc; //自己加的hdc=::GetDC(m_hWnd);MoveToEx(hdc,m_point.x,m_point.y,NULL);LineTo(hdc,point.x,point.y);::ReleaseDC(m_hWnd,hdc); //自己加的完成功能圆,直线,矩形的画法ye1首先在菜单添加各种ID然后定义一个变量m_way赋予不同的值然后增加鼠标按下和弹起的函数处理根据m_way的值按下:m_point=point;保存点的相关信息弹起:CClientDC dc(this);CPen pen(m_linestyle1,m_linewidth,RGB(255,0,0));dc.SelectObject(&pen);CBrush *pbrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));dc.SelectObject(pbrush);switch(m_way){case 1:dc.SetPixel(point,RGB(255,0,0));break;case 2:dc.MoveTo(m_point);dc.LineTo(point);break;case 3:dc.Rectangle(CRect(m_point,point));break;case 4:dc.Ellipse(CRect(m_point,point));break;}再定义一个类:实现设置不同的线宽和线形,在弹出框进行编写加载位图:ye2首先构造一幅位图(不是位图的可以转化为位图在加载),然后增加一个消息处理BOOL CY e2View::OnEraseBkgnd(CDC* pDC)CBitmap bitmap;bitmap.LoadBitmap(IDB_BITMAP2);CDC dcCompatible;dcCompatible.CreateCompatibleDC(pDC);dcCompatible.SelectObject(&bitmap);CRect rect;GetClientRect(&rect);pDC->BitBlt(0,0,rect.Width(),rect.Height(),&dcCompatible,0,0,SRCCOPY);return TRUE;//return CV iew::OnEraseBkgnd(pDC);第二种情况BOOL CY e2View::OnEraseBkgnd(CDC* pDC){// TODO: Add your message handler code here and/or call defaultCBitmap bitmap;bitmap.LoadBitmap(IDB_BITMAP2);BITMAP bmp;bitmap.GetBitmap(&bmp);CDC dcCompatible;dcCompatible.CreateCompatibleDC(pDC);dcCompatible.SelectObject(&bitmap);CRect rect;GetClientRect(&rect);//pDC->BitBlt(0,0,rect.Width(),rect.Height(),&dcCompatible,0,0,SRCCOPY);pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dcCompatible,0,0,bmp.bmWidth,bmp. bmHeight,SRCCOPY);return TRUE;//return CV iew::OnEraseBkgnd(pDC);}图片根据大小而放大缩小渐变:ye3先定义一个变量int width;然后在oncreat函数里输入如下函数调用SetTimer(1,100,NULL);最后开辟一个time消息做如下处理:void CYe3View::OnTimer(UINT nIDEvent){// TODO: Add your message handler code here and/or call defaultwidth+=5;CClientDC dc(this);TEXTMETRIC tm;dc.GetTextMetrics(&tm);CRect rect;rect.left=0;rect.top=200;rect.right=width;rect.bottom=rect.top+tm.tmHeight;dc.SetTextColor(RGB(255,0,0));CString str;str.LoadString(ID_XIANSHI);dc.DrawText(str,rect,DT_LEFT);rect.top=150;rect.bottom=rect.top+tm.tmHeight;dc.DrawText(str,rect,DT_LEFT);CSize sz=dc.GetTextExtent(str);if(width>sz.cx){width=0;dc.SetTextColor(RGB(0,255,0));dc.TextOut(0,200,str);//dc.DrawText(str,rect,DT_LEFT);}CView::OnTimer(nIDEvent);}动态的画线先实现画线的代码然后在菜单中添加一个按钮实现触发SetTime()函数定时的发送TIME消息增加消息处理是捕获time消息,改变线长不断画线。
一、命名规则比较著名的命名规则当推Microsoft公司的“匈牙利”法,该命名规则的主要思想是“在变量和函数名中加入前缀以增进人们对程序的理解”。
例如所有的字符变量均以ch为前缀,若是指针变量则追加前缀p。
如果一个变量由ppch开头,则表明它是指向字符指针的指针。
“匈牙利”法最大的缺点是烦琐,例如int i, j, k;float x, y, z;倘若采用“匈牙利”命名规则,则应当写成int iI, iJ, ik; // 前缀i表示int类型float fX, fY, fZ; // 前缀f表示float类型如此烦琐的程序会让绝大多数程序员无法忍受。
据考察,没有一种命名规则可以让所有的程序员赞同,程序设计教科书一般都不指定命名规则。
命名规则对软件产品而言并不是“成败悠关”的事,我们不要化太多精力试图发明世界上最好的命名规则,而应当制定一种令大多数项目成员满意的命名规则,并在项目中贯彻实施。
3.1 共性规则本节论述的共性规则是被大多数程序员采纳的,我们应当在遵循这些共性规则的前提下,再扩充特定的规则,如3.2节。
l 【规则3-1-1】标识符应当直观且可以拼读,可望文知意,不必进行“解码”。
标识符最好采用英文单词或其组合,便于记忆和阅读。
切忌使用汉语拼音来命名。
程序中的英文单词一般不会太复杂,用词应当准确。
例如不要把CurrentValue写成NowValue。
l 【规则3-1-2】标识符的长度应当符合“min-length && max-information”原则。
几十年前老ANSI C规定名字不准超过6个字符,现今的C++/C不再有此限制。
一般来说,长名字能更好地表达含义,所以函数名、变量名、类名长达十几个字符不足为怪。
那么名字是否越长约好?不见得! 例如变量名maxval就比maxValueUntilOverflow好用。
单字符的名字也是有用的,常见的如i,j,k,m,n,x,y,z等,它们通常可用作函数内的局部变量。
MFC界面设计前两天boss让写写界面,看程序看的头晕脑转,就在网上瞎搜搜,写些关于MFC的界面设计。
包括:窗体背景图、窗体大小、按钮背景图、控件透明、编辑框重影、exe图标、托盘程序。
下面逐一代码解析:窗体背景图:背景图,要在OnPaint() 函数中进行修改。
窗体不再使用默认,在else中添加代码[cpp] view plaincopyprint?//改变窗体大小MoveWindow(0,0,500,400,TRUE);//设置背景CPaintDC dc(this);CBitmap bitmap;bitmap.LoadBitmap(IDB_BITMAP2);//在资源里添加的位图名CBrush brush;brush.CreatePatternBrush(&bitmap);CBrush* pOldBrush = dc.SelectObject(&brush); dc.Rectangle(0,0,600,400); //宽、长;dc.SelectObject(pOldBrush);//CDialog::OnPaint();按钮背景图:[cpp] view plaincopyprint?CBitmapButton m_BitmapButton;//声明按钮位图对象实现代码:[cpp] view plaincopyprint?//按钮添加图片m_BitmapButton.LoadBitmaps(IDB_BITMAP1);//位图名称m_BitmapButton.SubclassDlgItem(IDC_BConn,this);//按钮ID,句柄m_BitmapButton.SizeToContent();//把按钮设置成位图大小控件透明:重载OnCtlColor函数。
有的控件需要修改OwnerDraw属性为True。
[cpp] view plaincopyprint?afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);//透明添加消息函数:[cpp] view plaincopyprint?BEGIN_MESSAGE_MAP(CClientDlg, CDialog)//......ON_WM_CTLCOLOR()//透明//}}AFX_MSG_MAP//......END_MESSAGE_MAP() 实现:[cpp] view plaincopyprint?//重载——透明HBRUSH CClientDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor){HBRUSH hBrush = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);// <SPAN style="WHITE-SPACE: pre"></SPAN>CTLCOLOR_BTN Button control//按钮// CTLCOLOR_DLG Dialog box//对话框// CTLCOLOR_EDIT Edit control//编辑框// CTLCOLOR_LISTBOX List-box control//列表框// CTLCOLOR_MSGBOX Message box//消息框// CTLCOLOR_SCROLLBAR Scroll-bar control// CTLCOLOR_STATIC Static control//——这些控件都能设置透明if(nCtlColor == CTLCOLOR_EDIT){pDC->SetBkMode(TRANSPARENT); //设置透明pDC->SetTextColor(RGB(255, 0, 255)); // 设置文本颜色return(HBRUSH)::GetStockObject(NULL_BRUSH);}return hBrush;编辑框重影:添加消息框的事件处理函数OnEnChange,[cpp] view plaincopyprint?//方法1CRect rtlbl;GetDlgItem(IDC_EPort)->GetWindowRect(&rtlbl); ScreenToClient(&rtlbl); //转到客户端界面InvalidateRect(&rtlbl);//刷新对话框背景////方法二GetDlgItem(IDC_EPort)->GetParent()->RedrawWindow();//会闪动exe图标:如果资源里的图标有多个,exe会自动选择较小的作为自己的图标。