如何按非客户区移动窗体

看到一介绍如何按非客户区移动窗体,既重载WM_NCHITTEST,返回HTCAPTION。但我认为有一点不妥就是没有了鼠标右键功能。这里我介绍一种方法,即可已在客户区移动窗体又可以实现鼠标右键功能。

1、新建一工程DLG。采用默认设置。

2、添加消息处理函数:

void CDlgDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
  PostMessage(WM_NCLBUTTONDOWN,HTCAPTION,MAKELPARAM(point.x,pointy));
  CDialog::OnLButtonDown(nFlags, point);
}

3、添加右键功能。已实现鼠标右键功能

void CDlgDlg::OnRButtonDown(UINT nFlags, CPoint point)
{
  CMenu menu,*sub;
  menu.LoadMenu(IDR_MENU1);
  sub=menu.GetSubMenu(0);
  ClientToScreen(&point);
  sub->TrackPopupMenu(TPM_RIGHTBUTTON,point.x,point.y,this);
  CDialog::OnRButtonDown(nFlags, point);
}

其它实现细节请参见源代码。

本文配套源码

时间: 2024-09-24 06:14:33

如何按非客户区移动窗体的相关文章

VC 窗体非客户区的绘制

VC 窗体非客户区的绘制 OnNcPaint(UINT message, WPARAM wParam, LPARAM lParam) . void CSkinAndLangDlg::OnNcPaint(UINT message, WPARAM wParam, LPARAM lParam) { HDC WindowDC = ::GetWindowDC(m_hWnd); // //取得整个窗体矩形 RECT WindowRect; GetWindowRect(&WindowRect); Offset

修改窗体非客户区大小更改窗体标题栏高度

想修改窗体的非客户区,首先就得明白为什么要修改非客户区,什么是非客户区 从窗体或控件来看,非客户区就是无法放置控件的区域,比如窗体的标题栏,和边框,菜单栏也是非客户区,菜单栏不是控件是画上去的 文本框的边框,滚动条区域都是非客户区 为什么要修改非客户区呢?? 原因是为了自绘,让边框好看一些,比如要加高窗体标题栏,就需要改非客户区,自绘非客户区会响应 WM_NCPAINT消息 在这个消息里,你可以进行窗体,控件,非客户区的自绘 好啦,现在转入正题,要修改非客户大小,必须处理 WM_NCCALCSI

wpf 能不能直接在非客户区绘图

问题描述 如题,非客户区,除了Hook,能不能通过drawvisual绘制?还有,现在我用了Hook,用c++写的,用了双缓冲,BitBlt直接拷贝的,但是调整窗体大小时会闪烁,换成gdiplus会好很多,调整过于平凡也会偶尔闪烁.还有没有别的解决办法? 解决方案 解决方案二:非客户区难不成不是值的标题栏?边框?

界面-求助:mfc非客户区自绘请求高手指点,不知道该怎么做

问题描述 求助:mfc非客户区自绘请求高手指点,不知道该怎么做 50C 想美化一下界面,查资料说要重绘非客户区,看的晕头转向,麻烦高手给指点一下思路,最好有代码可以参考一下 解决方案 WM_NCPAINT这个就是重绘飞客户区的消息,响应在这个消息在里面绘图就好了. 解决方案二: http://blog.csdn.net/faihtua/article/details/8082264 解决方案三: 参考:VC 轻松实现非客户区按钮http://blog.csdn.net/testcs_dn/art

轻松实现非客户区按钮

一.简介 有时我们需要在非客户区(例如:标题栏)添加按钮,并对按钮作出响应,如下图所示: 为此我封装了两个类CNCButton和CNCButtonManager,CNCButton主要用于按钮绘制,CNCButtonManager用于按钮的管理并对非客户区的消息进行处理.如下是几个主要的非客户区消息: WM_NCHITTEST WM_NCACTIVATE WM_NCPAINT

c++-MFC非客户区的刷新及防闪烁问题

问题描述 MFC非客户区的刷新及防闪烁问题 弄重绘标题栏的时候遇到了问题.. 按钮贴图什么的都好了.但是在标题栏写"菜单"项的时候遇到了刷新的问题. "菜单"项我是用pDC->DrawText()写上去的("菜单"是两个字而不是按钮啥的). 希望的效果是实时追踪鼠标的位置,若鼠标指在"菜单"所在矩形区域时就把俩字变色显示 于是我就先把之前写的字覆盖掉再重新写 但是这样就出现闪烁了.. 各位有没有好办法解决一下.. 解决方

VC 轻松实现非客户区按钮

源代码下载 一.简介 有时我们需要在非客户区(例如:标题栏)添加按钮,并对按钮作出响应,如下图所示: 为此我封装了两个类CNCButton和CNCButtonManager,CNCButton主要用于按钮绘制,CNCButtonManager用于按钮的管理并对非客户区的消息进行处理.如下是几个主要的非客户区消息: WM_NCHITTEST WM_NCACTIVATE WM_NCPAINT 二.使用 2.1 首先我们需要引用两个类的头文件 #include"NCButtonManager.h&qu

VC 窗体非客户区的绘制 OnNcPaint(UINT message, WPARAM wParam, LPARAM lParam)

void CSkinAndLangDlg::OnNcPaint(UINT message, WPARAM wParam, LPARAM lParam) { HDC WindowDC = ::GetWindowDC(m_hWnd); // //取得整个窗体矩形 RECT WindowRect; GetWindowRect(&WindowRect); OffsetRect(&WindowRect, -WindowRect.left, - WindowRect.top); // //取得客户区矩

用C#实现在客户区拖动窗体

当你设计一个应用程序时,或许你希望用户能够通过客户区来拖动窗体,比如:当窗体没有标题栏或创建的是不规则的窗体时,就只有通过客户区来拖动窗体了. 一个发生在我们身边很好的例子就是Microsoft Windows Media Player.Media Player有项功能是根据用户的爱好可以随意换掉外观(换肤),这个时候标题栏就隐藏了,但是你能够通过客户区来拖动窗体. 好了,言归正传,开始我们的旅程吧 首先必须了解Windows的消息传递机制,当有鼠标活动消息时,系统发送WM_NCHITTEST