| 无标题栏对话框的拖动 下载源代码 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。你甚至可以通过鼠标坐标的象素计算,在规定的局部范围内实现视图透明。 UINT CMyView::OnNcHitTest(CPoint pt){ return PointLiesWithinDraggableRegion(pt) ? HTTRANSPARENT : CView::OnNcHitTest(pt);} &nbs
|
0
顶一下



发表评论
告诉好友