在WTL中,CBitmapButton不支持带有透明层的图片,比如PNG。所以我自定义代码使用GDI+绘制PNG,命名为CPNGButton。但是在winXP上情况很奇怪。当按钮与其他窗口重叠时,按钮先接收WM_PAINT,然后再接收父级,导致结果不正确。--->我检查资源并从按钮的模板中删除WS_TABSTOP属性,一切正常,父窗口首先接收WM_PAINT,然后是按钮。是什么导致WS_TABSTOP影响窗口绘制顺序? 最佳答案 这是不绘制背景时发生的情况。这会在窗口中留下一个“洞”,您会看到您后面的任何窗口的像素。或者桌面,如果没
我在WTL中有一个GUI窗口,它在CMessageLoop实例内的线程内运行,该实例已添加到应用程序实例并运行。现在,在主GUI的按钮处理程序中,我创建了一个新窗口。单击该按钮并创建窗口并尝试将退出消息发布到主GUI循环后。代码:主窗口,有自己的线程:CMessageLooptheLoop;_MyppModule.AddMessageLoop(&theLoop);if(m_pMyDlg==NULL){m_pMyDlg=newCMyDlg();if(!IsWindow(*m_pMyDlg)){m_pMyDlg->Create(NULL);m_pMyDlg->ShowWindow(SW_S
我有一个自定义的WTL控件,它是一个带有列表和自定义滚动条的面板。classPanel:publicATL::CWindowImpl,publicWTL::CDoubleBufferImpl{public:DECLARE_WND_CLASS("Panel")BEGIN_MSG_MAP_EX(Panel)MSG_WM_CREATE(OnCreate)MSG_WM_DESTROY(OnDestroy)MSG_WM_SIZE(OnSize)CHAIN_MSG_MAP(CDoubleBufferImpl)REFLECT_NOTIFICATIONS()END_MSG_MAP()滚动条由面板在On
我有一个用ATL编写的基本应用程序,使用VS2008的向导。我在应用程序的左侧有一个TreeView。我看到了如何(痛苦地)添加树项目。问题是如何在鼠标右键单击时显示菜单?如何在可以选择的每个项目上捕获任何点击事件? 最佳答案 您应该检测到WM_CONTEXTMENUWindows消息specifyingahandlerinyourmessagemap.在处理程序中,您可以显示上下文菜单。然后,您还需要确保在从上下文菜单中选择命令时处理消息映射中的菜单命令。使用COMMAND_HANDLER这部分的消息映射中的宏。
WTL应用程序已经非常小了。但是,对于Win32配置,使用VS2005和WTL9.10的静态链接应用程序的重量为136kB(139,264字节)。查看可执行文件时,我注意到oleaut32.dll的静态导入。使用dumpbin粗略地看一下,显示了一个通过ordinal的导入。OLEAUT32.dll4181C0ImportAddressTable41C9B8ImportNameTable0timedatestamp0IndexoffirstforwarderreferenceOrdinal277检查oleaut32.dll发现导出名为VarUI4FromStr。深入研究IDA,我发现V
当我的WTLC++应用程序被激活或获得键盘焦点时,我需要确定先前激活/具有焦点的应用程序的窗口句柄。但是,WM_SETFOCUS和WM_ACTIVATE消息的窗口句柄(LPARAM)都是NULL(XP,32位)。当我的应用程序被激活时,如何确定刚刚失去焦点的应用程序?有没有一种简单的方法可以做到这一点,或者我需要滚动一个特殊的CBTHook? 最佳答案 要准确查看正在发送的消息及其参数的简单方法是启动Spy++并将其设置为记录消息,同时按Alt+Tab转到另一个窗口。与您发现的一致,WM_SETFOCUS和WM_ACTIVATE的l
我正在尝试理解WTL的工作方式,而消息循环现在让我感到困惑。例如这个代码片段:link首先创建窗口,然后启动消息泵。它是如何工作的?CreateEx、UpdateWindow等不应该发送它们自己的不可见消息,例如WM_CREATE/WM_PAINT/WM_NCPAINT吗?如果消息泵未初始化,它们会被扔到哪里?如果您创建一个窗口,启动消息循环,然后关闭该窗口,但又想在原处创建一个新窗口,会发生什么情况?PostQuit退出循环,你必须创建一个新循环? 最佳答案 了解发布消息(PostMessage)和发送消息(SendMessage
我有一个复杂的C++程序(老式Win32和WTL的混合体),它不响应任何任务栏平铺/级联请求(即右键单击任务栏并选择“CascadeWindows”或“Showwindowsideby边”)。当我使用spy++时,我发现我的窗口都没有收到任何窗口消息,而其他程序(在本例中为Firefox)收到一系列WM_GETMINMAXINFO、WM_SIZE、WM_PAINT...我的框架窗口的样式为WS_OVERLAPPEDWINDOW。在创建框架窗口之前,我创建了几个隐藏窗口。我已经在多个不同的操作系统上进行了测试,并且症状是相同的。Windowsshell向我的框架窗口发送消息是否有任何限制
我正在尝试学习WTL/Win32编程,我不太了解CIdleHandlermixin类的设计。对于WTL9.1,CMessageLoop代码如下(来自atlapp.h):for(;;){while(bDoIdle&&!::PeekMessage(&m_msg,NULL,0,0,PM_NOREMOVE)){if(!OnIdle(nIdleCount++))bDoIdle=FALSE;}bRet=::GetMessage(&m_msg,NULL,0,0);if(bRet==-1){ATLTRACE2(atlTraceUI,0,_T("::GetMessagereturned-1(error)
我有一个使用WTL8.1开发的适用于WindowsXPSP3的VS2008C++应用程序。我的应用程序包含一个选项卡控件,它会在调整应用程序边框大小时闪烁。我的窗口层次结构如下所示:CFrameWindowImplCMainFrm|-CSplitterWindowSplitter|-CTabViewConfigurationTabs||-CDialogImplConfigurationView1||-CDialogImplConfigurationView2||-CDialogImplConfigurationView3|-CDialogImplControlView我正在尝试的解决方