MFC对话框禁止移动 使标题栏不响应鼠标消息 通过客户区移动窗体 OnNcHitTest()的实现

合集下载

MFC教程 MFC工具条和状态栏

MFC教程 MFC工具条和状态栏

13. MFC工具条和状态栏1. Windows控制窗口Windows (Windows95或者以上版本) 提供了系列通用控制窗口,其中包括工具条(ToolBar)、状态栏(StatusBar)、工具条提示窗口(ToolTip)。

Windows在一个DLL加载时注册个控制窗口的“窗口类”。

例如,工具条的“窗口类”是“ToolbarWindow32”,状态栏的“窗口类”是“msctls_statusbar32”,工具条提示窗口的“窗口类”是“tooltips_class32”。

为了保证该DLL被加载,使用控制“窗口类”前,应该首先调用函数InitCommonControl。

MFC在窗口注册函数AfxDeferRegisterClass中实现了这一点。

见2.2.1节MFC下窗口的注册。

创建通用控制窗口,可以使用专门的创建函数,如创建工具条的函数::CreateToolBarEx,创建状态栏的函数::CreateStatusBarEx。

也可以调用窗口创建函数::CreateWindowEx,但是需要指定预定义的“窗口类”,必要的话还要其他步骤,如使用“ToolbarWindow32”“窗口类”创建工具栏后,还需要在工具栏中添加或者插入按钮。

一般,通用控制可以指定控制窗口风格(Style)。

例如,具备风格CCS_TOP,表示该控制窗口放到父窗口客户区的顶部,具备CCS_BOTTOM,表示该控制窗口在客户区的底部。

具体的控制窗口类可以有特别的适合于自己的风格,例如,TTS_ALWAYSTIP表示只要光标落在工具栏的按钮上,ToolTip窗口不论激活与否都会显示出来。

每一控制窗口类都有自己的窗口过程来处理自己的窗口消息,实现特定的功能。

控制窗口类的窗口过程由Windows提供。

● 工具条工具条的窗口过程处理了必要的消息,提供了标准工具条的功能,例如,工具条对客户化特征提供内在的支持,用户可以通过一个客户化对话框来添加、修改、删除或者重新安排工具条按钮。

关于OnOK()、OnCancel()、OnClose()、OnDestroy() 模式对话框

关于OnOK()、OnCancel()、OnClose()、OnDestroy() 模式对话框

关于OnOK()、OnCancel()、OnClose()、OnDestroy() 模式对话框总结OnOK()、OnCancel()、OnClose()、OnDestroy()之间的区别(转)2009年09月22日下午08:33第一,OnOK()和OnCancel()是CDialog基类的成员函数,而OnClose()和OnDestroy()是CWnd基类的成员函数,即WM消息响应函数。

从应用程序结构的角度,拿对话框来说,红色的X对应的是CWnd,而处于对话框中的“确定”、“取消”按钮则对应了CDialog。

第二,OnClose()和OnDestroy()在单视图程序中,根据<<深入浅出MFC>>所讲,程序退出时执行的操作顺序为(从点X按钮开始)(1)用户点击X退出按钮,发送了WM_CLOSE消息----->响应OnClose()(2)在WM_CLOSE消息的处理函数中,调用DestroyWindow()----->销毁与指定CWnd窗口对象关联的窗口,但未销毁CWnd对象(3)在DestroyWindow()中发送了WM_DESTROY消息----->窗口销毁后响应OnDestroy()(4)在WM_DESTROY消息中调用PostQuitMessage(),发送WM_QUIT消息,结束消息循环可以看到,程序的退出过程,是先响应OnClose(),然后响应OnDestroy(),在响应OnDestroy()之前,窗口对象已经被销毁。

OnDestroy()到底干了什么呢?它就像一个teller,先通知CWnd 对象告诉它即将被销毁,尔后OnDestroy的真正运行是在CWnd对象已经从屏幕上清除以后被调用的。

第三,OnOK()、OnCancel()()、OnClose()、OnDestroy()CDialog::OnOK首先调用UpdateData(TRUE)将数据传给对话框成员变量,然后调用CDialog::EndDialog关闭对话框;CDialog::OnCancel只调用CDialog::EndDialog关闭对话框;OnClose()是响应WM_CLOSE 的.一定程度上可以说CDialog::EndDialog()和OnClose()完成类似的工作,但处理的机制不一样,前者是CDialog的对象机制,后者是WM 的消息映射机制。

VB禁止移动窗口

VB禁止移动窗口

VB禁⽌移动窗⼝--VB禁⽌移动窗⼝--禁⽌⼀个窗⼝被移动最简单的⽅法是设置Form的Moveable属性为False,这样就⽆法拖动标题栏来改变窗⼝的位置了,同时系统菜单的“移动”命令变成了灰⾊,除此之外,还有两种⽅法也可禁⽌移动窗⼝。

1.拦截拖动标题栏的消息当⽤户在标题栏的空⽩处上按下会产⽣WM_NCLBUTTONDOWN消息和HTCAPTION附加消息,我们可以拦截这个消息来防⽌⽤户通过拖动标题栏来移动窗⼝,此外还要拦截系统菜单的“移动”命令,所以我们还要处理WM_SYSCOMMAND消息,代码如下:'Form1中'-----------------------------------------------------------Private Sub Form_Load()Me.ShowhWindow = Me.hWndOldWindowProc = SetWindowLong(hWindow, GWL_WNDPROC, AddressOf WindowProc)End SubPrivate Sub Form_Unload(Cancel As Integer)Call SetWindowLong(hWindow, GWL_WNDPROC, OldWindowProc)End Sub'Module1中'-----------------------------------------------------------Option ExplicitDeclare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As LongDeclare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As LongDeclare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As LongPublic Const GWL_WNDPROC = (-4)Public Const WM_NCLBUTTONDOWN = &HA1Public Const WM_SYSCOMMAND = &H112Public Const HTCAPTION = 2Public Const SC_MOVE = &HF010&Public hWindow As LongPublic OldWindowProc As Long'⼦类消息Public Function WindowProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long'拦截拖动标题栏消息If uMsg = WM_NCLBUTTONDOWN And wParam = HTCAPTION Then Exit Function'拦截系统菜单的“移动”消息If uMsg = WM_SYSCOMMAND And wParam = SC_MOVE Then Exit FunctionWindowProc = CallWindowProc(OldWindowProc, hWnd, uMsg, wParam, lParam)End Function2.修改窗⼝结构全⾯禁⽌移动窗⼝上⾯两种⽅法都可以禁⽌移动⼀个窗⼝,但是这种⽅法只能欺骗⽤户,⽽⽆法欺骗操作系统,即它不能防⽌⽤户通过其它第三⽅⼯具来改变⼀个窗⼝的位置,如调⽤MoveWindow或SetWindowPos函数来改变⼀个窗⼝的位置,然⽽下⾯这种⽅法就可以。

(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对话框基础要点

第五章对话框对话框是一种用户界面,它的主要功能是输出信息和接收用户的输入。

对话框与控件是密不可分的,在每个对话框内一般都有一些控件,对话框依靠这些控件与用户进行交互。

一个典型的对话框例子是选择了File-Open命令后弹出的文件对话框。

5.1对话框和控件的基本概念5.1.1对话框的基本概念对话框(Dialog)实际上是一个窗口。

在MFC中,对话框的功能被封装在了CDialog类中,CDialog类是CWnd类的派生类。

对话框分为模态对话框和非模态对话框两种。

大部分读者都会有这样的经历,当你通过File-Open命令打开一个文件对话框后,再用鼠标去选择菜单将只会发出嘟嘟声,这是因为文件对话框是一个模态对话框。

模态对话框垄断了用户的输入,当一个模态对话框打开时,用户只能与该对话框进行交互,而其它用户界面对象收不到输入信息。

我们平时所遇到的大部分对话框都是模态对话框。

非模态对话框的典型例子是Windows95提供的写字板程序中的搜索对话框,搜索对话框不垄断用户的输入,打开搜索对话框后,仍可与其它用户界面对象进行交互,用户可以一边搜索,一边修改文章,这样就大大方便了使用。

本节主要介绍模态对话框,在第四节将介绍非模态对话框。

从MFC编程的角度来看,一个对话框由两部分组成:1.对话框模板资源。

对话框模板用于指定对话框的控件及其分布,Windows根据对话框模板来创建并显示对话框。

2.对话框类。

对话框类用来实现对话框的功能,由于对话框行使的功能各不相同,因此一般需要从CDialog类派生一个新类,以完成特定的功能。

5.1.2控件的基本概念图5.1对话框中的控件控件(Control)是独立的小部件,在对话框与用户的交互过程中,控件担任着主要角色。

控件的种类较多,图5.1显示了对话框中的一些基本的控件。

MFC的控件类封装了控件的功能,表5.1介绍了一些常用的控件及其对应的控件类。

表5.1控件实际上都是窗口,所有的控件类都是CWnd类的派生类。

几种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();即使这样,效果还是很差。

如何单击除了窗口标题栏以外的区域使窗口移动

如何单击除了窗口标题栏以外的区域使窗口移动

如何单击除了窗口标题栏以外的区域使窗口移动当窗口需要确定鼠标位置时Windows向窗口发送WM_NCHITTEST信息,可以处理该信息使Windows认为鼠标在窗口标题上。

对于对话框和基于对话的应用程序,可以使用ClassWizard处理该信息并调用基类函数,如果函数返回HTCLIENT 则表明鼠标在客房区域,返回HTCAPTION表明鼠标在Windows的标题栏中。

UINT CSampleDialog : : OnNcHitTest (Cpoint point ){UINT nHitTest =Cdialog: :OnNcHitTest (point );return (nHitTest = =HTCLIENT)? HTCAPTION :nHitTest ;}上述技术有两点不利之处,其一是在窗口的客户区域双击时,窗口将极大;其二,它不适合包含几个视窗的主框窗口。

还有一种方法,当用户按下鼠标左键使主框窗口认为鼠标在其窗口标题上,使用ClassWizard在视窗中处理WM_LBUTTODOWN信息并向主框窗口发送一个WM_NCLBUTTONDOWN信息和一个单击测试HTCAPTION。

voidCSampleView : : OnLButtonDown (UINT nFlags , Cpoint point ) {CView : : OnLButtonDow (nFlags , pont );//Fool frame window into thinking somene clicked onits caption bar .GetParentFrame ( ) —>PostMessage (WM_NCLBUTTONDOWN , HTCAPTION , MAKELPARAM (poitn .x ,point .y) );}该技术也适用于对话框和基于对的应用程序,只是不必调用CWnd : : GetParentFrame 。

MFC中MessageBox使用方法

MFC中MessageBox使用方法

一函数原型及参数function MessageBox(hWnd: HWND; Text, Caption: PChar; Type: Word): Integer;hWnd:对话框父窗口句柄,对话框显示在Delphi窗体内,可使用窗体的Handle属性,否则可用0,使其直接作为桌面窗口的子窗口。

Text:欲显示的信息字符串。

Caption:对话框标题字符串。

Type:对话框类型常量。

该函数的返回值为整数,用于对话框按钮的识别。

2、类型常量对话框的类型常量可由按钮组合、缺省按钮、显示图标、运行模式四种常量组合而成。

(1)按钮组合常量MB_OK = $00000000;//一个确定按钮MB_OKCANCEL =$00000001;//一个确定按钮,一个取消按钮MB_ABORTRETRYIGNORE = $00000002;//一个异常终止按钮,一个重试按钮,一个忽略按钮MB_YESNOCANCEL = $00000003;//一个是按钮,一个否按钮,一个取消按钮MB_YESNO = $00000004;//一个是按钮,一个否按钮MB_RETRYCANCEL = $00000005;//一个重试按钮,一个取消按钮(2)缺省按钮常量MB_DEFBUTTON1 = $00000000;//第一个按钮为缺省按钮MB_DEFBUTTON2 = $00000100;//第二个按钮为缺省按钮MB_DEFBUTTON3 = $00000200;//第三个按钮为缺省按钮MB_DEFBUTTON4 = $00000300;//第四个按钮为缺省按钮(3)图标常量MB_ICONHAND = $00000010;//“×”号图标MB_ICONQUESTION = $00000020;//“?”号图标MB_ICONEXCLAMATION = $00000030;//“!”号图标MB_ICONASTERISK = $00000040;//“i”图标MB_USERICON = $00000080;//用户图标MB_ICONWARNING = MB_ICONEXCLAMATION;//“!”号图标MB_ICONERROR = MB_ICONHAND;//“×”号图标MB_ICONINFORMATION = MB_ICONASTERISK;//“i”图标MB_ICONSTOP = MB_ICONHAND;//“×”号图标(4)运行模式常量MB_APPLMODAL = $00000000;//应用程序模式,在未结束对话框前也能切换到另一应用程序MB_SYSTEMMODAL = $00001000;//系统模式,必须结束对话框后,才能做其他操作MB_TASKMODAL = $00002000;//任务模式,在未结束对话框前也能切换到另一应用程序MB_HELP = $00004000;//Help Button3、函数返回值0//对话框建立失败IDOK = 1//按确定按钮IDCANCEL = 2//按取消按钮IDABOUT = 3//按异常终止按钮IDRETRY = 4//按重试按钮IDIGNORE = 5//按忽略按钮IDYES = 6//按是按钮IDNO = 7//按否按钮二用法1. MessageBox("这是一个最简单的消息框!");2. MessageBox("这是一个有标题的消息框!","标题");3. MessageBox("这是一个确定取消的消息框!","标题", MB_OKCANCEL );4. MessageBox("这是一个警告的消息框!","标题", MB_ICONEXCLAMATION );5. MessageBox("这是一个两种属性的消息框!","标题", MB_ICONEXCLAMATION|MB_OKCANCEL );6. if(MessageBox("一种常用的应用","标题" ,MB_ICONEXCLAMATION|MB_OKCANCEL)==IDCANCEL)return;注意:以上消息框的用法是在CWnd的子类中的应用,如果不是,则要MessageBox(NULL,"ddd","ddd",MB_OK); 或MessageBox(hWnd,"ddd","ddd",MB_OK);hWnd为某窗口的句柄,或者直接用AfxMessageBox。

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

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 ;
else
return nFlags;
}
下面是一些测试枚举值
::OnNcHitTest
afx_msg UINT OnNcHitTest( CPoint point );
返回值:下面列出的鼠标击中测试枚举值之一。

· HTBORDER 在不具有可变大小边框的窗口的边框上。

· HTBOTTOM 在窗口的水平边框的底部。

· HTBOTTOMLEFT 在窗口边框的左下角。

· HTBOTTOMRIGHT 在窗口边框的右下角。

· HTCAPTION 在标题条中。

· HTCLIENT 在客户区中。

· HTERROR 在屏幕背景或窗口之间的分隔线上(与HTNOWHERE相同,除了Windows的DefWndProc函数产生一个系统响声以指明错误)。

· HTGROWBOX 在尺寸框中。

· HTHSCROLL 在水平滚动条上。

· HTLEFT 在窗口的左边框上。

· HTMAXBUTTON 在最大化按钮上。

· HTMENU 在菜单区域。

· HTMINBUTTON 在最小化按钮上。

· HTNOWHERE 在屏幕背景或窗口之间的分隔线上。

· HTREDUCE 在最小化按钮上。

· HTRIGHT 在窗口的右边框上。

· HTSIZE 在尺寸框中。

(与HTGROWBOX相同)· HTSYSMENU 在控制菜单或子窗口的关闭按钮上。

· HTTOP 在窗口水平边框的上方。

· HTTOPLEFT 在窗口边框的左上角。

· HTTOPRIGHT 在窗口边框的右上角。

· HTTRANSPARENT 在一个被其它窗口覆盖的窗口中。

· HTVSCROLL 在垂直滚动条中。

· HTZOOM 在最大化按钮上。

相关文档
最新文档