关于WM_NCACTIVATE消息

转自:http://blog.csdn.net/commandos/article/details/1904558

  case  Win32.WM_NCACTIVATE:
                    
if  (m.WParam  ==  (IntPtr)Win32.WM_FALSE)
                    
{                         
                        m.Result 
= (IntPtr)Win32.WM_TRUE;
                    }

                    
return ;

WM_NCACTIVATE消息。

 base.WndProc(ref m)负责画窗体被激活或者没有被激活时的样子,

自己重画窗体非客户区域之后,就不能再调用base.WndProc(ref m)了。否则窗体又会被重新画成原来的样子。

一开始使用

                 case  Win32.WM_NCACTIVATE:
                   
return ;

问题来了。发现这个窗体成了“霸王”窗口,没法激活其他的窗体了。

原因就在这个消息的返回值上。

if  (m.WParam  ==  (IntPtr)Win32.WM_FALSE)
 
{                         
        m.Result 
= (IntPtr)Win32.WM_TRUE;
  }


当WM_NCACTIVATE消息的wParam参数为true 时表示窗体被激活,为false 时表示窗体改为未被激活的状态,这个时候。消息的返回值。为true 表示允许激活它的窗体,为false 表示不允许激活其他的窗体


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
消息,就是指Windows发出的一个通知,告诉应用程序某个事情发生了。例如,单击鼠标、改变窗口尺寸、按下键盘上的一个键都会使Windows发送一个消息给应用程序。 消息本身是作为一个记录传递给应用程序的,这个记录中包含了消息的类型以及其他信息。例如,对于单击鼠标所产生的消息来说,这个记录中包含了单击鼠标时的坐标。这个记录类型叫做TMsg,它在Windows单元中是这样声明的: type TMsg = packed record hwnd: HWND; //窗口句柄 message: UINT;//消息常量标识符 wParam: WPARAM ;// 32位消息的特定附加信息 lParam: LPARAM ;// 32位消息的特定附加信息 time: DWORD;//消息创建时的时间 pt: TPoint; //消息创建时的鼠标位置 end ; 消息中有什么? 是否觉得一个消息记录中的信息像希腊语一样?如果是这样,那么看一看下面的解释:hwnd 32位的窗口句柄。窗口可以是任何类型的屏幕对象,因为Win32能够维护大多数可 视对象的句柄(窗口、对话框、按钮、编辑框等)。message 用于区别其他消息的常量值,这些常量可以是Windows单元中预定义的常量,也 可以是自定义的常量。 wParam 通常是一个与消息有关的常量值,也可能是窗口或控件的句柄。 lParam 通常是一个指向内存中数据的指针。由于WParam、lParam和Pointer都是32位的,因此,它们之间可以相互转换。 WM_NULL =$0000 // WM_CREATE =$0001 //应用程序创建一个窗口 WM_DESTROY = $0002 //一个窗口被销毁 WM_MOVE = $0003 //移动一个窗口 WM_SIZE= $0005 //改变一个窗口的大小 WM_ACTIVATE= $0006 //一个窗口被激活或失去激活状态; WM_SETFOCUS= $0007 //获得焦点后 WM_KILLFOCUS= $0008 //失去焦点 WM_ENABLE= $000A //改变enable状态 WM_SETREDRAW= $000B //设置窗口是否能重画 WM_SETTEXT= $000C //应用程序发送此消息来设置一个窗口的文本 WM_GETTEXT = $000D //应用程序发送此消息来复制对应窗口的文本到缓冲区 WM_GETTEXTLENGTH = $000E //得到与一个窗口有关的文本的长度(不包含空字符) WM_PAINT = $000F //要求一个窗口重画自己 WM_CLOSE = $0010 //当一个窗口或应用程序要关闭时发送一个信号 WM_QUERYENDSESSION= $0011 //当用户选择结束对话框或程序自己调用ExitWindows函数 WM_QUIT= $0012 //用来结束程序运行或当程序调用postquitmessage函数 WM_QUERYOPEN = $0013 //当用户窗口恢复以前的大小位置时,把此消息发送给某个图标 WM_ERASEBKGND = $0014 //当窗口背景必须被擦除时(例在窗口改变大小时) WM_SYSCOLORCHANGE = $0015 //当系统颜色改变时,发送此消息给所有顶级窗口 WM_ENDSESSION = $0016 // 当系统进程发出WM_QUERYENDSESSION消息后,此消息发送给应用程序,通知它对话是否结束 WM_SYSTEMERROR = $0017 // WM_SHOWWINDOW= $0018 //当隐藏或显示窗口是发送此消息给这个窗口 WM_ACTIVATEAPP = $001C //发此消息给应用程序哪个窗口是激活的,哪个是非激活的; WM_FONTCHANGE= $001D //当系统的字体资源库变化时发送此消息给所有顶级窗口 WM_TIMECHANGE= $001E //当系统的时间变化时发送此消息给所有顶级窗口 WM_CANCELMODE= $001F //发送此消息来取消某种正在进行的摸态(操作) WM_SETCURSOR = $0020 //如果鼠标引起光标在某个窗口中移动且鼠标输入没有被捕获时,就发消息给某个窗口 WM_MOUSEACTIVATE = $0021 //当光标在某个非激活的窗口中而用户正按着鼠标的某个键发送此消息给当前窗口 WM_CHILDACTIVATE = $0022 //发送此消息给MDI子窗口当用户点击此窗口的标题栏,或当窗口被激活,移动,改变大小 WM_QUEUESYNC= $0023 //此消息由基
在Duilib中,我们可以使用按钮控件(CButtonUI)来实现一个按住就变化的按钮。具体实现步骤如下: 1. 创建一个CButtonUI控件,并设置它的普通状态和按下状态的背景图片。 ```cpp <Control name="btnChange" class="ButtonUI" pos="100, 100, 100, 40" normalimage="btn_normal.png" hotimage="btn_hot.png" pushedimage="btn_pushed.png" /> ``` 2. 在按钮控件的事件处理函数中,监听鼠标按下和松开事件。 ```cpp class CMyWnd : public CWindowWnd, public INotifyUI { public: virtual void Notify(TNotifyUI& msg) { if (msg.sType == _T("click")) { if (msg.pSender->GetName() == _T("btnChange")) { // do something } } else if (msg.sType == _T("mouseenter")) { if (msg.pSender->GetName() == _T("btnChange")) { msg.pSender->SetBkImage(_T("btn_hot.png")); } } else if (msg.sType == _T("mouseleave")) { if (msg.pSender->GetName() == _T("btnChange")) { msg.pSender->SetBkImage(_T("btn_normal.png")); } } } }; ``` 3. 在鼠标进入按钮控件和离开按钮控件时,更改按钮控件的背景图片。 ```cpp else if (msg.sType == _T("mouseenter")) { if (msg.pSender->GetName() == _T("btnChange")) { msg.pSender->SetBkImage(_T("btn_hot.png")); } } else if (msg.sType == _T("mouseleave")) { if (msg.pSender->GetName() == _T("btnChange")) { msg.pSender->SetBkImage(_T("btn_normal.png")); } } ``` 完整代码示例: ```cpp #include <Windows.h> #include <stdio.h> #include "UIlib.h" using namespace DuiLib; class CMyWnd : public CWindowWnd, public INotifyUI { public: virtual LPCTSTR GetWindowClassName() const { return _T("DUIMainFrame"); } virtual CDuiString GetSkinFile() { return _T("test.xml"); } virtual CDuiString GetSkinFolder() { return _T(""); } virtual void Notify(TNotifyUI& msg) { if (msg.sType == _T("click")) { if (msg.pSender->GetName() == _T("btnChange")) { // do something } } else if (msg.sType == _T("mouseenter")) { if (msg.pSender->GetName() == _T("btnChange")) { msg.pSender->SetBkImage(_T("btn_hot.png")); } } else if (msg.sType == _T("mouseleave")) { if (msg.pSender->GetName() == _T("btnChange")) { msg.pSender->SetBkImage(_T("btn_normal.png")); } } } virtual LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) { LRESULT lRes = 0; BOOL bHandled = TRUE; if (uMsg == WM_CREATE) { m_PaintManager.Init(m_hWnd); CDialogBuilder builder; CControlUI* pRoot = builder.Create(_T("test.xml"), (UINT)0, NULL, &m_PaintManager); ASSERT(pRoot && "Failed to parse XML"); m_PaintManager.AttachDialog(pRoot); m_PaintManager.AddNotifier(this); return lRes; } else if (uMsg == WM_NCACTIVATE) { if (!::IsIconic(*this)) { return (wParam == 0) ? TRUE : FALSE; } } if (m_PaintManager.MessageHandler(uMsg, wParam, lParam, lRes)) bHandled = TRUE; if (!bHandled) return CWindowWnd::HandleMessage(uMsg, wParam, lParam); return lRes; } protected: CPaintManagerUI m_PaintManager; }; int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/, LPSTR /*lpCmdLine*/, int nCmdShow) { HRESULT Hr = ::CoInitialize(NULL); if (FAILED(Hr)) return 0; CMyWnd* pFrame = new CMyWnd(); if (pFrame == NULL) return 0; pFrame->Create(NULL, _T("Duilib Test"), UI_WNDSTYLE_FRAME, WS_EX_WINDOWEDGE); pFrame->CenterWindow(); pFrame->ShowWindow(true); CPaintManagerUI::MessageLoop(); ::CoUninitialize(); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值