mfc 取消窗口 拖动边框
- 格式:docx
- 大小:16.91 KB
- 文档页数:2
MFC(Microsoft Foundation Class)是微软公司开发的用于Windows评台的C++类库,用于简化Windows应用程序的开发。
在MFC中,关闭当前多文档的子窗口可以通过以下步骤实现:1. 获取当前活动的文档视图需要获取到当前处于活动状态的文档视图,可以通过以下代码实现:```cppCWnd* pActiveWnd = AfxGetM本人nWnd(); CMDIChildWnd* pChild = (CMDIChildWnd*)pActiveWnd; CView* pView = pChild->GetActiveView();```2. 关闭子窗口有了当前活动的文档视图之后,可以通过以下代码关闭子窗口:```cpppChild->MDIDestroy();```在这段代码中,`MDIDestroy` 函数用于关闭当前子窗口。
3. 整合关闭子窗口的代码将以上两个步骤整合在一起,完整的代码如下所示:```cppCWnd* pActiveWnd = AfxGetM本人nWnd(); CMDIChildWnd* pChild = (CMDIChildWnd*)pActiveWnd; CView* pView = pChild->GetActiveView();pChild->MDIDestroy();```这样,就可以在MFC中关闭当前多文档的子窗口了。
以上代码基于MFC类库,在多文档程序框架下实现了关闭当前子窗口的功能。
在实际开发中,可以根据具体的需求和程序结构进行适当的修改和扩展。
总结起来,关闭当前多文档的子窗口在MFC中实现并不复杂,通过获取当前活动的文档视图并调用相应的函数即可完成这一操作。
希望本文对MFC开发者能有所帮助。
初步思考:续写部分将围绕MFC中关闭子窗口的方法展开,涉及到MFC开发中更广泛的内容,包括MFC文档视图架构、消息处理机制等。
1.WS_EX_ACCEPTFILES = 0x00000010指明了一个已创建视窗具有拖拽文件功能(指定以该风格创建的窗口接受一个拖拽文件)2.WS_EX_APPWINDOW = 0x00040000强制一个可见的顶级视窗到工具栏上(当窗口可见时,将一个顶层窗口放置到任务条上)3.WS_EX_CLIENTEDGE = 0x00000200使一个视窗具有凹陷边框(指定窗口有一个带阴影的边界)4.WS_EX_COMPOSITED = 0x02000000Windows XP:将一个窗体的所有子窗口使用双缓冲按照从低到高方式绘制出来,参阅remark项.如果这个视窗已经使用经典样式中的下列值CS_OWNDC , CS_CLASSDC,WS_EX_CONTEXTHELP.此参数将不能使用.这个样式的视窗在标题栏上有一个问号,当拥护点击着个问号,鼠标变成一个问号,如果用户然后点击一个子窗口,子窗就会收到一条WM_HELP消息.子窗口将把这个消息传递给他的父进程,这个父进程将用HELP_WM_HELP命令调用WinHelp函数.这个帮助程序常常弹出一个典型的包含其子窗口的帮助的窗口本参数不能和WS_MAXIMIZEBOX ,WS_MINIMIZEBOX一起使用.5.WS_EX_CONTEXTHELP = 0x00000400在窗口的标题条包含一个问号标志。
当用户点击了问号时,鼠标光标变为一个问号的指针、如果点击了一个子窗口,则子窗口接收到WM_HELP消息。
子窗口应该将这个消息传递给父窗口过程,父窗口再通过HELP_WM_HELP命令调用WinHelp函数。
这个Help应用程序显示一个包含子窗口帮助信息的弹出式窗口。
WS_EX_CONTEXTHELP不能与WS_MAXIMIZEBOX和WS_MINIMIZEBOX 同时使用。
6.WS_EX_CONTROLPARENT = 0x00010000这个窗体本身包含了参与对话框导航的子窗口.如果使用了这个参数,对话框管理器进入这个窗体的子窗口,当执行导航操作时,比如按住TAB键,方向键.(允许用户使用Tab键在窗口的子窗口间搜索)7.WS_EX_DLGMODALFRAME = 0x00000001创建一个具有双边框的窗口,这个窗口可以通过使用WS_CAPTION样式被创建成具有一个标题栏的窗口.(创建一个带双边的窗口;该窗口可以在dwStyle 中指定WS_CAPTION风格来创建一个标题栏。
移动标准窗口是通过用鼠标单击窗口标题条来实现的,但对于没有标题条的窗口,就需要用鼠标单击窗口标题条以外区域来移动窗口。
有两种方法可以达到这一目标。
方法一:当窗口确定鼠标位置时,Windows向窗口发送WM_NCHITTEST消息,可以处理该消息,使得只要鼠标在窗口内,Windows便认为鼠标在标题条上。
这需要重载CWnd类处理WM_NCHITTEST消息的OnNcHitTest函数,在函数中调用父类的该函数,如果返回HTCLIENT,说明鼠标在窗口客户区内,使重载函数返回HTCAPTION,使Windows误认为鼠标处于标题条上。
下例是使用该方法的实际代码:UINT CEllipseWndDlg::OnNcHitTest(CPoint point){// 取得鼠标所在的窗口区域UINT nHitTest = CDialog::OnNcHitTest(point);// 如果鼠标在窗口客户区,则返回标题条代号给Windows// 使Windows按鼠标在标题条上类进行处理,即可单击移动窗口return (nHitTest==HTCLIENT) ? HTCAPTION : nHitTest;}方法二:当用户在窗口客户区按下鼠标左键时,使Windows认为鼠标是在标题条上,即在处理WM_LBUTTONDOWN消息的处理函数OnLButtonDown中发送一个wParam参数为HTCAPTION,lParam为当前坐标的WM_NCLBUTTONDOWN消息。
下面是使用该方法的实际代码:void CEllipseWndDlg::OnLButtonDown(UINT nFlags, CPoint point){// 调用父类处理函数完成基本操作CDialog::OnLButtonDown(nFlags, point);// 发送WM_NCLBUTTONDOWN消息// 使Windows认为鼠标在标题条上PostMessage(WM_NCLBUTTONDOWN,HTCAPTION,MAKELPARAM(point.x, point.y)); //或SendMessage(WM_SYSCOMMAND,0xF012,0); //0xF012 = SC_MOVE | HTCAPTION}首先,看看在正常情况下系统是怎样来移动程序窗口的。
几种MFC对话框的隐藏方法有很多应用程序要求一起动就隐藏起来,这些程序多作为后台程序运行,希望不影响其他窗口,往往只在托盘区显示一个图标。
这些程序通常都是对话框程序,而对话框在初始化的过程上与SDI、MDI的初始化是不同的,对话框只需要DoModule或者是CreateDialog等等对话框函数调用一次便可,SDI、MDI则要好几步才行。
这样看来,对话框在使用方法上面是隐藏了不少细节的,其中就没有SDI、MDI所要求的ShowWindow(nCmdShow)这一步。
因此对话框要想一运行就隐藏,并不是很直接的。
有一些方法可以做到这一点,下面我们就来看看几种方案。
1.定时器最直观,又是最无奈的一个方法就是使用定时器。
既然我们在对话框开始显示之前不能用ShowWindow(SW_HIDE)将其隐藏,那就给一个时间让它显示,完了我们在隐藏它。
方法:1.在OnInitDialog()函数里设置定时器:(WINDOWS API里面响应消息WM_INITDIALOG)SetTimer(1, 1, NULL);2.添加处理WM_TIMER的消息处理函数OnTimer,添加代码:if(nIDEvent == 1){DeleteTimer(1);ShowWindow(SW_HIDE);}这种方法的缺点是显而易见的,使用定时器,使得程序的稳定性似乎打一个折扣;窗口是要先显示出来的,那么效果就是窗口闪了一下消失。
2.改变对话框显示状况在对话框初始化时改变其显示属性可以让它隐藏起来。
方法是调用SetWindowPlacement函数:BOOL CDialogExDlg::OnInitDialog(){CDialog::OnInitDialog();//DO somethingWINDOWPLACEMENT wp;wp.length=sizeof(WINDOWPLACEMENT);wp.flags=WPF_RESTORETOMAXIMIZED;wp.showCmd=SW_HIDE;SetWindowPlacement(&wp);return TRUE;}在需要显示时(通常是响应热键或者托盘图标的鼠标消息):WINDOWPLACEMENT wp;wp.length=sizeof(WINDOWPLACEMENT);wp.flags=WPF_RESTORETOMAXIMIZED;wp.showCmd=SW_SHOW;SetWindowPlacement(&wp);这样的效果很不理想:窗口显示在屏幕的左上角,并且是只有标题栏,要正常显示,还需加上如下代码:定义一个成员变量CRect rect;在OnInitDialog()里面:GetWindowRect(&rect);在需要显示的地方:SetWindowPos(&wndNoTopMost, wndRc.left, wndRc.top, w ndRc.right, wndRc.bottom,SWP_SHOWWINDOW);CenterWindow();即使这样,效果还是很差。
C#WinForm设置窗⼝⽆边框、窗⼝可移动、窗⼝显⽰在屏幕中央、控件去边框1)窗⼝去除边框在组件属性中FormBorderStyle设为None2)窗⼝随着⿏标移动⽽动添加引⽤using System.Runtime.InteropServices;在初始化控件{InitializeComponent();}代码后添加1 [DllImport("user32.dll")]2public static extern bool ReleaseCapture();3 [DllImport("user32.dll")]4public static extern bool SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);5bool beginMove = false;//初始化⿏标位置6int currentXPosition;7int currentYPosition;8 //获取⿏标按下时的位置9 private void QRCode_MouseDown(object sender, MouseEventArgs e)10 {11if (e.Button == MouseButtons.Left)12 {13 beginMove = true;14 currentXPosition = MousePosition.X;//⿏标的x坐标为当前窗体左上⾓x坐标15 currentYPosition = MousePosition.Y;//⿏标的y坐标为当前窗体左上⾓y坐标16 }17 }18 //获取⿏标移动到的位置19private void QRCode_MouseMove(object sender, MouseEventArgs e)20 {21if (beginMove)22 {23this.Left += MousePosition.X - currentXPosition;//根据⿏标x坐标确定窗体的左边坐标x24this.Top += MousePosition.Y - currentYPosition;//根据⿏标的y坐标窗体的顶部,即Y坐标25 currentXPosition = MousePosition.X;26 currentYPosition = MousePosition.Y;27 }28 }29 //释放⿏标时的位置30private void QRCode_MouseUp(object sender, MouseEventArgs e)31 {32if (e.Button == MouseButtons.Left)33 {34 currentXPosition = 0; //设置初始状态35 currentYPosition = 0;36 beginMove = false;37 }38 }3)窗⼝居中显⽰利⽤C# Form中的StartPosition属性CenterScreen将界⾯显⽰在屏幕中央若是⽤代码实现,显⽰窗体前,应设置此属性,可在调⽤Show()或是ShowDialog()⽅法之前或在窗体构造函数中设置此属性,不要在load()事件中改变此属性,不起作⽤。
【MFC】对话框⾃带滚动条的使⽤对话框⾃带滚动条的使⽤⼀,使⽤对话框窗⼝⾃带的滚动条,在属性页⾯中设置即可,如下⼆,OnInitDialog()函数中,添加如下滚动条初始化语句SCROLLINFO vinfo;vinfo.cbSize =sizeof(vinfo);vinfo.fMask =SIF_ALL;vinfo.nPage =50;//滚动块⾃⾝的长短,通常有如下关系:其长度/滚动条长度(含两个箭头)=nPage/(nMax+2), //另外nPage取值-1时,滚动条会不见了。
vinfo.nMax =600;//滚动条所能滚动的最⼤值vinfo.nMin=0;//滚动条所能滚动的最⼩值vinfo.nTrackPos =0;SetScrollInfo(SB_VERT,&vinfo);//即使上述步骤⼀不做,使⽤此条语句也可以显⽰滚动条三,添加相应的WM_VSCROLL函数void CMy1d0Dlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar){// TODO: Add your message handler code here and/or call defaultSCROLLINFO scrollinfo;GetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);switch (nSBCode){case SB_BOTTOM: //滑块滚动到最底部ScrollWindow(0,(scrollinfo.nPos-scrollinfo.nMax)*10); //滚动屏幕scrollinfo.nPos = scrollinfo.nMax; //设定滑块新位置SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL); //更新滑块位置break;case SB_TOP: //滑块滚动到最顶部ScrollWindow(0,(scrollinfo.nPos-scrollinfo.nMin)*10);scrollinfo.nPos = scrollinfo.nMin;SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);break;case SB_LINEUP: //单击上箭头scrollinfo.nPos -= 1;if (scrollinfo.nPos<scrollinfo.nMin){scrollinfo.nPos = scrollinfo.nMin;break;}SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL); ScrollWindow(0,10);break;case SB_LINEDOWN: //单击下箭头scrollinfo.nPos += 1;if (scrollinfo.nPos>scrollinfo.nMax){scrollinfo.nPos = scrollinfo.nMax;break;}SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL); ScrollWindow(0,-10);break;case SB_PAGEUP: //单击滑块上⽅空⽩区域scrollinfo.nPos -= 5;if (scrollinfo.nPos<scrollinfo.nMin){scrollinfo.nPos = scrollinfo.nMin;break;}SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL); ScrollWindow(0,10*5);break;case SB_PAGEDOWN: //单击滑块下⽅空⽩区域scrollinfo.nPos += 5;if (scrollinfo.nPos>scrollinfo.nMax){scrollinfo.nPos = scrollinfo.nMax;break;}SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL); ScrollWindow(0,-10*5);break;case SB_ENDSCROLL: //⿏标离开滑块,结束滑块拖动// MessageBox("SB_ENDSCROLL");break;case SB_THUMBPOSITION:// ScrollWindow(0,(scrollinfo.nPos-nPos)*10);// scrollinfo.nPos = nPos;// SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL); break;case SB_THUMBTRACK: //拖动滑块ScrollWindow(0,(scrollinfo.nPos-nPos)*10); scrollinfo.nPos = nPos;SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL); break;}CDialog::OnVScroll(nSBCode, nPos, pScrollBar); }。
1.WS_EX_ACCEPTFILES = 0x00000010指明了一个已创建视窗具有拖拽文件功能(指定以该风格创建的窗口接受一个拖拽文件)2.WS_EX_APPWINDOW = 0x00040000强制一个可见的顶级视窗到工具栏上(当窗口可见时,将一个顶层窗口放置到任务条上)3.WS_EX_CLIENTEDGE = 0x00000200使一个视窗具有凹陷边框(指定窗口有一个带阴影的边界)4.WS_EX_COMPOSITED = 0x02000000Windows XP:将一个窗体的所有子窗口使用双缓冲按照从低到高方式绘制出来,参阅remark项.如果这个视窗已经使用经典样式中的下列值CS_OWNDC , CS_CLASSDC,WS_EX_CONTEXTHELP.此参数将不能使用.这个样式的视窗在标题栏上有一个问号,当拥护点击着个问号,鼠标变成一个问号,如果用户然后点击一个子窗口,子窗就会收到一条WM_HELP消息.子窗口将把这个消息传递给他的父进程,这个父进程将用HELP_WM_HELP命令调用WinHelp函数.这个帮助程序常常弹出一个典型的包含其子窗口的帮助的窗口本参数不能和WS_MAXIMIZEBOX ,WS_MINIMIZEBOX一起使用.5.WS_EX_CONTEXTHELP = 0x00000400在窗口的标题条包含一个问号标志。
当用户点击了问号时,鼠标光标变为一个问号的指针、如果点击了一个子窗口,则子窗口接收到WM_HELP消息。
子窗口应该将这个消息传递给父窗口过程,父窗口再通过HELP_WM_HELP命令调用WinHelp函数。
这个Help应用程序显示一个包含子窗口帮助信息的弹出式窗口。
WS_EX_CONTEXTHELP不能与WS_MAXIMIZEBOX和WS_MINIMIZEBOX同时使用。
6.WS_EX_CONTROLPARENT = 0x00010000这个窗体本身包含了参与对话框导航的子窗口.如果使用了这个参数,对话框管理器进入这个窗体的子窗口,当执行导航操作时,比如按住TAB键,方向键.(允许用户使用Tab键在窗口的子窗口间搜索)7.WS_EX_DLGMODALFRAME = 0x00000001创建一个具有双边框的窗口,这个窗口可以通过使用WS_CAPTION样式被创建成具有一个标题栏的窗口.(创建一个带双边的窗口;该窗口可以在dwStyle 中指定WS_CAPTION风格来创建一个标题栏。
C#Winform去掉窗体灰⾊边框,以及实现窗体可拖动边框改变⼤⼩1)去掉窗体灰⾊边框:在设计窗⼝中,将Form的FormBorderStyle设置为 FixedSingle 。
但是设置后窗⼝⽆法实现拖动边框改变⼤⼩。
需要在Form.cs加⼊以下代码:private const int WM_NCLBUTTONDBLCLK = 163;private const int WM_NCHITTEST = 132;///<summary>///边框改变⼤⼩///</summary>///<param name="m"></param>protected override void WndProc(ref Message m){switch (m.Msg){case WM_NCLBUTTONDBLCLK://WM_NCLBUTTONDBLCLK=163 <0xA3>拦截⿏标⾮客户区左键双击消息,决定窗体是否最⼤化显⽰if (this.MaximizeBox){base.WndProc(ref m);this.Invalidate();}return;case WM_NCHITTEST://WM_NCHITTEST=132 <0x84>base.WndProc(ref m);//如果去掉这⼀⾏代码,窗体将失去MouseMove..等事件//Point lpint = new Point((int)m.LParam);//可以得到⿏标坐标,这样就可以决定怎么处理这个消息了,是移动窗体,还是缩放,以及向哪向的缩放//if (lpint.Y < 30)// m.Result = (IntPtr)0x2;//托动HTCAPTION=2 <0x2>if (WindowState != FormWindowState.Maximized){Point p2 = this.PointToClient(MousePosition);//⿏标相对于窗体的坐标//当然可以托动也可以改变⼤⼩了//label1.Text = p2.X + "," + p2.Y;//HTLEFT=10 <0xA> 左边框if (p2.X < 5 && p2.Y > 5 && p2.Y < this.Height - 5)m.Result = (IntPtr)0xA;else if (p2.Y < 5 && p2.X > 5 && p2.X < this.Width - 5)m.Result = (IntPtr)0xC;//HTTOP=12 <0xC> 上边框else if (p2.X < 5 && p2.Y < 5)m.Result = (IntPtr)0xD;//HTTOPLEFT=13 <0xD>else if (p2.X >= this.Width - 5 && p2.Y < 5)m.Result = (IntPtr)0xE;//HTTOPRIGHT=14 <0xE>else if (p2.X > this.Width - 5 && p2.Y > 5 && p2.Y < this.Height - 5)m.Result = (IntPtr)0xB;//HTRIGHT=11 <0xB>else if (p2.Y >= this.Height - 5 && p2.X > 5 && p2.X < this.Width - 5)m.Result = (IntPtr)0xF;//HTBOTTOM=15 <0xF>else if (p2.X < 5 && p2.Y >= this.Height - 5)m.Result = (IntPtr)0x10;//HTBOTTOMLEFT=16 <0x10>else if (p2.X > this.Width - 5 && p2.Y >= this.Height - 5)m.Result = (IntPtr)0x11;//HTBOTTOMRIGHT=17 <0x11>//HTBORDER=18 <0x12>//HTMINBUTTON=8 <0x8> 最⼩化按钮//HTMAXBUTTON=9 <0x9> 最⼤化按钮//HTCLOSE=20 <0x14> 关闭按钮}return;default:base.WndProc(ref m);return;}}。
大家所熟知的编辑框即是QQ聊天窗口的输入编辑框,同样,MFC中的编辑框也是类似的东西,下面请看这个程序实现之后的截图分为上下两个编辑框窗口,上面的窗口实现输入,而点击显示后实现的是下面窗口的显示,类似于QQ聊天窗口的发送,确定和取消实现的是关闭程序。
请看截图:第一个截图是我在编辑框中输入一行语句,当然可以实现多行输入,也可以实现汉语的输入,下面的截图是我点击显示之后出现的运行画面。
源代码如下:编辑框控件的使用.cpp// 编辑框控件的使用.cpp : 定义应用程序的类行为。
//#include "stdafx.h"#include "编辑框控件的使用.h"#include "编辑框控件的使用Dlg.h"#ifdef _DEBUG#define new DEBUG_NEW#endif// C编辑框控件的使用AppBEGIN_MESSAGE_MAP(C编辑框控件的使用App, CWinApp) ON_COMMAND(ID_HELP, &CWinApp::OnHelp)END_MESSAGE_MAP()// C编辑框控件的使用App 构造C编辑框控件的使用App::C编辑框控件的使用App(){// TODO: 在此处添加构造代码,// 将所有重要的初始化放置在InitInstance中}// 唯一的一个C编辑框控件的使用App 对象C编辑框控件的使用App theApp;// C编辑框控件的使用App 初始化BOOL C编辑框控件的使用App::InitInstance(){// 如果一个运行在Windows XP 上的应用程序清单指定要// 使用ComCtl32.dll 版本 6 或更高版本来启用可视化方式,//则需要InitCommonControlsEx()。
否则,将无法创建窗口。
INITCOMMONCONTROLSEX InitCtrls;InitCtrls.dwSize = sizeof(InitCtrls);// 将它设置为包括所有要在应用程序中使用的// 公共控件类。
MFC对话框禁止移动使标题栏不响应鼠标消息通过客户区移动窗体OnNcHitTest()的实现//这个函数允许我们对windows鼠标消息进行处理对于基类函数的返回值我们可以通过判断消息类型来进行不同的处理//也就是说我们可以对鼠标消息做任意处理比如是菜单栏上的消息我们可以返回标题栏的值//对应的消息类型有如下查找MSDN此函数的值有介绍UINT CMyDlg::OnNcHitTest(CPoint point){UINT nFlags= CDialog::OnNcHitTest(point); //调用基类的OnNcHitTest获得返回值if(nFlags==HTCAPTION||nFlags==HTSYSMENU) //如果鼠标消息是在标题栏上或者系统菜单栏我们就返回FALSE 不进行处理{return FALSE ;}else if(nFlags==HTCLIENT) //可以通过客户区域移动窗体但是不能通过标题栏移动return HTCAPTION ;elsereturn nFlags;}下面是一些测试枚举值::OnNcHitTestafx_msg UINT OnNcHitTest( CPoint point );返回值:下面列出的鼠标击中测试枚举值之一。
· HTBORDER 在不具有可变大小边框的窗口的边框上。
· HTBOTTOM 在窗口的水平边框的底部。
· HTBOTTOMLEFT 在窗口边框的左下角。
· HTBOTTOMRIGHT 在窗口边框的右下角。
· HTCAPTION 在标题条中。
· HTCLIENT 在客户区中。
· HTERROR 在屏幕背景或窗口之间的分隔线上(与HTNOWHERE相同,除了Windows的DefWndProc函数产生一个系统响声以指明错误)。
· HTGROWBOX 在尺寸框中。
MFC窗口和控件大小同时变化第一步:当然要首先设置当前对话框属性为可拖动大小变化的即Resizing属性第二步:定义一个CList类对象,用于将所有的控件坐标存储在链表中。
CList<CRect,CRect>listRect;第三步:初始化函数中添加在初始化窗口中最后添加:CRectrectWnd;GetWindowRect(&rectWnd);//得到当前窗口(对话框)的坐标listRect.AddTail(&rectWnd);//将坐标添加到链表listRect的末尾(注意是CList<CRect,CRect>listRect;类的成员变量)CWnd *pWndChild=GetWindow(GW_CHILD);//while (pWndChild)//依次得到对话框上控件的坐标,并将所有的控件坐标存储在链表中{pWndChild->GetWindowRect(&rectWnd);listRect.AddTail(&rectWnd);//由于依次将控件坐标添加到链表末尾,所以开头的坐标是对话框的坐标pWndChild=pWndChild->GetNextWindow();}第四步:添加WM_SIZE消息响应函数:void CDevicePage::OnSize(UINT nType, int cx, int cy){CDialog::OnSize(nType, cx, cy);if (listRect.GetCount()>0)//看链表是否为空{CRectrectDlgNow;GetWindowRect(&rectDlgNow);//得到当前对话框的坐标POSITION mp=listRect.GetHeadPosition();//取得存储在链表中的头元素,其实就是前边的对话框坐标CRectrectDlgSaved;rectDlgSaved=listRect.GetNext(mp);ScreenToClient(rectDlgNow);floatfRateScaleX=(float)(rectDlgNow.right-rectDlgNow.left)/(rectDlgSaved.right-r ectDlgSaved.left);//拖拉后的窗口大小与原来窗口大小的比例floatfRateScaleY=(float)(rectDlgNow.bottom-rectDlgNow.top)/(rectDlgSaved.bot tom-rectDlgSaved.top);ClientToScreen(rectDlgNow);CRectrectChildSaved;CWnd *pWndChild=GetWindow(GW_CHILD);while (pWndChild){rectChildSaved=listRect.GetNext(mp);rectChildSaved.left=rectDlgNow.left+(int)((rectChildSaved.left-rectDlgSaved. left)*fRateScaleX);rectChildSaved.top=rectDlgNow.top+(int)((rectChildSaved.top-rectDlgSaved. top)*fRateScaleY);rectChildSaved.right=rectDlgNow.right+(int)((rectChildSaved.right-rectDlgSa ved.right)*fRateScaleX);rectChildSaved.bottom=rectDlgNow.bottom+(int)((rectChildSaved.bottom-r ectDlgSaved.bottom)*fRateScaleY);ScreenToClient(rectChildSaved);pWndChild->MoveWindow(rectChildSaved);pWndChild = pWndChild->GetNextWindow();}}Invalidate(); //强制重绘窗口}。
mfc关闭标题栏的样式在MFC(Microsoft Foundation Classes)中关闭窗口标题栏的样式可以通过以下几种方式实现:1. 使用无边框窗口样式:可以在创建窗口时,将窗口样式设置为无边框样式,例如:DWORD dwStyle = WS_POPUP | WS_SYSMENU;CreateEx(0, AfxRegisterWndClass(0), _T("My Window"), dwStyle, rect, pParentWnd, 0);这样窗口将没有标题栏和边框。
2. 自定义绘制标题栏:可以通过自定义绘制窗口的标题栏来隐藏或修改标题栏的样式。
在窗口的`OnNcPaint`函数中,可以使用GDI函数绘制自定义的标题栏,例如:void CMyWnd::OnNcPaint()。
{。
// 自定义绘制标题栏的代码。
}。
在自定义的绘制代码中,可以使用GDI函数绘制标题栏的背景、图标、按钮等元素。
3. 使用窗口样式修改函数:可以使用`ModifyStyle`函数或`ModifyStyleEx`函数来动态修改窗口的样式。
例如,可以在窗口的`OnInitDialog`函数中调用`ModifyStyle`函数来移除标题栏的样式:BOOL CMyDlg::OnInitDialog()。
{。
CDialogEx::OnInitDialog();// 移除标题栏样式。
ModifyStyle(WS_CAPTION, 0);return TRUE;}。
这样窗口将在初始化时移除标题栏。
需要注意的是,关闭标题栏可能会影响窗口的交互和系统默认的行为,因此在进行此类修改时需要谨慎考虑。
同时,以上方法适用于MFC框架,具体实现可能因应用程序的需求而有所不同。
MFC中关闭窗口的几种办法+MFC中MessageBox的用法MFC中关闭窗口的几种办法:退出程序用AfxGetMainWnd()->SendMessage(WM_CLOSE);关闭当前窗口用DestroyWindow( );关闭模式对话框用EndDialog(0);MFC中MessageBox的用法消息框是个很常用的控件,属性比较多,本文列出了它的一些常用方法,及指出了它的一些应用场合。
1.MessageBox("这是一个最简单的消息框!");2.MessageBox("这是一个有标题的消息框!","标题");3.MessageBox("这是一个确定取消的消息框!","标题", MB_OKCANCEL );4.MessageBox("这是一个警告的消息框!","标题", MB_ICONEXCLAMA TION );5.MessageBox("这是一个两种属性的消息框!","标题", MB_ICONEXCLAMA TION|MB_OKCANCEL );6.if(MessageBox("一种常用的应用","标题",MB_ICONEXCLAMA TION|MB_OKCANCEL)==IDCANCEL)return;附其它常用属性系统默认图标,可在消息框上显示X错误MB_ICONHAND, MB_ICONSTOP, and MB_ICONERROR询问MB_ICONQUESTION!警告MB_ICONEXCLAMA TION and MB_ICONWARNINGi信息MB_ICONASTERISK and MB_ICONINFORMA TION按钮的形式MB_OK 默认MB_OKCANCEL 确定取消MB_YESNO 是否MB_YESNOCANCEL 是否取消返回值IDCANCEL 取消被选IDNO 否被选IDOK 确定被选IDYES 是被选MFC 文本框用法//获得EDITCEdit* pBoxOne;pBoxOne = (CEdit*) GetDlgItem(IDC_EDIT1);//付值pBoxOne->SetWindowText( _T"FOO" );//取值CString str;pBoxOne->GetWindowText(str);GetDlgItem(IDC_EDIT1)->SetWindowText( _T"FOO" );也可以//取值CString str;GetDlgItem(IDC_EDIT1)->GetWindowText(str);EditControl是在MFC对话框中最频繁的使用的控件之一VC++2005提供EditControl的属性和控件事件操作简单方便1只允许输入数字如果设置EditControl中只能输入数字,在VC6.0中需要编写一个派生类来达到目的,而在VC++2005下只需要在属性对话框中将Number的属性值设为True就可以了.2获取EditControl的内容两种方法第一种,利用MFC应用程序向导生成一个基于对话框的应用程序,从资源视图中选择该Dialog窗体,利用右侧的工具箱,向Dialog内添加一个EditControl项,声明控件变量的类别为V alue,变量类型为CString,变量名为m_sEdit_Content. CString m_sEdit_Content;CString s;UpdateData(true);s=m_sEdit_Content.GetString();MessageBox(s,_T("获取编辑框的内容"),MB_OK);s.ReleaseBuffer();这样就取得了编辑框的内容UpdateData(true);这句代码很重要,它的作用是将输入的数据装入EditControl对应的变量m_sEdit_Content中.由于MFC应用程序向导默认是使用Unicode库,所以MessageBox中的字符串需要用_T(),否则会出现const char[]转换LPCTSTR错误,如果不使用Unicode库就不需要_T().第二种方法声明控件变量的类别为Control,变量类型为CEdit,变量名为m_Edit_Content.代码如下(Unicode)CString s;s.GetBufferSetLength(1024);m_Edit_Content.GetWindowTextW(s.GetBuffer(),s.GetLength());MessageBox(s,_T("获取文本框的内容"),MB_OK);s.ReleaseBuffer();如果不是Unicode下获取编辑框内容的函数就是GetWindowTextA3将EditControl中的内容转化为整数在限制编辑框只能数字之后,要将字符串转化为整数声明控件变量的类别为V alue,变量类型为CString,变量名为m_sEdit_Content.CString s;UpdateData(true);s=m_sEdit_Content.GetString();int n=_tstoi(s);s.ReleaseBuffer();n就是所需要的整数在VC2005下字符串转换成整数需要_tstoi这个函数4限制编辑框的输入长度声明控件变量的类别为Control,变量类型为CEdit,变量名为m_Edit_Content.在对话框初始化的地方写m_Edit_Content.SetLimitText(1);编辑框就只能输入一个字符了.教你如何用WORD文档(2012-06-27 192246)转载▼标签:杂谈1. 问:WORD 里边怎样设置每页不同的页眉?如何使不同的章节显示的页眉不同?答:分节,每节可以设置不同的页眉。
C++MFC(17)-GetWindowRect和GetClientRect详解windows(对话框),screen(屏幕),client(dialog或者是控件)1.对话框与其它两者的关系//得到win的尺⼨this->GetWindowRect(&wndRect1);//以client左上⾓为(0,0)为原点坐标显⽰screen的坐标所以有负值this->ScreenToClient(&wndRect1);//windows内的client 去边框后的值this->GetClientRect(&wndRect2);//以screen左上⾓(0,0)为原点坐标显⽰client的值this->ClientToScreen(&wndRect2);GetWindowRect: {top=0 bottom=378 left=0 right=566}ScreenToClient:{top=-25 bottom=353 left=-3 right=563}GetClientRect: {top=0 bottom=350 left=0 right=560}ClientToScreen:{top=25 bottom=375 left=3 right=563}2.控件与其它两者的关系/****再看控件的**********/CRect ctrlRect1;CRect ctrlRect2;CStatic *pCtrl = (CStatic*)GetDlgItem(IDC_STC_TEST);pCtrl->GetClientRect(&ctrlRect1);pCtrl->ClientToScreen(&ctrlRect1);pCtrl->GetWindowRect(&ctrlRect2);pCtrl->ScreenToClient(&ctrlRect2);//控件⼤⼩GetClientRect: {top=0 bottom=170 left=0 right=285}//以Screen左上⾓为原点控件右移(127,73)ClientToScreen: {top=127 bottom=297 left=73 right=358}//以windows左上⾓为原点控件在窗⼝中的坐标GetWindowRect: {top=127 bottom=297 left=73 right=358}//以控件左上⾓为原点ScreenToClient: {top=0 bottom=170 left=0 right=285}备注:程序⼀般的调⽤顺序是OnCreate()->OnSize()->OnDraw()我实践的结果是在OnDraw()中>GetClientRect(rect); 才会有值,前⾯函数⾥调⽤时 rect都是0.。
mfc 对象拖拽编程摘要:1.MFC 对象拖拽编程概述2.MFC 对象的拖拽实现方法3.拖拽过程中需要注意的问题4.总结与展望正文:MFC(Microsoft Foundation Class)是微软提供的一套C++类库,用于简化Windows 应用程序的开发。
在MFC 中,我们可以通过拖拽操作来移动或复制对象。
本文将详细介绍MFC 对象拖拽编程的相关知识和技巧。
1.MFC 对象拖拽编程概述MFC 对象拖拽编程是指在MFC 框架下,利用拖拽操作实现对窗口中对象(如按钮、文本框等)的移动或复制。
要实现这一功能,我们需要对MFC 的的消息处理机制有一定了解。
在拖拽操作中,最为关键的消息是WM_LBUTTONDOWN、WM_LBUTTONUP 和WM_MOVE。
2.MFC 对象的拖拽实现方法要实现MFC 对象的拖拽操作,我们需要分以下几个步骤进行:(1)重载鼠标按下(WM_LBUTTONDOWN)消息处理函数,在此消息处理函数中,我们需要记录当前鼠标位置和被拖拽对象的当前位置。
(2)重载鼠标抬起(WM_LBUTTONUP)消息处理函数,在此消息处理函数中,我们需要清除拖拽状态,并设置被拖拽对象的新的当前位置。
(3)重载窗口移动(WM_MOVE)消息处理函数,在此消息处理函数中,我们需要根据鼠标位置和被拖拽对象的当前位置计算出新的窗口位置,并更新窗口的客户区域。
(4)处理拖拽过程中的键盘消息,例如当用户按下键盘上的ESC 键时,需要取消拖拽操作。
3.拖拽过程中需要注意的问题在实现拖拽操作的过程中,需要注意以下几个问题:(1)在拖拽过程中,被拖拽对象需要始终保持在鼠标光标的正下方,以实现平滑的拖拽效果。
(2)在拖拽过程中,如果鼠标点击了其他非拖拽对象的区域,需要立即停止拖拽操作。
(3)在拖拽过程中,如果用户按下了键盘上的ESC 键,需要立即取消拖拽操作。
4.总结与展望MFC 对象拖拽编程是MFC 编程中一个常见的功能,通过本文的介绍,相信你已经掌握了实现该功能的方法。
mfc 取消窗口拖动边框
(原创实用版)
目录
1.MFC 简介
2.MFC 中的窗口和边框
3.如何使用 MFC 创建窗口
4.如何使用 MFC 取消窗口
5.如何使用 MFC 拖动边框
正文
一、MFC 简介
MFC,全称 Microsoft Foundation Class,是微软提供的一套用于开发 Windows 应用程序的 C++类库。
它包含了大量的预定义类和函数,可以简化 Windows 应用程序的开发过程。
MFC 基于窗口操作系统,支持创建各种窗口和控件,提供了丰富的图形用户界面功能。
二、MFC 中的窗口和边框
在 MFC 中,窗口是一个基本的界面元素,可以通过窗口类(如CWindow)或其派生类(如 CFrame)创建。
窗口由一个标题栏、菜单栏、工具栏和状态栏组成,其中标题栏包含了窗口的标题和关闭按钮。
边框是窗口的边缘部分,可以拖动以调整窗口的大小。
三、如何使用 MFC 创建窗口
使用 MFC 创建窗口的过程如下:
1.创建一个 CWindow 的实例。
2.调用成员函数 Create,传入窗口类名、窗口标题和窗口样式等参数。
3.显示窗口,调用成员函数 ShowWindow。
四、如何使用 MFC 取消窗口
要取消一个窗口,可以使用 DestroyWindow 函数。
首先,需要获取窗口的句柄,然后调用 DestroyWindow 函数并传入窗口句柄作为参数。
五、如何使用 MFC 拖动边框
要拖动边框,需要处理窗口的消息,具体步骤如下:
1.重载 CWindow 的 WndProc 函数。
2.在 WndProc 函数中处理 WM_NCHITTEST 消息,判断鼠标是否在窗口标题栏上。
3.如果鼠标在标题栏上,处理 WM_MOUSEMOVE 和 WM_LBUTTONDOWN 消息,记录鼠标位置。
4.处理 WM_LBUTTONUP 消息,根据鼠标位置计算窗口的新大小。
5.调用成员函数 SetWindowPos,设置窗口的新位置和大小。
通过以上步骤,可以使用 MFC 创建窗口并拖动边框,实现窗口的调整功能。