2015-05-26 08:25
⁄ 工业·编程
⁄ 共 3727字
在Qt中,键盘事件和QWidget的focus密不可分:一般来说,一个拥有焦点(focus)的QWidget或者grabKeyboard()的QWidget才可以接受键盘事件。
键盘事件派发给谁?
如何确定谁来接收键盘事件,不妨看一点点QApplication的源码:
X11下
QETWidget *keywidget=0;
bool grabbed=false;
if (event->type==XKeyPress || event->type==XKeyRelease) {
keywidget = (QETWidget*)QWidget::keyboardGrabber();
...
QWidget, 消息机制阅读全文
2015-05-13 07:02
⁄ 工业·编程
⁄ 共 3797字
本文旨在说明:QDialog::exec()、QMenu::exec()等开启的局部事件循环,易用的背后,还有很多的陷阱...
引子
Qt 是事件驱动的,基本上,每一个Qt程序我们都会通过QCoreApplication或其派生类的exec()函数来开启事件循环(QEventLoop):
int main(int argc, char**argv)
{
QApplication a(argc, argv);
return a.exec();
}
但是在同一个线程内,我们可以开启多个事件循环,比如通过:
QDialog::exec()
QDrag::exec(...
Qt, 消息机制阅读全文
2015-01-17 23:13
⁄ 工业·编程
⁄ 共 762字
以前我一直以为:在父widget上摆一个子widget后,当click子widget时:只会进入到子widget的相关事件处理函数中,比如进入到mousePressEvent()中, 而不会进入到父widget的对应事件处理函数中。毕竟:click的是子widget,其遮挡住了父widget,从而父widget接收不到这个事件。然而事实真的是这个样子吗?
我做了一个测试: 在一个QWidget上建了一个QLabel。而后实现父QWidget的mousePressEvent(), 然后...
Qt, 消息机制阅读全文
2014-11-27 19:56
⁄ 工业·编程
⁄ 共 1784字
WTL消息循环机制实现了消息过滤和空闲处理机制。
消息过滤
首先看一下CMessageLoop的核心逻辑CMessageLoop.Run()的代码:
int Run()
{
BOOL bDoIdle = TRUE;
int nIdleCount = 0;
BOOL bRet;
for(;;)
{
while(bDoIdle && !::PeekMessage(&m_msg, NULL, 0, 0, PM_NOREMOVE))
{
...
WTL, 消息机制阅读全文
2014-07-01 06:29
⁄ 工业·编程
⁄ 共 863字
其实无论在子线程还是主线程中,设置的钩子都是一样的。但是,如果只是像在主线程中那样调用完SetWindowsHookEx函数就以为没事了,那你有可能什么也钩不到。如果你设置的是鼠标钩子,你还会看到鼠标反应迟顿。这是为什么呢?
前些日子我就遇到过这事,在网上搜了半天也没找到解决方案。无奈,自己仔细研究,找到原因了,非常简单,与大家分享。
答案就是,调用完SetWindowsHookEx后,子线程中要启动消息泵,不能Sleep在那里,也...
Hook, 消息机制阅读全文
2014-07-01 06:25
⁄ 工业·编程
⁄ 共 1214字
在Windows应用程序开发中,有很多地方使用了回调函数。一般的开发并不关心谁来调用这些函数,但如果开发复杂的多线程协作处理程序,或者研究操作系统中程序的“操作权限”问题,您就需要知道您写的这段代码是由谁来调用的,在哪个线程或进程中执行的。
最常见的就是Windows消息响应函数。一般的书本并不讨论这些函数是如何被调用的,只是说消息产生时,这些函数将会执行。初学者也许会以为,如果两个消息一起发出,那么它们的响应...
回调函数, 消息机制阅读全文
2012-11-25 06:53
⁄ 工业·编程
⁄ 共 10935字
用过C++进行过面向对象程序设计的用户都知道,程序中的对象很少单独存在。不考虑对象间的相互作用几乎是不可能的。所以,标识对象间的关系或建立对象间的消息连接是面向对象程序设计的一项重要任务。本文着重从C++程序设计的角度,提出一种建立对象间消息连接的实用方法。如果你想详细了解面向对象程序设计技术,请参阅有关专著。
大家都知道对象是数据和方法的封装体。在C++中,...
消息机制阅读全文
2012-10-10 20:38
⁄ 工业·编程
⁄ 共 200字
windows程序开发主要是基于事件和消息。
消息是windows操作系统底层支持的,在windows sdk的开发中,涉及消息循环的处理函数。而事件是基于消息的,是消息到达后触发的(虽然不够严谨)。
消息发送给操作系统,让操作系统处理消息处理函数,而事件触发时程序立刻调用事件处理函数。
激活方式上来区别,消息是由客户操作产生给服务器,而事...
消息机制阅读全文
2012-09-09 22:10
⁄ 工业·编程
⁄ 共 3260字
WINDOWS中进程间通讯的方式很多,如:消息机制,共享内存机制,SOCKET,COM,RPC等等, 需要时可以根据具体情况来选择使用的方式。 我在这本文中仅介绍进程间的自定义消息通讯机制。 1,WINDOWS中自定义消息的定义和使用; 在WNDOWS中消息分系统消息和自定义消息。 系统消息定义从0到0x3FF,使用0x400到0x7FFF定义自己的消息。 Windows把0x400定义为WM_USER。如果想定义自己的一个消息,可以在WM_USER上加上 ...
消息机制阅读全文
2012-09-09 22:05
⁄ 工业·编程
⁄ 共 829字
1. 代码控制tab切换
m_tab.SetCurSel(1);
NMHDR h; h.code = TCN_SELCHANGE; h.idFrom = IDC_TABCTRL; h.hwndFrom = m_tab.m_hWnd; // tab控件的句柄
::SendMessage(m_hWnd, WM_NOTIFY, (WPARAM)IDC_TABCTRL, (LPARAM)&h);
// m_hWnd为包含tab控件的对话框
2. treectrl选项切换
NMTREEVIEW tv; memset((void*)&tv,0,sizeof(tv)); tv.hdr.hwndFrom = m_hWnd; tv.hdr.idFrom = ::GetCl...
消息机制阅读全文