windows系统 默认的对话框可以随意移动,没有标题栏的对话框需要重载消息来实现。
在使用 WM_NCHITTEST消息时,注意此消息是捕获鼠标的所有移动信息,当还需要增加右键消息处理函数时,消息将会被OnNcHitTest()捕获
直接代码,记住使用套路,其中函数的使用、消息的使用,可以查看MSDN,这里不在赘述。
UINT CClockTestDlg::OnNcHitTest(CPoint point)
{ // 直接在OnNcHitTest中虚拟发送HTCAPTION消息
// TODO: Add your message handler code here and/or call default
CRect rect;
GetClientRect(rect);
ClientToScreen(rect);
if(rect.PtInRect(point))
{
return HTCAPTION;
}
return CDialog::OnNcHitTest(point);
}
在文档中
UINT CMainFrame::OnNcHitTest(CPoint point)
{ // 直接在OnNcHitTest中虚拟发送HTCAPTION消息
RECT rectWindows, rectClient;
this->GetWindowRect(&rectWindows);
this->GetClientRect(&rectClient);
if (point.y > rectWindows.top && point.y < rectWindows.top + 25)
{
return HTCAPTION;//标题栏形式
}
else
{
return CFrameWnd::OnNcHitTest(point);
}
}
UINT CClockTestDlg::OnNcHitTest(CPoint point)
{ // 直接在OnNcHitTest中虚拟发送HTCAPTION消息
// TODO: Add your message handler code here and/or call default
UINT uRet = CDialog::OnNcHitTest(point);
if (HTCLIENT == uRet)
{
return HTCAPTION;
}
return uRet;
}
void CClockTestDlg::OnLButtonDown(UINT nFlags, CPoint point)
{ // 方法二:直接在OnLButtonDown中虚拟发送WM_NCLBUTTONDOWN,HTCAPTION消息
// TODO: Add your message handler code here and/or call default
PostMessage(WM_NCLBUTTONDOWN,HTCAPTION,MAKELPARAM(point.x,point.y));
CDialog::OnLButtonDown(nFlags, point);
}
void CClockTestDlg::OnLButtonDown(UINT nFlags, CPoint point)
{ // 方法二:直接在OnLButtonDown中虚拟发送WM_NCLBUTTONDOWN,HTCAPTION消息
// TODO: Add your message handler code here and/or call default
PostMessage(WM_NCLBUTTONDOWN,HTCAPTION,SendMessage(WM_SYSCOMMAND,SC_MOVE|HTCAPTION,0));
CDialog::OnLButtonDown(nFlags, point);
}
void CClockTestDlg::OnMouseMove(UINT nFlags, CPoint point)
{ // 通过在OnMouseMove中手动进行处理
// TODO: Add your message handler code here and/or call default
static CPoint PrePoint = CPoint(0, 0);
if(MK_LBUTTON == nFlags)
{
if(point != PrePoint)
{
CPoint ptTemp = point - PrePoint;
CRect rcWindow;
GetWindowRect(&rcWindow);
rcWindow.OffsetRect(ptTemp.x, ptTemp.y);
MoveWindow(&rcWindow);
return ;
}
}
PrePoint = point;
CDialog::OnMouseMove(nFlags, point);
}
==================================================================================================
任务栏点击右键
默认窗口系统提供右键菜单,去掉标题栏,在任务栏点击右键的方法:增加系统的默认关闭,最大化,最小化
BOOL XXXXX::OnInitDialog()
{
...
ModifyStyle(0,WS_SYSMENU|WS_MAXIMIZEBOX|WS_MINIMIZEBOX);
...
}