Articles of mfc

如何确定当前窗口是否为活动窗口?

我怎么知道我的窗口是否是当前活动的窗口? 我目前的猜测是做GetForegroundWindow并比较HWND与我的窗口。 有没有比这更好的方法? 我正在使用Win32 API / MFC。

为什么对话框会清除内容而不刷新?

我有一个非常奇怪的问题,一个窗口似乎在删除它的内容,而不是在删除它之后重新绘制它。 这个对话框是从CDHtmlDialog派生的,我认为这是问题的一部分。 有一些非确定性的代码执行发生,导致某些代码在某些情况下先于其他代码执行,而在另一些代码中则相反。 所涉及的消息处理程序是: BEGIN_MESSAGE_MAP(CCalcDrillDownDlg, CDHtmlDialog) ON_WM_PAINT() END_MESSAGE_MAP() BEGIN_EVENTSINK_MAP(CCalcDrillDownDlg, CDHtmlDialog) ON_EVENT(CCalcDrillDownDlg, AFX_IDC_BROWSER, 250 /* BeforeNavigate2 */, _OnBeforeNavigate2b, VTS_DISPATCH VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PBOOL) END_EVENTSINK_MAP() OnInitDialog()函数如下所示: BOOL CCalcDrillDownDlg::OnInitDialog() { SetHostFlags(DOCHOSTUIFLAG_FLAT_SCROLLBAR); CDHtmlDialog::OnInitDialog(); // << will eventually call _OnBeforeNavigate2b() // Set the icon for this dialog. The framework does this automatically // when the application's main window […]

我需要一个消息泵,不会弄乱我打开的窗口

我的应用程序(我正在使用的安装程序的引导程序应用程序需要启动一些其他应用程序(我的安装程序和第三方安装程序的安装程序的先决条件),并等待它们完成。为了允许GUI执行屏幕更新在等待一个应用程序完成的时候,我使用Visual Studio文档中关于空闲循环处理的'兼容MFC'的例子,在等待循环中放置了一个消息泵作为指导。我的代码(在CWinApp的成员函数中派生类)如下: if (::CreateProcess(lpAppName, szCmdLineBuffer, NULL, NULL, TRUE, 0, NULL, NULL, &StartupInfo, &ProcessInfo)) { ::GetExitCodeProcess(ProcessInfo.hProcess, &dwExitCode); if (bWait) while (dwExitCode == STILL_ACTIVE) { // In order to allow updates of the GUI to happen while we're waiting for // the application to finish, we must run a mini message pump here to // allow messages […]

mfc – 带有丰富文本的MessageBox

我希望能够显示消息框内的格式化文本(如粗体文本,项目符号,斜体等)。 我遇到这个奇妙的文章,但似乎无法得到它的工作。 我在同一个链接上使用演示应用程序。 有人可以帮我吗? 我试着debugging/理解代码是徒劳的。 限制:(不是我的select) 必须与Windows XP兼容。 我正在使用Visual C ++ 6。 它应该如何显示: 它如何实际显示:

devisestring本地化的最佳方法

这是一个普遍的问题,是开放的意见。 我一直在想出一个很好的方法来为Windows MFC应用程序和相关实用程序devisestring资源的本地化。 我的心愿是: 必须保留代码中的string文字(而不是用macros#define资源ID的replace),以便消息仍然可以内联 必须允许本地化的string资源(杜) 不得施加额外的运行时环境限制(例如:依赖.NET等) 应该对现有的代码有最小的影响(修改越less越好) 应该是可debugging的 应该生成通用工具可编辑的资源文件(即:通用格式) 不应该使用复制/粘贴注释块来保留代码中的文本string,或者其他任何可能导致解除同步的潜力 如果允许静态(编译时)检查每个“notated”string在资源文件中, 如果允许跨语言资源string池(对于各种语言的组件,例如:本地C ++和.NET) 除了静态检查之外,我有一种方法可以在某种程度上满足我的所有愿望,但是我必须开发一些自定义代码来实现它(并且有其局限性)。 我想知道是否有人以特别好的方式解决了这个问题。 编辑:我目前的解决scheme是这样的: ShowMessage( RESTRING( _T("Some string") ) ); ShowMessage( RESTRING( _T("Some string with variable %1"), sNonTranslatedStringVariable ) ); 然后,我有一个自定义实用工具从“RESTRING”块中parsing出string,并将它们放到.resx文件中进行本地化,并使用一个单独的C#COM对象从本地化资源文件中加载它们。 如果C#对象不可用(或无法加载),我将回退到代码中的string。 macros展开为调用COM对象的模板类,并进行格式化等。 无论如何,我认为这将是有益的,加上我现在的参考。

DWORD和DWORD_PTR在64位机器上

为了支持Win64的64位寻址,在Windows API中添加了几个*_PTRtypes。 SetItemData(int nIndex,DWORD_PTR dwItemData) 当我将第二个参数作为DWORD传递时,此API适用于64位和32位机器。 我想知道,如果这个特定的API将在64位机器上失败,如果我通过第二个参数为DWORD 。 我如何testing失败情况? 谢谢,Nikhil

VC ++ Metro风格应用程序Windows

我有一个十年前的MFC VC ++桌面应用程序。 美的应用程序是从Windows 2000到Windows 7,超过15种语言。 它的multithreadingIPC和SSL上的winsocket。 最近我读到,赢得Windows 8 Metro风格,我们将无法运行现有的应用程序。 这是否意味着Windows正在杀死VC ++或MFC? 是否有可能为所有的Windows版本保留相同的代码基础? 我有用于winsock和MFC的替代API吗? 在HTML5中编写应用程序是否强制?

我如何强制我的应用程序来到前面,并把重点放在?

我正在开发一个应用程序,这个应用程序恰好是我正在开发的安装程序的引导程序。 应用程序进行一些MSI调用,以获取我需要的信息,这些信息是我的应用程序主窗口的向导,这会在收集信息时导致打开进度窗口,然后在完成后离开。 然后向导build立并启动。 我的问题是,该向导(从CPropertySheet派生)不希望来到前面,并成为活动的应用程序没有我添加一些调用这样做。 我已经解决了在我的OnInitDialog()方法中使用下面的代码将它带到前面的问题: SetWindowPos(&wndTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); // force window to top SetWindowPos(&wndNoTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); // lose the topmost status that the previous line gave us 我的问题是,我还没有想出如何使窗口自激活(即使自己成为焦点)。 SetFocus()在此上下文中不起作用。 我需要一些强制窗口到Z-order的顶端并激活它,最好是尽可能less的调用。 我的猜测是MSI调用在开始时打开的进度窗口导致主窗口搞砸了,但是我无法阻止窗口出现。 另外,隐藏它是没有意义的,因为它让用户在主窗口到达之前知道发生了什么。

如何拖拽大量的文件而不消耗系统资源?

我正在处理的程序中的一个function是将对象从其主窗口拖放到Windows资源pipe理器中作为文件。 为此,我们重写COleDataSource::OnRenderGlobalData() ,当格式为CF_HDROP ,我们将每个对象保存为一个文件。 当对象数量很小时,这工作正常。 但是,由于我们正在努力支持企业级别的对象,因此当用户试图将大量对象从我们的应用程序拖放到Windows资源pipe理器中时,我们看到很大的延迟,有时会导致挂起或最终崩溃。 我的猜测是,这是因为OnRenderGlobalData()被调用了很多次,当然,每次必须遍历被拖动的对象并将它们保存为文件。 我正在研究覆盖OnRenderFileData()的想法,但问题是它一次只处理一个文件。 有什么办法可以加快我们的应用程序,当用户试图拖动大量的对象到Windows资源pipe理器,最好是通过将保存循环移动到只能执行一次,当实际下降发生的地方?

什么是正确的解决scheme,以支持在文本编辑器中的插入符号运动IAccesible接口?

我想从零开始实现一个支持IAccessible接口的文本编辑器。 我正在使用MFC和Win32 API。 当标记文字编辑器(如记事本)中的插入符号位置发生变化时,插入符号移动的相应字母,单词或行将由Narrator,JAWS等客户端工具发出。我不知道如何实现此function。 我search互联网并阅读MSDN文档。 我在http://msdn.microsoft.com/en-us/library/dd317978.aspx和http://msdn.microsoft.com/en-us/library/dd373892.aspx阅读客户端请求通过AccessibleObjectFromWindow方法从操作系统,和操作系统发送WM_GETOBJECT到应用程序。 WM_GETOBJECT消息在相应的窗口callback函数中收到,但hWnd用于脱字符号移动事件是NULL。 我检查了线程消息队列,但是WM_GETOBJECT在线程消息队列中根本没有收到。 一种有效的方法,但不是正确的解决scheme是打电话 NotifyWinEvent( EVENT_OBJECT_NAMECHANGE, hwnd, OBJID_CLIENT, CHILDID_SELF ) 当用户移动插入符时。 当客户要求更改的名称时,我会返回与相关的脱字符号相关的文字。 HRESULT CMyEditor::get_accName(VARIANT varChild, BSTR *pszName) { *pszName = SysAllocString( L"CORESPONDING TEXT TO THE CARET MOVEMENT" ); return S_OK; }