在VC++中实现无标题栏对话框的拖动

合集下载

VC实现鼠标移动对话框窗口

VC实现鼠标移动对话框窗口

计算机系列教学文档------VC实现鼠标移动对话框窗口
VC实现鼠标移动对话框窗口
本实例主要实现了通过鼠标的移动,来实现窗口的同步移动。

即鼠标左键按下后并对鼠标进行移动,从而窗口跟随鼠标移动,直到鼠标左键抬起,其具体思路是重载“WM_NCHITTEST”消息,在生成的“OnNcHitTest”函数中添加鼠标移动时窗口随之移动的代码,具体实现步骤如下:
在所要移动的窗口类上面,点击鼠标右键,选择“Add Windows Message Handler…”如图所示:
在弹出的窗口中选择“WM_NCHITTEST”消息,如下图所示:
此时双击“WM_NCHITTEST”消息,或点击“AddHandler”接钮,添加到已经存在的消息列表中,如下图所示:
如果“WM_NCHITTEST”消息已经成功加入列已经存在的消息列表中,则点击“Add and Edit”按钮,如下图所示:
此时系统会自动生成对“WM_NCHITTEST”消息的映射函数(函数名为:OnNcHitTest),如下图所示:
最后,在刚刚生成的OnNcHitTest函数中添加窗口的移动代码,代码如下所示:
至此,窗口的移动已经实现。

C++ 无边框的拖动窗口代码

C++ 无边框的拖动窗口代码
this->_mousePoint = CPoint(point);
}
void CNoBorderFormDlg::OnLButtonUp(UINT nFlags, CPoint point)
{பைடு நூலகம்
// TODO:在此添加消息处理程序代码和/或调用默认值
CDialog::OnLButtonUp(nFlags, point);
}
{
///鼠标左键按下时,可以拖动窗体
CPoint pointChanged = point - (this->_mousePoint);
RECT rect;
this->GetWindowRect(&rect);
this->SetWindowPos(NULL, rect.left pointChanged.x, rect.top pointChanged.y, 0, 0, SWP_NOSIZE);
}
}
void CNoBorderFormDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO:在此添加消息处理程序代码和/或调用默认值
CDialog::OnLButtonDown(nFlags, point);
this->_leftButtonDown = TRUE;
this->_leftButtonDown = FALSE;
}
void CNoBorderFormDlg::OnMouseLeave()
{
// TODO:在此添加消息处理程序代码和/或调用默认值
CDialog::OnMouseLeave();
this->_leftButtonDown = FALSE;

VC 对话框中的滚动条

VC 对话框中的滚动条

要创建带垂直滚动条的resizeable 对话框,执行以下步骤:1.使用应用程序向导创建Microsoft 基础类(MFC) 基于对话框的应用程序。

2.在资源编辑器中添加到对话框的资源模板的某些控件属性对话框中选择垂直滚动,然后选择Resizing作为边框样式。

3.添加以下受保护的对话框类的成员变量:4.int m_nCurHeight;5.int m_nScrollPos;6.CRect m_rect;用于m_nScrollPos存储当前垂直滚动条的位置。

存储对话框框的当前高度和处理OnVScroll方法中滚动,请使用m_nCurHeight。

7.若要将原始的窗口大小将下行添加到OnInitDialog方法:8.GetWindowRect(m_rect);9.m_nScrollPos = 0;10.将消息处理程序添加到OnSize方法设置滚动条区域WM_SIZE 消息。

将范围设置为0,如果大小增加到原有大小超过11.void CTestDlg::OnSize(UINT nType, int cx, int cy)12.{13.CDialog::OnSize(nType, cx, cy);14.15.// TODO: Add your message handler code here.16.m_nCurHeight = cy;17.int nScrollMax;18.if (cy < m_rect.Height())19.{20. nScrollMax = m_rect.Height() - cy;21.}22.else23. nScrollMax = 0;24.25.SCROLLINFO si;26.si.cbSize = sizeof(SCROLLINFO);27.si.fMask = SIF_ALL; // SIF_ALL = SIF_PAGE |SIF_RANGE | SIF_POS;28.si.nMin = 0;29.si.nMax = nScrollMax;30.si.nPage = si.nMax/10;31.si.nPos = 0;32. SetScrollInfo(SB_VERT, &si, TRUE);33.}34.将消息处理程序为WM_VSCROLL 消息添加到OnVScroll方法:35.void CTestDlg::OnVScroll(UINT nSBCode, UINT nPos,CScrollBar* pScrollBar)36.{37.// TODO: Add your message handler code hereand/or call default.38.int nDelta;39.int nMaxPos = m_rect.Height() -m_nCurHeight;40.41.switch (nSBCode)42.{43.case SB_LINEDOWN:44.if (m_nScrollPos >= nMaxPos)45.return;46.nDelta =min(nMaxPos/100,nMaxPos-m_nScrollPos);47.break;48.49.case SB_LINEUP:50.if (m_nScrollPos <= 0)51.return;52.nDelta =-min(nMaxPos/100,m_nScrollPos);53.break;54.55. case SB_PAGEDOWN:56.if (m_nScrollPos >= nMaxPos)57.return;58.nDelta =min(nMaxPos/10,nMaxPos-m_nScrollPos);59.break;60.61.case SB_THUMBPOSITION:62.nDelta = (int)nPos - m_nScrollPos;63.break;64.65.case SB_PAGEUP:66.if (m_nScrollPos <= 0)67.return;68.nDelta =-min(nMaxPos/10,m_nScrollPos);69.break;70.71. default:72.return;73.}74.m_nScrollPos += nDelta;75.SetScrollPos(SB_VERT,m_nScrollPos,TRUE);76.ScrollWindow(0,-nDelta);77.CDialog::OnVScroll(nSBCode, nPos,pScrollBar);78.}79.生成并运行该应用程序。

vc实现拖放控件

vc实现拖放控件

基于对话框的文件拖拽载入2011年4月7日梁昭发表评论阅读评论不知道你是否对QQ文件传输比较好奇?将文件拖入对话窗口,就可以实现文件的传输...其实在MFC中实现起来比较简单,在Windows中已经将消息封装好了。

这一节我们主要来学习一下基于对话框的文件拖拽功能!(1)最容易出错且较易遗忘的一步:选中对话框的属性"Accept files",细心一点容易发现,基本上所有的控件都有这个属性,注意只要将对话框的这个属性设置就行了,其余控件的属性不要进行设置。

否则主窗口的Accept files可能不起作用。

(2)将对话框的WM_DropFiles消息映射添加进来,(3)使用Win32 API可以轻易地在自己的GUI程序中加入拖放支持。

你需要了解这样几个函数DragAcceptFiles函数原型:VOID DragAcceptFiles(HWND hWnd, BOOL fAccept);此函数告诉Windows窗口hWnd是否接受从shell拖放过来的文件,fAccept=TRUE表示接受拖放。

这意味着窗口hWnd必须能够处理WM_DROPFILES消息。

DragFinish函数原型:VOID DragFinish(HDROP hDrop);在Drag-and-Drop过程完成时调用,从而允许shell释放为传递文件名而开辟的内存空间。

hDrop是WM_DROPFILES消息的WParam参数。

DragQueryFile函数原型:UINT DragQueryFile(HDROP hDrop, UINT iFile, LPTSTR lpszFile, UINT cch);此函数用来获取拖放的文件名。

hDrop是WM_DROPFILES消息的WParam参数,lpszFile是用于容纳文件名的缓冲区,cch是该缓冲区的大小。

设置iFile=0xFFFFFFFF的话,此函数返回拖放的文件总数,记为count。

在VB中实现移动没有标题栏的窗口

在VB中实现移动没有标题栏的窗口

在VB中实现移动没有标题栏的窗口方法二 (可用这种方法通过消息的发送实现移动无标题窗体。

当鼠标按下、移动或释放时,将鼠标在窗体上按下的消息(消息值为HTCAPTION)发出,就能拖动窗体了。

代码如下:Private Declare Function ReleaseCapture Lib "user32" () As LongPrivate Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long,ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As LongPrivate Const WM_NCLBUTTONDOWN = &&HA1Private Const HTCAPTION = 2’以上API函数和常数的声明可在VB自带的“API浏览器”中找到Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)’在窗体的MouseDown事件中添加以下代码If Button = 1 ThenCall ReleaseCaptureCall SendMessage(hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0)End IfEnd SubPrivate Sub Command1_Click()End ’退出程式End Sub这种方法实现起来比第一种方法更容易,只有几行代码,并且没有那么多的变量,窗体被拖动时和普通窗体相同,只有一个虚框随鼠标的移动而移动,当释放鼠标时窗体才移动到相应的位置。

用到了两个API函数。

在visual basic中如何拖动窗体或控件现在的许多windows下的应用程序,都采用了图形化的界面,例如:winamp等!这样做的好处是可以使程序界面更漂亮生动,更具吸引力。

VC 对话框自带滚动条的使用

VC 对话框自带滚动条的使用

VC对话框自带滚动条的使用一,使用对话框窗口自带的滚动条,在属性页面中设置即可,如下二,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);}。

VC实现显示、自动隐藏任务栏

VC实现显示、自动隐藏任务栏

VC 实现显示、自动隐藏任务栏(SHAppBarMessage)VC 实现显示、自动隐藏任务栏(SHAppBarMessage)一、显示和隐藏任务栏要想对任务栏进行操作,首先当然需要获得任务栏的句柄,所以首先利用FindWindow 获取句柄,再操作示例代码:1、隐藏任务栏HWND hWnd = FindWindow(_T("Shell_TrayWnd"),NULL); ShowWindow(hWnd,SW_HIDE);2、显示任务栏HWND hWnd = FindWindow(_T("Shell_TrayWnd"),NULL);ShowWindow(hWnd,SW_SHOW); 二、自动隐藏任务栏和取消自动隐藏任务栏(隐藏于自动隐藏不同)需要利用一API 函数:SHAppBarMessage UINT_PTR SHAppBarMessage(DWORD dwMessage,PAPPBARDATA pData);参数说明:dwMessage 可以为下列参数ABM_ACTIVATEappbarABM_GETAUTOHIDEBAR 的appbar ABM_GETSTATE激活一个检索屏幕边缘检索最顶层的Microsoft Windows 任务栏ABM_GETTASKBARPOS 检索任务栏ABM_NEW 注册一个新的appbar ,该系统并发送一消息给appbarABM_QUERYPOS appbar 大小和屏幕位置ABM_REMOVE 取消注册一个appbar ,并从系统内部列表移出ABM_SETAUTOHIDEBAR 在屏幕边缘注册或取消注册appbarABM_SETPOS 设置appbar 的大小和屏幕位置ABM_SETSTATE appbar 为最顶层设置ABM_WINDOWPOSCHANGED 当appbar 得状态发送改变时向系统发送消息pData一个APPBARDATA 结构体示例代码:void AutoHideTaskBar(BOOL bHide){//这三句视情况加于不加#ifndef ABM_SETSTATE#define ABM_SETSTATE0x0000000a#endifLPARAM lParam;if(bHide == TRUE)lParam = ABS_AUTOHIDE;// 自动隐藏}else{lParam = ABS_ALWAYSONTOP;// 取消自动隐藏}APPBARDATA apBar;memset(&amp;apBar,0,sizeof(apBar));apBar.cbSize = sizeof(apBar); apBar.hWnd =FindWindow("Shell_TrayWnd",NULL);if(apBar.hWnd != NULL){apBar.lParam = lParam;SHAppBarMessage(ABM_SETSTATE,&amp;apBar); // 置任务栏自动隐藏}}调用AutoHideTaskBar(TRUE);//orAutoHideTaskBar(FALSE);//。

VC对话框程序添加目录菜单、工具条和状态栏

VC对话框程序添加目录菜单、工具条和状态栏

VC对话框程序添加目录菜单、工具条和状态栏为<对话框>添加工具条和状态栏前,先说说添加目录菜单栏;1,在Insert下拉菜单中选择Resorce,新建一个MENU,2,在CDialog::OnInitDialog();后面添加代码:CMenu menu;menu.LoadMenu(IDR_MENU1); // 红色部分为你新建MENU的ID索引SetMenu(&menu);为对话框程序添加工具条和状态栏摘要:本文介绍了在对话框程序基础上通过程序控制来动态添加工具条和状态条的实现过程和方法。

一、引言对于不需要文档/视图结构支持的程序一般都采用对话框做为程序的基础框架。

虽然在对话框程序上可以通过修改其属性来添加系统菜单,但对比SDI和MDI程序的工具条和状态栏未免使界面显得简单、单调。

虽然在Visual Basic 中提供有独立的工具条和状态栏标准控件可以直接在对话框上使用,但Visual C++ 6.0所提供的26种基本Windows标准控件却没有将它们包含其中。

因此要在对话框程序中实现工具条和状态栏只能通过编程来动态实现。

二、工具条的实现过程MFC对于工具条和状态栏分别提供了CToolBar和CStatusBar两个基本类库,但由于在实现时MFC 对其做了过多的封装,以至无法了解内部的一些核心技术。

因此本文在实现过程中放弃了相对比较方便的CToolBar和CStatusBar类的使用,而是通过SDK(Software Developers Kit,软件开发工具箱)式的WinAPI 应用程序接口来实现的。

在API函数中经常需要用到对话框的窗口句柄和当前的实例句柄,在SDK程序设计中以上两个句柄可以直接从入口函数WinMain()中引出,而在MFC下也对其做了封装,不能直接获取。

但MFC也为其留有接口:CWnd窗口类提供的GetSafeHwnd()可以返回对话框的窗口句柄;函数AfxGetInstanceHandle()则可以获取当前应用程序的实例句柄。

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

目前,很多基于对话框的应用程序中对话框都是不带框架的,也就是说对话框没有标题栏。

众所周知,窗口的移动都是通过鼠标拖动窗口的标题栏来实现的,那么现在应用程序中的对话框没有了标题栏,用户如何移动对话框呢?本实例针对这个问题提出解决的办法。

一、实现方法
解决无标题栏窗口的拖动问题有两种方案,一种方案是使用常规思路来处理鼠标拖拽事件,当窗口获得WM_LBUTTONDOWN (OnLButtonDown)时,通过设置标志并调用CWnd::SetCapture ()函数来让当前窗口捕捉鼠标消息,应用程序进入移动模式,此时只要有WM_MOUSEMOVE消息过来,就可以据此移动框架窗口,最后当用户释放鼠标按钮,则WM_LBUTTONUP消息处理例程清除标志并调用CWnd::ReleaseCapture()函数将鼠标控制返还给Windows。

这种方法比较繁琐,首先要决定窗口准备移到哪?然后要想好如何重绘窗口等等,而且根据屏幕显示属性对话框"效果"页中"视觉效果"项的"拖动时显示窗口中内容"复选框是不是选中,拖动效果是不同的。

那么你怎么知道设置的信息呢?方法是调用SystemParametersInfo(SPI_GETDRAGFULLWINDOWS)。

Windows要程序员来事无巨细地处理这些繁琐的事情真是太糟了。

由于Windows本身知道通过鼠标点住标题栏可以移动窗口,那
么能不能将鼠标在窗口客户区任何地方的点击拖动行为都模仿成好像是在标题栏中一样呢?答案是肯定的,这样就产生了第二种拖动窗口移动的方法。

实际上,用鼠标点住对话框背景进行拖动操作并不难,但是你必须了解在标题栏里拖动窗口的原理。

Windows首先确定鼠标点中了哪个窗口,然后向那个窗口发送一个WM_NCHITTEST消息找出此窗口的哪个"非客户区"(如边界、最大化/最小化按钮、菜单、标题等等)拥有鼠标光标。

接着默认的窗口过程响应消息并返回一个特定的代码。

如果鼠标指针落在标题栏中,那么这个特定代码就是HTCAPTION,此时Windows便进入拖拽模式,以便用户能够对窗口进行移动操作。

所以要想在客户区里用鼠标拖动对话框,那么只要在客户区里模仿标题栏里的鼠标拖动行为即可。

下面的代码通过处理WM_NCHITTEST消息实现了对话框的拖动操作:
UINT CMyDialog::OnNcHitTest(CPoint pt)
{
CRect rc;
GetClientRect(&rc);
ClientToScreen(&rc);
return rc.PtInRect(pt) ? HTCAPTION : CDialog::OnNcHitTest(pt); }
上面这个代码很容易理解,当鼠标落在客户区内,函数返回
HTCAPTION。

对于一个简单的对话框来说,仅仅用这个代码就完全可以实现在对话框背景内的拖动操作。

因为Windows使用z-order 坐标来确定鼠标下是哪个窗口,所以对话框中其它的所有对象照常工作。

如果用户单击某个控制,只要这个控制不是静态位图图像或者文本,那么Windows都将鼠标事件发送到该控制上,而不是对话框。

由于静态位图图像或者文本对于对话框是透明的,所以鼠标在上面的拖动同样实现移动,而对于对话框中的编辑框、按钮、组合框等其它非静态控制则按通常的行为方式运行。

如果应用不是一个纯粹的对话框程序,而是是包含CFormView 或其它非对话框视图,处理方法几乎是一样的,只需在视图代码中做一点小小的改动即可,因为Windows在发送WM_NCHITTEST消息时,是将它发送到鼠标光标下的框架/视图最顶层非透明窗口,由于视图首先获得WM_NCHITTEST消息。

所以只要在视图的WM_NCHITTEST消息处理例程中返回HTTRANSPARENT,让视图对鼠标点击"透明"即可。

注意是在视图中,而不是在框架中加入下面代码:
UINT CMyView::OnNcHitTest(CPoint pt)
{
return HTTRANSPARENT;
}
这样做以后,Windows将忽略视图并继续搜索能接收WM_NCHITTEST的窗口。

如果顺利的话,将找到父窗口,这时用与对话框相同的WM_NCHITTEST处理代码即可,即在客户区中的点击返回HTCAPTION。

你甚至可以通过鼠标坐标的象素计算,在规定的局部范围内实现视图透明。

二、编程步骤
1、启动Visual C++6.0,生成一个基于对话框的应用程序,将该程序命名为"DragMovDlg";
2、将程序中对话框的Style设置为"PopUp",Border设置为"None";
3、使用Class Wizard为对话框添加WM_NCHITTEST消息响应处理函数;
4、添加代码,编译运行程序。

这是我在网上查到的,拿出来跟大家分享。

这里我也有一个问题,就是用第二个方法我第一次拖动窗口了以后停
下来,然后再想拖动的时候就拖不了了,不得其解,不知道各位有没有主意,还请多多指教。

相关文档
最新文档