mfc 取消窗口 拖动边框

合集下载

mfc 代码关闭当前多文档的子窗口

mfc 代码关闭当前多文档的子窗口

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文档视图架构、消息处理机制等。

MFC窗体的扩展样式和其值(WS_EX_....)即CreateWindowEx的参数dwExStyle

MFC窗体的扩展样式和其值(WS_EX_....)即CreateWindowEx的参数dwExStyle

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风格来创建一个标题栏。

(MFC)无标题栏窗口移动方法

(MFC)无标题栏窗口移动方法

移动标准窗口是通过用鼠标单击窗口标题条来实现的,但对于没有标题条的窗口,就需要用鼠标单击窗口标题条以外区域来移动窗口。

有两种方法可以达到这一目标。

方法一:当窗口确定鼠标位置时,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对话框的隐藏方法

几种MFC对话框的隐藏方法

几种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设置窗口无边框、窗口可移动、窗口显示在屏幕中央、控件去边框

C#WinForm设置窗口无边框、窗口可移动、窗口显示在屏幕中央、控件去边框

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】对话框自带滚动条的使用

【MFC】对话框自带滚动条的使用

【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); }。

MFC窗体的扩展样式和其值(WS_EX_....)即CreateWindowEx的参数dwExStyle

MFC窗体的扩展样式和其值(WS_EX_....)即CreateWindowEx的参数dwExStyle

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去掉窗体灰色边框,以及实现窗体可拖动边框改变大小

C#Winform去掉窗体灰色边框,以及实现窗体可拖动边框改变大小

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;}}。

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

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 创建窗口并拖动边框,实现窗口的调整功能。

相关文档
最新文档