精华内容
下载资源
问答
  • MFC程序,在OnSize函数中怎么才能自动缩放MainFrame中的内容呢?写了半天没有思路,谢谢!
  • OnSize函数

    千次阅读 2011-07-05 13:24:52
    OnSize函数的cx cy都是"当前对话框"的宽度和高度,并非是屏幕的
    OnSize函数的cx cy都是"当前对话框"的宽度和高度,并非是屏幕的
    
    展开全文
  • 2、之后对这个OnSize函数写上如下代码,这个函数主要是对用户调整窗口大小时做出的响应,包括最大化,但不包括最小化。最小化的功能系统自己就能够实现,但是它会把自身的窗口坐标变成负数,导致下面基于窗口尺寸的...

    经过了之前大量mfc已经明白了许多功能,但是之前的项目一直没有使用到mfc的菜单功能,菜单是Win32功能很常见的东西,这个也必须要懂。其实菜单的建立也很简单,配合之前的文件操作功能,已经能够把开始->附件->记事本,就是那个notepad.exe写出来了。


    一、基本目标

    首先,这个记事本能够最大化,最小化,里面的编辑框也能够跟住最大化最小化,就是记事本里面组件不会失真,这个也不是理所当然的时候,要对OnSize进行写作,否则里面的组件是不会跟着最大化的,这大概就是mfc比vb艰难的原因吧!


    之后,这个记事本的窗体大小与平常Windows的窗口一样,能够自由调整大小,里面有相应的餐单。按帮助->关于,能够显示版权信息。其实这里已经把记事本模仿得很像了,要不是那个版权信息太丑的话~


    点击“新建”按钮会弹出提示框,告诉用户如果继续执行这个命令,所有没有保存的信息会丢失,如果用户点“是”,则新建一个文件


    之后是打开与保存、另存为功能,这里就不再介绍是什么样了,如下图,就是跟你平常用的记事本一模一样



    最后是设置字体功能,能够设置记事本显示的字体,这与Windows里面的记事本是一模一样,毕竟记事本从头到尾都是一个纯文本的编辑器,设计字体只是设置其显示字体而已!用户选择相应的字体之后,记事本里面的字体就会以用户选择的字体显示。



    二、准备过程

    1、首先还是新建一个简单的mfc工程,里面什么都没有,我们之后再添加,主要是windows自带的东西太渣了,我们自己写出来更加漂亮。如果你连mfc的创建都不会,也没有关系,可以看我之前的文章


    2、新建出来的工程与之前的《【mfc】用对话框的切换实现重新登录》(点击打开链接)一样,把确定按钮的OnOk函数注释掉,免得这个对话框一按回车就没有


    3、之后把对话框里面的组件拉成如下图的形式,同时把各个组件的样式设置好:


    4、之后,我们就开始为这个对话框建立菜单,如下图,为这个工程插入资源,如《【mfc】对于对话框程序的优化与为程序创建图标》(点击打开链接)中的图标一样,菜单也是资源的一种,只是菜单的编辑方式不同而已。


    5、菜单的编辑如下图所示,里面还有“分隔符”选项,如果一点分隔符,组件中的所有东西都会变灰,系统自动识别这是“分隔符”而不是一个有功能的子菜单


    6、长按一个子菜单拖拽可以改变子菜单的位置


    7、按照上面的方式,建立如下图的菜单,然后切换的主对话框CxxDlg,其中xx为你的工程名,在这个主对话框中的样式添加菜单


    8、之后,如下图为各个菜单中添加相应的类函数


    9、把这个菜单的子菜单的消息映射函数与对话框关联起来,则设置其函数名,最后才能添加函数


    10、对子菜单创建完消息映射函数则与组件的函数一样,能够在ClassView看到,当然,双击ClassView里面的函数也一样能够编辑,为所有子菜单,也就是那些"新建"、"打开"……添加完消息映射函数,我们则可以正式进行程序的写作。



    三、各个子菜单的功能制作

    虽然上面的准备功能很多,但是之后的函数就很简单,组件的布局完毕,之后写一些简短的函数就完成了,这就是微软旗下的编程的特点,它不像java中的Swing,单单是布局都要写一大堆代码。现在做微软编程的人看不起写Java的,说写一大段然后才能实现一个功能,写java看不起写微软的,说是拖控件的,谁也看不起谁。其实,无知者才是最可怕的,各有各特点,控件你不懂也不拖,代码你不懂你才觉得写一大段才能实现自己的功能,主要是自己废,不关人家编程语言的事情。你两方面都懂才是王道。好了,废话不多说了,回到这个功能里面来。


    (一)编辑框的大小随同窗口的大小变化而变化

    1、首先你要为这个主功能添加一个窗口消息处理函数,在里面找到WM_SIZE添加,这个与《【mfc】利用文件的读写,theApp全局变量来现实登录帐号管理系统》(点击打开链接)中添加OnInitDialog与OnDestory一样。不多说了,不明白可以翻翻我之前的日志。


    2、之后对这个OnSize函数写上如下代码,这个函数主要是对用户调整窗口大小时做出的响应,包括最大化,但不包括最小化。最小化的功能系统自己就能够实现,但是它会把自身的窗口坐标变成负数,导致下面基于窗口尺寸的控件大小,出现负值,程序就崩溃。所以正确的做法是,一旦窗口的坐标变成负数,就不要执行这段代码。

    void CNotepadDlg::OnSize(UINT nType, int cx, int cy) 
    {
    	CDialog::OnSize(nType, cx, cy);
    	//最小化以后,控件的窗口坐标值都会变成负数,再还原,此时,lastwindowrect为负,
    	//需要你把下面的代码进行判断,否则程序会出错
    	if(nType!=SIZE_MINIMIZED){
    		CWnd *pWnd; 
    		//获取ID为i的空间的句柄
    		pWnd = GetDlgItem(IDC_EDIT1);
    		CRect rect;   //获取控件变化前的大小
    		//判断是否为空,因为对话框创建时会调用此函数,而当时控件还未创建
    		if(pWnd){
    			pWnd->GetWindowRect(&rect);
    			ScreenToClient(&rect);//将控件大小转换为在对话框中的区域坐标
    			//cx/m_rect.Width()为对话框在横向的变化比例
    			//cy/m_rect.Height()为对话框在纵向的变化比例
    			rect.left=rect.left*cx/rect.Width();//调整控件大小
    			rect.right=rect.right*cx/rect.Width();
    			rect.top=rect.top*cy/rect.Height();
    			rect.bottom=rect.bottom*cy/rect.Height();
    			pWnd->MoveWindow(rect);//设置控件大小		
    		}
    		GetClientRect(&rect);//将变化后的对话框大小替换旧大小
    	}
    }

    (二)版权信息

    这个就不多说,这个与《【mfc】利用文件的读写,theApp全局变量来现实登录帐号管理系统》(点击打开链接)中也多个对话框中切换一模一样,先画好CopyrightDlg这个对话框,再为这个对话框新建类向导,然后因为CopyrightDlg除了显示与自带的关闭功能以外没有任何功能,CopyrightDlg完全不用写东西,只需要在主函数里面的“帮助”->“关于...”类函数,引入头文件,写入打开“关于……”对话框的代码即可

    #include "CopyrightDlg.h"
    
    void CNotepadDlg::OnCopyright() 
    {
    	// TODO: Add your command handler code here
    	CCopyrightDlg dlg;
    	dlg.DoModal();
    	
    }


    之后的代码都涉及到文件操作,所以首先在notepadDlg.cpp这个文件的开头,也就是包含一堆子菜单这个cpp的开头,引入CString filename;这个全局变量,就在#endif这行系统自带的代码的下方,让"新建"、“打开”、"保存"等命名共享这个文件变量,因为这里仅有一个对话框,所以也没必要大题小做地,如《【mfc】使用系统文件对话框打开文件与保存文件、利用StdAfx.h设置全局变量》( 点击打开链接),把变量写到StdAfx.h里面,又不用多个对话框共享这个变量。


    (三)文件->新建

    代码如下,很简单:

    void CNotepadDlg::OnFileNew() 
    {
    	// TODO: Add your command handler code here
    	if(IDNO==MessageBox("所有没有保存的信息,将会丢失,是否继续?","记事本",MB_YESNO))
    		return;
    	SetDlgItemText(IDC_EDIT1,"");
    	SetWindowText("记事本");
    	filename="";
    
    }

    首先弹窗提示用户是否继续,然后把文本框、标题栏、操作的文件路径清空即可。


    (四)文件->打开

    这个有点难,虽然基本原理与《【mfc】使用系统文件对话框打开文件与保存文件、利用StdAfx.h设置全局变量》(点击打开链接)一样,但是这里是对编辑框进行操作,而不是列表空间,因此,你首先要把文件的所有内容读入一个字符数组里面,再读到编辑框里面。注意打开文件之后,把标题栏、当前控制文件的路径更新一样。

    void CNotepadDlg::OnFileOpen() 
    {
    	if(IDNO==MessageBox("所有没有保存的信息,将会丢失,是否继续?","记事本",MB_YESNO))
    		return;
    	CFileDialog dlg(TRUE,"txt","",OFN_HIDEREADONLY,"文本文件(*.txt)|*.txt||");
    	if(IDCANCEL==dlg.DoModal()){
    		return;
    	}
    	filename=dlg.GetPathName();	
    	SetWindowText(filename);
    	CFile file;
    	if(!file.Open(filename,CFile::modeRead|CFile::shareDenyNone)){
    		AfxMessageBox("打开文件失败");
    		return;
    	}
    	//读取要打开文件的大小
    	//然后根据打开文件的大小创建一个相应大小的字符数组	
    	CFileStatus stat;
    	file.GetStatus(stat);
    	//+1是因为我们要对这个字符数组,后补\0
    	char *pText=new char[stat.m_size+1];
    	//file.Read的返回值是读到的文件大小
    	int nRet=file.Read(pText,stat.m_size);
    	pText[nRet]='\0';
    	//把读出来的东西放到文本框里面,然后删除这个字符串数组
    	SetDlgItemText(IDC_EDIT1,pText);
    	delete []pText;
    	file.Close();	
    }
    

    (五)文件->保存

    首先读取当前控制的文件路径,也就是定义在开头的那个filename,如果读不了,证明用户还没有打开文件,就选择“保存”按钮,直接拖去“另存为”的处理,使用一个CString作为编辑框的内容与文件的过渡,把这个CString的内容写入文件,就完事了。

    void CNotepadDlg::OnFileSave() 
    {
    	// TODO: Add your command handler code here
    	CFile file;
    	if(!file.Open(filename,CFile::modeCreate|CFile::modeWrite)){
    		CNotepadDlg::OnFileSaveas();
    		return;
    	}
    	CString string;
    	GetDlgItemText(IDC_EDIT1,string);
    	file.Write(string,string.GetLength());
    	file.Close();
    }

    (六)文件->另存为

    你自然要弹出一个“另存为”的CFileDialog给用户爽吧,然后这个通过CFileDialog,如《【mfc】使用系统文件对话框打开文件与保存文件、利用StdAfx.h设置全局变量》(点击打开链接)一样获取到文件路径,然如上面“保存”那样对文件进行写入操作。注意这里还要更新一下标题栏。

    void CNotepadDlg::OnFileSaveas() 
    {
    	// TODO: Add your command handler code here
    	CFileDialog dlg(FALSE,"txt","",OFN_OVERWRITEPROMPT,"文本文件(*.txt)|*.txt||");
    	if(IDCANCEL==dlg.DoModal()){
    		return;
    	}
    	CFile file;
    	filename=dlg.GetPathName();	
    	if(!file.Open(filename,CFile::modeCreate|CFile::modeWrite)){
    		AfxMessageBox("保存文件失败");
    		return;
    	}	
    	CString string;
    	GetDlgItemText(IDC_EDIT1,string);
    	file.Write(string,string.GetLength());
    	file.Close();
    	SetWindowText(filename);
    }

    (七)格式->字体

    主要是设置显示字体,为了使设置的字体的辉煌仅仅停留在OnFontSet这个函数那样段,这里,你还要在开头像写入CString filename;那样写入CFont font;之后,则如下面的代码所示

    void CNotepadDlg::OnFontSet() 
    {
    	// TODO: Add your command handler code here
    	
    	//lf是指向字体的指针
    	LOGFONT lf={0};
    	//如果现在已经存在字体了,那么获取当前字体的信息
    	if(font.GetSafeHandle()){
    		font.GetLogFont(&lf);
    	}
    	//字体设置需要到系统的字体编辑对话框,里面的参数是lf所指向的字体
    	//一打开字体编辑对话框自动选中这个字体
    	CFontDialog dlg(&lf);
    	if(IDCANCEL==dlg.DoModal()){
    		return;
    	}
    	//这样就能获取到,用户选中的字体保存到名为font的CFont对象中
    	//其中CFont font;已经在本文件的文件开头就定义成本cpp的全局变量了	
    	dlg.GetCurrentFont(&lf);
    	font.DeleteObject();
    	font.CreateFontIndirect(&lf);
    	//取出操作文字输入框的句柄m_edit,以后m_edit就是操作这个对话框的句柄
    	CEdit* m_edit=(CEdit*)GetDlgItem(IDC_EDIT1);
    	m_edit->SetFont(&font);
    }
    

    四、总结与展望

    至此,整个高仿记事本就制作完毕了。当然,还有“编辑”中的撤销功能,这个估计要设计一个链表记录用户的操作,剪切、复制、粘贴设计MFC中的对剪切板ClipBoard.exe的操作,估计应该有自带的函数,还没有研究。查找与替换与CFileDialog、CFontDialog一样,有自带的对话框,利用这个对话框获取到用户输入的内容,把当前编辑框的文本拿个CString存起来,再进行C语言那样的对CString进行遍历,查找与替换的操作……

    展开全文
  • VC在OnSize函数中可以根据当前窗口的大小,来改写窗口里面子控件的位置、大小。 但是注意,OnSize在窗口启动过程中,会多次被调用,所以,不能简单的在该函数中调用GetDlgItem()获取子控件的窗口指针。 最简单的...

    VC在OnSize函数中可以根据当前窗口的大小,来改写窗口里面子控件的位置、大小。

    但是注意,OnSize在窗口启动过程中,会多次被调用,所以,不能简单的在该函数中调用GetDlgItem()获取子控件的窗口指针。

    最简单的方式,设置一个全局变量,初始化时设置为FALSE,在OnInitialUpdate()或者OnInitDialog()后将其设置为TRUE,在OnSize函数里使用GetDlgItem()获取子控件窗口指针前先检测该变量:

    void CDlgRight::OnSize(UINT nType, int cx, int cy) 
    {
    	CFormView::OnSize(nType, cx, cy);
    	
    	if(m_bResizeFlag)
    	{
    		CRect rect;
    		GetWindowRect(rect);
    		
    		int h = rect.Height()/10;//竖起来子控件的个数的高度
    		int x = 0;
    		int y = 0;
    		
    		CRect rectCtrl;
    		int k = 0;
    
    		for(int i=ID_ID1; i<=ID_ID10; i++)//枚举所有的控件,但要保证其ID是连续的
    		{
    			CWnd *pWnd = GetDlgItem(i);
    			pWnd->GetWindowRect(rectCtrl);
    			x = (rect.Width()-rectCtrl.Width())/2;//将子控件设置为水平居中位置
    			y = h*k+(h-rectCtrl.Height())/2;	//将子控件设置为垂直等间距位置
    			ScreenToClient(rectCtrl);
    			pWnd->MoveWindow(x, y, rectCtrl.Width(), rectCtrl.Height());//子控件的大小不变
    			k++;
    		}
    	}
    }
    




    展开全文
  • RT 我的项目把窗口进行分割,左边是的对话框可以控制右面是视图。窗口是通过CreateStatic进行分割,现在想从左边个类中添加这个语句PostMessage(pMain->m_hWnd,...但是CView中的OnSize函数执行不会执行,不知道怎么做?
  • MFC Onsize()函数的作用

    千次阅读 2016-09-19 10:53:36
     在OnSize()中,调用重绘函数,  再在OnPaint()中,进行窗口大小的调整 或 重定位。而未说明理由。 我经过尝试,再在OnPaint()中取出cx,cy值时,发现没有0,0的情况, 因此假想认为:  OnSize()在...

     

    翻阅无数博客,有少数博友通过打出每次获得的  cx,cy  发现其中,竟有0,0值。

    而后,一位博友提出:

          在OnSize()中,调用重绘函数,

          再在OnPaint()中,进行窗口大小的调整 或 重定位。而未说明理由。

    我经过尝试,再在OnPaint()中取出cx,cy值时,发现没有0,0的情况,

    因此假想认为:

            OnSize()在窗口从创建到重绘,将被多次调用,

            而OnPaint()却仅在一切都准备好后才会调用,

     

     

     

     

     

    展开全文
  • OnSize()

    千次阅读 2019-02-25 11:21:48
    afx_msg void OnSize( UINT nType, int cx, int cy ); 参数nType 指定请求的调整大小的类型。 此参数可以是下列值之一: SIZE_MAXIMIZED 窗口最大化。 SIZE_MINIMIZED 窗口最小化。 SIZE_RESTORED 窗口已调整大小,...
  • MFC窗体消息之尺寸被改变 OnSize()

    千次阅读 2017-07-30 08:13:58
    afx_msg void OnSize(  UINT nType,   int cx,   int cy  ); 参数nType 指定请求的调整大小的类型。  此参数可以是下列值之一:   SIZE_MAXIMIZED 窗口最大化。   SIZE_MINIMIZED 窗口最小化。  SIZE_...
  • 为了产生OnSIze、OnSizing和OnGetMinMaxInfo三个函数,需要在【类向导】中给对应的窗口的WM_SIZE、WM_SIZING、WM_GETMINMAXINFO三个消息添加消息处理函数。 当窗口大小发生动态变化时, 响应的顺序依次是: WM_...
  • MFC OnSize事件调用时间

    千次阅读 2017-06-07 22:52:35
    在Ocx控件被加载时,第一次调用OnSize事件实在控件中的各个部件未加载前,此时如果操作控件中的控件会出现控制针异常,需要提前判断。 CTestDlg m_dlg; int CTestCtrl::OnCreate(LPCREATESTRUCT ...
  • 是不是调用OnSize,MFC系统就会调用MoveWindow函数,而不需要再另外调用了呢?
  • OnSize -&gt; OnInitDialog -&gt; OnPaint OnCreate:要创建一个窗口。 OnSize:用于窗口初始化前的一些参数设定。 OnInitDialog:初始化窗口,例如设置窗口字体、控件等。 OnPaint:在窗口上做一些...
  • 修改OnSize函数: void CTestFormView::OnSize(UINT nType, int cx, int cy) {  if(cx==0 || cy==0)  {  cx=800;  cy=600;  }  CFormView::OnSize(nType, cx, cy);  float dx_percent = ...
  • OnSize函数为变动后处理,此时窗口大小已变更,我们需要调整Dialog中的组件大小来适配窗口大小。例如:把edit窗口调宽一些  if ( 消息为调整消息 && 组件已构建)if (nType == SIZE_RESTORED && ::IsWindow(m_...
  • 最近用到窗口变化的一些东西,遇到几个相关的消息函数...分别对应相应的处理函数OnSize、OnSizing、OnGetMinMaxInfo。 当窗口大小发生变化时,响应的顺序依次是:WM_GETMINMAXINFO-->WM_SIZING-->WM_SIZE。  
  • BEGIN_MESSAGE_MAP(CLibraryDlg, CDialogEx)  ON_WM_SIZE() END_MESSAGE_MAP() ...void CLibraryDlg::OnSize(UINT nType, int cx, int cy) { if (!m_pTabCtrl) m_pTabCtrl = (CTabCtrl *)GetDlgItem(IDC_T
  • 函数onsize()与onsizing()区别

    千次阅读 2014-09-18 16:50:15
    OnSize是控件大小发生变化后发给你的消息,你可以得到控件将要变成多大(cx和cy指定),OnSizing是正在改变的大小,例如用户点击着鼠标拖放一个控件的大小,这个时候就收到OnSizing了
  • 1、OnCreate/OnSize/OnInitDialog哪个先执行?  下面是从MSDN上选的:  OnCreate:The framework calls this member function when an application requests that the windows windows be created by calling the...
  • void CChgWndDlg::OnSize(UINT nType, int cx, int cy) {  CDialog::OnSize(nType, cx, cy);  GetDlgItem(IDC_EDIT1)->MoveWindow(10,10,cx-20,cy-10); // 后面的那两个坐标要多减去10 }   注:要将窗
  • 如何使用matlab实现分段函数

    万次阅读 多人点赞 2018-10-09 20:39:13
    实现如下的分段函数: m={t0≤t&amp;amp;amp;lt;1−t+21&amp;amp;amp;lt;t≤20.1其他 m=\left\{ \begin{array}{rcl} t &amp;amp;amp;amp; &amp;amp;amp;amp; {0 \leq t &amp;amp;amp;lt;1}...
  • matlab中plot函数用法

    万次阅读 多人点赞 2019-03-06 14:41:15
    线条、颜色等参数: 1.简单的2维直线图 : plot(x,y) ...hold on; plot(x,y) 2.plot(X):X是矩阵,表示矩阵的每一行都画一条线,将显示n条线。 X=rand(3,3); %随机生成3*3矩阵 figure; hold on; p...
  • 最近的项目是一个对话框的项目,之前没有做过这种项目,对OnSize和OnWindowPosChanged是没有深入地去学习过。自己对这一个知识还是一知半解。下面是一些实验的结果: 实验是一个对话框的工程,下面是一些执行的...
  • 分别对应相应的处理函数OnSize、OnSizing、OnGetMinMaxInfo。 当窗口大小发生变化时,响应的顺序依次是:WM_GETMINMAXINFO–>WM_SIZING–>WM_SIZE。 OnGetMinMaxInfo 这个函数在窗口初始化的时候会被调用一次,当...
  • WM_SIZE与窗口大小的调整

    万次阅读 2013-12-12 15:42:01
    窗口还原时,先执行了子窗口的OnSize函数,但是OnSize函数的参数与想象中不一致: nType参数正确( SIZE_RESTORED ), 宽和高的参数值不正常(最大化时子窗口应该达到的宽和高) ,子窗口大小变为最大化状态应该达到的...
  • 一、创建控件并响应事件三步曲:...2.手动添加实现函数; 3.关联:MESSAGE_MAP:ON_BN_CLICKED(IDC_MYBUTTON,OnmyButton)。 二、VC设置窗口全屏显示的方法:通过设置窗口显示状态和窗口位置来使窗口全屏。 在窗
  • 最近用到窗口变化的一些东西,遇到几个相关的...分别对应相应的处理函数OnSize、OnSizing、OnGetMinMaxInfo。 当窗口大小发生变化时,响应的顺序依次是:WM_GETMINMAXINFO-->WM_SIZING-->WM_SIZE。   OnGetMi
  • 11种图像清晰度评价函数附MATLAB代码

    万次阅读 多人点赞 2019-06-17 13:33:22
    本科毕业论文是“基于图像处理的自动对焦技术研究”,对焦过程中的一个重要阶段是图像清晰度评价,博主自己用MATLAB实现了4类清晰度评价函数:基于图像梯度的清晰度评价函数、频域评价函数、信息熵评价函数、统计学...
  • % 函数调用:[state,result]=draw_rect(img,startPosition,windowSize,showOrNot) % 函数功能:在图像画个长方形框 % 函数输入:img为原始的大图,可为灰度图,可为彩色图 % startPosition 框的左上角在大图中的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 431,355
精华内容 172,542
关键字:

onsize函数