用MFC编写界面的几个技巧

合集下载

VC++MFC界面技巧--按钮

VC++MFC界面技巧--按钮

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编程经验
然后等用户一切换回监控,就一下子从头到尾刷新?!
如果什么都不用,直接用后一个状态覆盖前一个,那么就无法显示一系列的过程。
正在考虑用一个固定长度的链表。
4、
还有其他没考虑到的地方,大家提出来讨论吧。
vc做程序最重要的就是小心,小心再小心,每做一步自己都要多运行几遍,分别在debug,release模式下运行运行,
delete TempPort;
类似的场合不少。如在用对话框嵌入标签的时候再一次创建了对话框。
出现了实际上存在两个对话框,无法访问原来对话框上的控件。
现在我一看到CRuntimeClass*就会特别小心。
我在解决这些问题的时候用的方法是调试和增减法。并不是从书上得来。
如果有差错,请各位指出来。呵呵。
看看有没有内存泄漏,越界等错误,等到最后才发现那就惨了
1。程序运行稳定,尽量用老办法,不了解的函数不要随便用。
2。功能要简单实用。
3。不要追求功能的完美。完美的功能是不可能的。
4。程序一有bug,必须纠正后才能前进
//--------------------------------------------------------------------------
我上次犯的错误就是让其他工作者线程发一个消息来让主线程解除阻塞。结果死锁。
解决方法是将其他线程改为界面线程。
还有一个问题,创建新线程的时候要小心,它有一个CRuntimeClass*的参数。
它要CreateObject()创建一个新的线程,然后把线程指针返回。
CSerialPortEx* g_pPort = new CSerialPortEx;
他们建议用原始的Grid控件,独立于具体的数据库。

MFC编程基础教程

MFC编程基础教程

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.对话框控件的操作:对话框中的控件可以像其他控件一样进行操作。

MFC高级知识

MFC高级知识

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基础,图标,光标,标题,工具栏,状态栏等(最细致的讲解

MFC基础,图标,光标,标题,工具栏,状态栏等(最细致的讲解

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。

黑马程序员C语言教程:MFC界面分屏操作

黑马程序员C语言教程:MFC界面分屏操作

MFC 界面分屏操作
近期陆续有学员问到在MFC编程中怎样做到界面分屏,看到很多学员在这里很有疑惑,我在这里将MFC分屏操作流程向大家分享一下,希望能帮助到大家~
在开发MFC应用程序的时候,我们经常看到其他C/S 软件的界面格局是这样的
那么,他们怎么做到的呢?我们可以使用界面窗体融合
首先,我们先创建一个单文档视图的MFC项目,点击完成
在MFC 框架中,为我们提供了一个csplitterwnd 类——拆分窗口类,提供分离窗口的功能。

那么,在框架类CMainFrame中,我们要添加一个csplitterwnd 类型的成员变量,以供我们使用。

下面,我们要重写框架类CMainFrame 中的OnCreateClient 事件
在事件中,我们要进行界面切分操作,并添加如下代码,那么,问题来了,我们该怎样切分窗口?切分后的窗口该由哪个类来控制它
值得注意的是:我们在创建完视图之后,要将它原先return 的界面视图注销掉,返回我们切分后的视图界面,我们也看到在RUNTIME_CLASS 宏函数中我们的值是空的,这里就是要我们添加我们自己的MFC类
我们就需要我们自定义的窗口视图了,我们可以先创建两个类,值得注意的是:我们创建的MFC 类它的基类必须是视图类
我们创建好之后,返回到我们的框架类CMainFrame中,并找到我们刚刚重写的OnCreateClient函数,将我们新建的视图类添加至RUNTIME_CLASS 宏函数的参数内
发现还是报错,为什么呢?加上头文件即可。

那么,分屏的效果就出来了。

MFC编程小技巧

MFC编程小技巧
11、 多线程 1) 在头文件中添加声明:
static UINT Thread1在源文件中定义 UINT CDemoDlg::Thread1(void *param) {
CDemoDlg *dlg = (CDemoDlg*)param; CEdit *randBox = (CEdit*)dlg->GetDlgItem(IDC_Random); CString str; while (dlg->flag) {
MFC 编程小技巧
1、 如何处理对话框按下 enter 或 esc 后自动退出的问题? 在类向导中添加 PreTranslateMessage 函数,重写函数如下:
BOOL CCopleymotorcontrolDlg::PreTranslateMessage(MSG* pMsg) {
// TODO: 在此添加专用代码和/或调用基类 switch (pMsg->wParam) { case VK_RETURN: case VK_ESCAPE:
8、 固定对话框大小,将属性 Border 改为 Dialog Frame
9、 软件自启动 void CDemoDlg::OnBnClickedAutostart() {
// TODO: 在此添加控件通知处理程序代码 HKEY hKey; CString strRegPath = _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"); //找到系统的启动项 if (m_autoStart.GetCheck()) {
RegDeleteValue(hKey, _T("Demo")); RegCloseKey(hKey); } } }

MFC界面设计

MFC界面设计

画直线: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消息,改变线长不断画线。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档