非客户区的CAPTION:才能移动窗体
如果客户区要模拟非客户区 需要欺骗窗体,告诉窗体当前的点击是在非客户区,只有非客户才能做窗体调整,和移动窗体
SendMessage(WM_NCLBUTTONDBCLICK, HTCAPTION,0 ) 双击
SendMessage(WM_NCLBUTTONDOWN, HTCAPTION,0 ) 移动
CWnd::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 在最大化按钮上。
参数: point 包含了光标的x轴和y轴坐标。这些坐标总是用屏幕坐标给出的。
说明:
每当鼠标移动时,框架就为包含光标(或者是用SetCapture成员函数捕获了鼠标输入的CWnd对象)的CWnd对象调用这个成员函数。
注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现,则该实现将使用最初传递给消息的参数(而不是你提供给这个函数的参数)。
举例:
比如果应用程序自己绘制的界面没有标题栏,那我们怎么来拖动程序呢?那么就可以添加下面消息:
UINT CMainWindow::OnNcHitTest (CPoint point)
{
UINT nHitTest = CFrameWnd::OnNcHitTest (point);
if (nHitTest == HTCLIENT) //如果是客户区
nHitTest = HTCAPTION; //则把它当成标题栏
return nHitTest;
}
经过上面处理后,如果用户拖动程序的客户区的话,系统会以为你拖动的是栏题栏,从而实现程序拖动
请参阅:CWnd::GetCapture, WM_NCHITTEST
duilib里面的函数:
LRESULT WindowImplBase::OnNcHitTest(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { POINT pt; pt.x = GET_X_LPARAM(lParam); pt.y = GET_Y_LPARAM(lParam); ::ScreenToClient(*this, &pt); RECT rcClient; ::GetClientRect(*this, &rcClient); if( !::IsZoomed(*this) ) { RECT rcSizeBox = m_PaintManager.GetSizeBox(); if( pt.y < rcClient.top + rcSizeBox.top ) { if( pt.x < rcClient.left + rcSizeBox.left ) return HTTOPLEFT; if( pt.x > rcClient.right - rcSizeBox.right ) return HTTOPRIGHT; return HTTOP; } else if( pt.y > rcClient.bottom - rcSizeBox.bottom ) { if( pt.x < rcClient.left + rcSizeBox.left ) return HTBOTTOMLEFT; if( pt.x > rcClient.right - rcSizeBox.right ) return HTBOTTOMRIGHT; return HTBOTTOM; } if( pt.x < rcClient.left + rcSizeBox.left ) return HTLEFT; if( pt.x > rcClient.right - rcSizeBox.right ) return HTRIGHT; } RECT rcCaption = m_PaintManager.GetCaptionRect(); if( pt.x >= rcClient.left + rcCaption.left && pt.x < rcClient.right - rcCaption.right \ && pt.y >= rcCaption.top && pt.y < rcCaption.bottom ) { CControlUI* pControl = static_cast<CControlUI*>(m_PaintManager.FindControl(pt)); if( pControl && _tcsicmp(pControl->GetClass(), _T("ButtonUI")) != 0 && _tcsicmp(pControl->GetClass(), _T("OptionUI")) != 0 && _tcsicmp(pControl->GetClass(), _T("TextUI")) != 0 ) return HTCAPTION; } return HTCLIENT; }
客户区模拟非客户区 要重载的关于非客户的代码
LRESULT OnNcActivate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnNcCalcSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnNcPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnNcHitTest(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
CWnd中createex方法中
调用precreatex方法 其中里面是在 CREATESTRUCT ex 并且注册
相关推荐
`AdjustWindowRect`函数的主要功能是根据所需客户区矩形的大小,计算出包括非客户区在内的完整窗口所需的矩形大小。这对于确保窗口创建时包含边框、标题栏和其他非客户区域是非常重要的。函数原型如下: ```cpp ...
7. **客户区**:窗口分为非客户区(如标题栏、边框)和客户区,客户区是用户与应用程序交互的主要区域。在无标题栏窗口中,整个窗口都成为客户区,因此用户可以在任何地方点击并移动窗口。 8. **事件驱动编程**:...
1. WM_NCLBUTTONDOWN:当鼠标在非客户区按下时,操作系统会发送这个消息。在这个消息处理中,我们需要记录下鼠标的当前位置,作为拖放的起始点。 2. WM_NCLBUTTONUP:当鼠标在非客户区释放时,操作系统发送此消息。...
4. **窗口风格和非客户区**:了解WS_CAPTION风格和其他窗口风格,以及如何处理非客户区绘图。 5. **鼠标事件处理**:学会处理鼠标消息,实现窗口拖动和按钮响应。 总的来说,这个简易的标题栏自绘程序提供了一个...
通常,我们会在WM_NCPAINT消息中进行自绘操作,这个消息在非客户区需要绘制时被发送。 下面我们将深入探讨这个过程: 1. **创建自定义对话框类**: 首先,你需要创建一个继承自CDialog或CFrameWnd的自定义类,...
通过定义窗口过程(WndProc),我们可以处理特定的消息,如WM_NCCALCSIZE用于计算非客户区大小,WM_NCPAINT用于绘制非客户区,甚至可以通过处理WM_PAINT消息来自定义窗口的外观。 在提供的文件列表中,`apiuse.exe`...
要改变标题文字的对齐方式,我们需要自定义窗体的非客户区(Non-client area)处理。 Delphi提供了`WM_NCCALCSIZE`消息,这个消息在窗体调整大小时被发送,允许我们定制非客户区的布局。我们可以重写`WndProc`方法...
需要特别指出的是,SetWindowRgn()所指定的区域是针对整个窗口的,而Bitblt()/ StretchBlt()的输出区域是针对于客户区,两者在定位上是不同的,编程中应加以注意并灵活应用,这也是前面之所以设置边框大小等...
需要重载`WndProc`函数,处理如`WM_NCHITTEST`(检测鼠标点击位置)、`WM_NCLBUTTONDOWN`(非客户区鼠标左键按下)等消息,以便实现拖动和边界调整。 3. **阴影效果的实现**: - Windows Vista及更高版本引入了 ...
- `WM_NCLBUTTONDOWN` 表示鼠标左键在非客户区按下。 - 我们创建了一个模拟的`WM_NCLBUTTONDOWN`消息,并将其发送给窗口,这里设置`wParam`为`HT_CAPTION`,表示点击的是标题栏区域,这样就可以模拟出点击标题栏的...
- **非客户区绘制**:为了实现Windows XP风格的标题栏,开发者需要重写窗口过程`WndProc`,处理`WM_NCPAINT`消息,进行非客户区的自定义绘制。这包括标题栏的背景、边框以及按钮的绘制。 - **主题支持**:Windows ...
5. 处理WM_NCPAINT消息:如果你希望完全控制非客户区(包括标题栏)的绘制,还需要重写OnNcPaint()函数,并处理WM_NCPAINT消息。 ```cpp afx_msg void CDlgApp::OnNcPaint() { CRect rect; GetWindowRect(&rect);...
这通常涉及到对窗口的消息处理,尤其是`WM_NCPAINT`消息,该消息在非客户区(即除了窗口客户区之外的部分)需要绘制时被发送。你可以重载`OnNcPaint`函数,并使用GDI或GDI+库进行自定义绘图,例如画出半透明的发光...
- 接着,删除边框和标题栏等非客户区样式,可以通过`ModifyStyle`函数实现,如`ModifyStyle(WS_CAPTION | WS_THICKFRAME, 0)`。 - 然后,调整窗口大小以填充整个屏幕。可以使用`ScreenToClient`将屏幕坐标转换为...
你可能还需要处理WM_NCPAINT消息,以绘制非客户区(包括标题栏)。 4. **处理标题栏按钮**:自定义标题栏通常需要包含最小化、最大化和关闭按钮。这些可以通过自绘实现,或者利用第三方库如`CustomDrawNcCtrl`。你...
例如,WM_NCHITTEST消息是当鼠标在非客户区(即非窗口内容区)移动时发送的,用来确定鼠标位置对应的操作,如拖动窗口、调整大小等。而WM_MOUSEMOVE消息则是在鼠标移动时发送,用于捕捉鼠标的实时位置。 实现无边框...
- 要实现无边框全屏,我们需要重载`OnNcCalcSize`消息处理函数,使其返回FALSE,阻止系统自动计算非客户区大小。然后,我们需要处理`WM_GETMINMAXINFO`消息,设置窗口的最大和最小尺寸与屏幕尺寸相同,以防止窗口被...
`WM_NCPAINT`用于处理非客户区的绘制,而`WM_PAINT`则负责客户区的绘制。通过这两个消息,我们可以自定义窗口的外观,去掉标题栏并绘制自己的边框。 2. **无标题栏**: 在VC++中,去掉标题栏通常需要在窗口类样式...
- `Caption`属性设置窗体的标题,`ClientHeight`和`ClientWidth`表示窗体的客户区高度和宽度,`Height`和`Width`则包括非客户区(如标题栏和边框)在内的整体尺寸。 - `WindowState`属性控制窗体的状态,如正常(`...