返回首页


{S0}简介
假设你有一个对话框,您可以在其中输入文本和文本有关的其他资料。虽然应该格式化文本,正常的数据项不应该的。所以,放置到您的对话框中,有你需要的所有格式按钮的工具栏,并找出,它会停靠在你的对话框的边缘。但我(客户)希望这件事情,它属于:能够在格式文本输入正确。
为了达到客户的需要,有一点点更多的参与不仅仅是放置一个按钮在中间的一种形式行。创建工具栏步骤一
像往常一样创建一个工具栏,添加CToolBar的成员,您的对话,给它任何适合你的名字。对于一个格式化工具栏类似m_wndFormatBar的名字听起来很不错。
,当场在创建一个静态控制,你想居住在工具栏。此帧ID(即IDC_STC_TOOLBARFRAME)。稍微大一点的工具,所以你可以看到工具栏所占用的空间,成为。在类向导中,分配到这个控制的成员。确保它被分配到CStatic的,而不是CString的。将它命名为任何你想要的(像m_Stc_ToolbarFrame)。第二步
现在到了最困难的部分。在你的对话框的OnInitDialog方法,将下面的代码。 / /定位工具栏,您可以省略的意见。CSIZE sizeToolbar;CRECT mrect;mrect.SetRectEmpty();/ / attach命令路由到对话窗口m_wndFormatBar.Create(本);m_wndFormatBar.LoadToolBar(IDR_TOOLBAR_​​FORMAT);m_wndFormatBar.SetBarStyle(CBRS_ALIGN_TOP | CBRS_TOOLTIPS | CBRS_FLYBY);m_wndFormatBar.ShowWindow(SW_SHOW);/ /计算工具栏的大小,静态控制和调整大小以适应大小sizeToolbar = m_wndFormatBar.CalcFixedLayout(假,TRUE); m_Stc_ToolbarFrame.GetWindowPlacement(AMP; WPL);wpl.rcNormalPosition.bottom = wpl.rcNormalPosition.top   ; sizeToolbar.cy 4;wpl.rcNormalPosition.right = wpl.rcNormalPosition.left &# 160; sizeToolbar.cx 4;/ /位置的静态的控制和工具栏m_Stc_ToolbarFrame.SetWindowPlacement(AMP; WPL);m_wndFormatBar.SetWindowPlacement(AMP; WPL);/ /调整到静态控制按钮m_Stc_ToolbarFrame.RepositionBars(AFX_IDW_CONTROLBAR_​​FIRST AFX_IDW_CONTROLBAR_​​LAST,0);m_Stc_ToolbarFrame.ShowWindow(SW_HIDE);这是如何工作的
m_wndFormatBar.Create(这)告诉工具栏,窗口的命令将被发送。加载的图像,设置酒吧风格和显示的工具栏是相当明显的。然后你计算工具栏的大小,并相应调整静态控制的大小具有一定的余量。
完成之后重数值的考虑,我们把静态控制,并在其腿上的工具栏。 m_Stc_ToolbarFrame.RepositionBars告诉的工具栏的窗口,它应依偎高达。然后,使静态控制消失。
省略线或做计算错误将被判处怪异的光学效果和您的应用程序的奇怪行为。检查出来。
虽然是很简单的命令路由,这些命令的视觉更新是有点棘手。第三步
UpdateCommandUI处理程序添加到您的对话框和编辑的方法,你会在每一帧/视图应用程序,。不要照顾,当他们这样做似乎并没有工作。其实,他们不能。第四步
添加一行:#include"afxpriv.hquot;
在对话框的cpp文件的顶部,或把里面的stdafx.h中。在你的对话框的头文件放线:LRESULT OnKickIdle AFX_MSG(WPARAM,LPARAM);
里面的消息映射。最好的地方是一个行/ /}} AFX_MSG DECLARE_MESSAGE_MAP()行之间的行。如果没有行,然后按返回。看在你的对话框的cpp文件END_MESSAGE_MAP()字。在该行之前,输入ON_MESSAGE(WM_KICKIDLE,OnKickIdle)。如果您忘记了包括afxpriv.h编译器会告诉你,它不知道任何有关WM_KICKIDLE。 (顺便说一下,这个消息意味着有人袖手旁观踢?)
OnKickIdle例行的身体添加到您的对话框类,并调用本CommandUpdateUI处理程序。怎么样?有一个look.LRESULT CArbitraryToolbarDlg:OnKickIdle(WPARAM,LPARAM){ CCmdUI cmdUI; cmdUI.m_nID = ID_FORMAT_BOLD; / /命令ID / /告诉对话框调用UpdateCommandUI例行 cmdUI.DoUpdate(这一点,FALSE); cmdUI.m_nID = ID_FORMAT_DURCHSTRICH; cmdUI.DoUpdate(这一点,FALSE); cmdUI.m_nID = ID_FORMAT_KURSIV; cmdUI.DoUpdate(这一点,FALSE); cmdUI.m_nID = ID_FORMAT_UNTERSTRICH; cmdUI.DoUpdate(这一点,FALSE); cmdUI.m_nID = ID_EDIT_CUT; cmdUI.DoUpdate(这一点,FALSE); cmdUI.m_nID = ID_EDIT_COPY;  ; cmdUI.DoUpdate(这一点,FALSE); cmdUI.m_nID = ID_EDIT_PASTE; cmdUI.DoUpdate(这一点,FALSE);   ; 返回TRUE;}第五步...
添加命令处理程序,并对其进行测试。喝了一杯咖啡。
在这整个过程中你应该与矿源代码。你可能适应您的需求,可能不会改变,我不能告诉。这是只教经验,你的经验。
提供的样本只有第7个按钮。这是由设计!毕竟,这是一个示例不是一个完整的的成熟的应用程序。
挤压RichEditCtrl例程将是即将推出自己的类。敬请关注。
看了这么久后,我问你一个人情?我的小兄弟已发送在中东战争,现在,就请你为他祈祷,因此他将返回安然无恙?谢谢。

回答

评论会员:HvalaMne 时间:2011/11/29
。似乎不无模式dilogs收到WM_KICKIDLE消息
有谁知道如何处理无模式对话框?
评论会员:HvalaMne 时间:2011/11/29
无模式对话框工作的一个很好的例子可以发现在MSDN示例DLGCBAR


评论会员:HachiihcaH 时间:2011/11/29
继承人原来的文章是为我工作得很好现在的补丁的简短摘要。
它允许使用标准的ON_UPDATE_COMMAND_UI()和ON_COMMAND()处理,而不必明确地设定每个工具按钮的状态,并避免了密集的CPU使用的问题。我也有更好的成功创建的对象而不是重用一个单一的一个循环内的一个新的CToolCmdUI。有些国家被存储,这是妨碍正常操作。唯一我现在看到的是一个闪烁的鼠标悬停位,但是这可能是我的CToolBar继承
问题
因此,使用,按照本文的说明,然后用下面的代码替换OnKickIdle功能。在这之后,命令和命令UI处理程序添加到您的心脏的喜悦!
CToolCmdUI类:公共CCmdUI / /类的私有这个文件! (从BarTool.cpp复制)
{
市民:/ /重新实现,只有
虚拟无效启用(布尔BON);
虚拟无效SetCheck(INT n检查)
虚拟无效的setText(LPCTSTR lpszText);
}

LRESULT CMyDialog:OnKickIdle(WPARAM,LPARAM)/ /感谢"美好生活"
{
(I = 0; I

- 2006年2月,24日
修改于星期五17点36分
评论会员:naveed 时间:2011/11/29
使用CreateEx,而不是创建以创建平面工具栏{A}
评论会员:archon_cn 时间:2011/11/29
如果使用"OnKickIdle"实施的UI更新,应用程序变成CPU。
但是,为什么的文档/视图结构的应用程序不是这样的吗?
我很困惑。
评论会员:fgleich 时间:2011/11/29
您好:
我也有这个问题在我的应用程序,并跟踪,发现这个例行问题。在此URL(http://msdn.microsoft.com/msdnmag/issues/02/01/c/)是一些有关kickidle消息处理程序的信息,约2 / 3的方式是解决这个问题。而不必方法返回TRUE,它返回0,问题消失。

希望这有助于!

冯检基Gleicher
评论会员:美好生活 时间:2011/11/29
替换OnKickIdle:

CToolCmdUI类:公共CCmdUI / /类的私有这个文件! (从BarTool.cpp复制)
{
市民:/ /重新实现,只有
虚拟无效启用(布尔BON);
虚拟无效SetCheck(INT n检查)
虚拟无效的setText(LPCTSTR lpszText);
}

无效CArbitraryToolbarDlg:OnKickIdle()
{
CToolCmdUI cmdUI;
cmdUI.m_pOther = m_ToolBar;
m_ToolBar.GetCount cmdUI.m_nIndexMax =()
(I = 0; I

这使得它可以使用标准的更新功能。
例如
无效CArbitraryToolbarDlg:OnUpdateEditUndo(CCmdUI * pCmdUI)
{
pCmdUI - >启用(F​​ALSE);
}

而不是寻找按钮的索引...
评论会员:美好生活 时间:2011/11/29
您好,
在我的电子邮件帐户时,我发现了另一个文本,比本网站上。但loks喜欢你发现自己,为什么我用的CCmdUI.DoUpdate功能,而不是启用功能。原因其实是你必须提供与主窗口的工具栏,您将更新。
我想不发展我自己的CommandUI类,所以它更可能,它会与不同的MFC版本。
这是我didnot发展的一类自身的原因,我也没有尝试进行连接比由一个fuction调用严格的
顺便说一下,你的方法乍一看似乎只与工具栏命令的工作。如果你有一个菜单项,你要更新,这个菜单项不是作为一种工具按钮?在我的情况你需要改变代码。在您的情况下,你有区分的菜单项和工具栏按钮。两次调用的更新处理程序会导致闪烁的工具栏。至少我的系统显示了这样那样的问题。

看起来像许多方面都领先罗马。

关于

格哈德


评论会员:奥利多 时间:2011/11/29
toobar cmdui是从另一个继承,因此他们两人的工作。你也依赖于工具栏...
评论会员:Fabricem 时间:2011/11/29
您好,
我有这个小问题:
我测试了一个模态对话框的实施。
运行良好。
然后我试图使用相同的对话,但无模式。那么,什么情况是,工具栏位图重新绘制,
如果我关闭,然后重新打开该对话框。
你有什么建议吗?{B​​R}非常感谢您
 60;
加布里埃尔普雷达



加布里埃尔普雷达
评论会员:Fabricem 时间:2011/11/29
您好,

我来到了同样的问题时,试图实现在一个弹出WND的顶部的工具栏。不幸的是,我想你的榜样,它没有工作。不过,我深入研究了框架代码,并注意到CWinThread::的OnIdle调用主要WND和SendMessageToDescendants遍历SendMessageToDescendants通过顶层和儿童wnds的列表,然后转发WM_IDLEUPDATECMDUI味精使用AfxCallWndProc

我的印象是,一个弹出的是一个顶级WND但很明显,我的弹出是不是

总之,通过改变我从一个正常的WND弹出一个FrameWnd CWinThread::的OnIdle是可以调用其他FrameWnds SendMessageToDescendants和更新处理程序,因此呼吁在我弹出FrameWnd

我知道这是不理想,因此,你可以建议什么?

辛普森
评论会员:chu_30097 时间:2011/11/29
喜G.

过去我曾用你的代码,它工作得很好。不过,我现在运行使用Visual Studio.net的BoundsChecker V7.0,当我在调试模式下运行,启动程序具有以下errorwhen:
"参数2,在选择对象(HGDIOBJ__ HGDIOBJ = 0x0A0504​​42)此资源(类型=位图)是当前选定的HDC 0x04010293,并只可在一个设备上下文选择一个时间。"
与此错误时退出程序:

"DeleteObject 1参数(对象HGDIOBJ__ hObject = 0x0A0504​​42 0x0A0504​​42)仍然选定的hDC 0x04010293。"
这两个错误已被隔离,来自你一段代码。
你有什么想法?

欢呼声,
布理。
评论会员:欧内斯特Laurentin 时间:2011/11/29
您好,
很好的一段代码,正是我需要为我的项目。然而,当我添加工具提示,他们似乎没有工作。任何想法?
感谢。

布理
评论会员:彼得亨德里克斯 时间:2011/11/29
嗨,
另一位读者也发现了那些没有工作的工具提示。经过一番研究,我找到了解决办法,并张贴在http://www.codeproject.com/useritems/ToolTipsInDialog.asp。
希望这有助于你太。

G. Steudtel

评论会员:丹尼尔Kamisnki 时间:2011/11/29
喜G.
非常感谢你的答复,我试了一下,和它的工作第一次。的欢呼声。布理。