登录后没有弹窗广告,广告是为了发展.如果您在未注册情况下浏览书部落弹出了广告,感谢您对书部落运营的支持
游客: 注册 | 登录 | 统计 | 赚部落币! | 论坛规则简介(必看) | 上传书籍必看| C/C++学习小组| | WINDOWS编程学习小组|
= 论坛导航 = 站务交流 · 新闻与评论 · 找书·评书·荐书 人生故事·心得分享 学习经验·答疑解惑 精华
[电子书分享专区] WEB开发与程序设计 ·C/C++电子书 ·JAVA电子书 ·.NET相关 ·汇编语言 ·PHP电子书 ·ASP电子书 ·JSP电子书 · 嵌入式开发 ·游戏编程 黑客|病毒|破解 ·Ruby·Ajax·XML·CSS·Python等脚本语言                              ·操作系统 ·LINUX电子书 ·UNINX电子书 ·WINDOWS电子书 ·数据库 ·Oracle ·MYSQL ·SQL Server ·等....                  注:书籍分享区仅限书籍分享,下面有代码分享区,希望大家注意区分
[程序源代码分享区] Windows程序(C/C++/VC++) ·界面编程 ·桌面应用 ·文件操作 · shell编程 ·钩子(HOOK) ·Win32API ·COM编程 ·进程与线程 ·驱动编程 ·WinSock ·LINUX程序代码 ·JAVA程序 ·.NET编程 ·书籍源码 ·等....
[ 技术文摘分享区] 文摘分享区旨在搜集网上的专业文献,希望你也能来添砖加瓦,添加文章有部落币奖励
程序设计与WEB开发电子书目录◇◆□ 专题推荐:JAVA电子书下载◇◆□ C程序设计之四书五经_电子书下载◇◆□ C++学习推荐书目◇◆□ C#经典书籍◇◆□ JAVA编程思想专题◇◆□ C++ Primer
↑请善于搜索-“搜商”是21世纪您成功的关键因素



 
标题: [Visual C++] 动态菜单项、状态条提示、工具条提示问题+配套源代码
程序源代码
超级版主
Rank: 8Rank: 8



UID 64740
精华 0
积分 2
帖子 118
威望 2
部落币 926
代码量 52
阅读权限 150
注册 2007-12-20
状态 离线
发表于 2007-12-30 02:54  资料 文集 短消息 

动态菜单项、状态条提示、工具条提示问题+配套源代码

《动态菜单项、状态条提示、工具条提示问题》配套源代码
f        YC        V/i~g,OVwww.shubulo.com
fQ?,Ff]"u*k-`下载问题的提出:一个应用程序想要动态改变菜单项。使用CCmdUI::SetText("Menu Text")可以改变菜单文本,但是如何动态改变工具条和状态条的文本呢?有几种策略,避免,欺骗,面对...... 下载v%b/[J y_:|
电子书下载,计算机电脑教程图书n}PgV5O
[代码性质] VC可重用代码段
F%F+TD/DU[代码作者] 赵湘宁
%n r"AV2u下载[文件大小] 56K


附件: 动态菜单项、状态条提示、工具条提示问题.rar (2007-12-30 02:54, 55.48 K)
该附件被下载次数 52
如果您对本帖内容有任何质疑,或者您在阅读/下载 本帖内容时遇到困难 请在站务管理版里发帖提出。点这里进入反馈
顶部
程序源代码
超级版主
Rank: 8Rank: 8



UID 64740
精华 0
积分 2
帖子 118
威望 2
部落币 926
代码量 52
阅读权限 150
注册 2007-12-20
状态 离线
发表于 2007-12-30 02:56  资料 文集 短消息 
动态菜单项、状态条提示、工具条提示问题  
3K I'j U5y!h
V*zP书部落-分享计算机经典巨著,PDF电子书收藏之家,分享互联网
赵湘宁 下载n0Wrm5{I/aP
  下载*o
D_-Ec7bnf

问题的提出:
"L;o
r"t'R2}.y,c5|$w
一个应用程序想要动态改变菜单项。使用CCmdUI::SetText("Menu Text")可以改变菜单文本,但是如何动态改变工具条和状态条的文本呢?www.shubulo.comCX-\mDQn;Y%Y

2q{Y$n/Eq-J*j%u[有几种策略,避免,欺骗,面对...... www.shubulo.comd?$L        C4Sb
首先,避免:为什么你非要动态改变菜单项?一般说来,这是个坏主意,动态菜单容易把人搞糊涂。我正在使用你的产品,本来用得好好的突然菜单项变了。不管什么时候,每当我看到一个改变菜单的应用时,都要琢麽为什么他们需要这样的用户界面设计。
"o {6V},@'bov_}
#rTtA,x书部落-分享计算机经典巨著,PDF电子书收藏之家,分享互联网然而,每一个规则都有例外,许多例子的动态改变菜单项都很酷。例如,在大多数面向文档的应用程序中“文件”菜单的最后一项MRU(最近使用的文件列表)。但作为一个用户,面对动态菜单项的弊端是显而易见的。我把避免动态菜单提升为设计准则。即便是采用了动态菜单的设计,也要让用户注意不到菜单项是改变,否则,It''s bad design。反之,如果用户注意不到菜单项的改变,It''s OK。7E(H8|(VK S.f_
书部落-计算机PDF电子书之家8[o%]@]i6{3]:H6W5M
但是动态改变状态条提示又如何呢?在MRU菜单中,无论什么文件,状态条一般都提示“打开选择的文档”。这是另一个要避免的策略。只有特别本位或任性的程序员会操心实现一个动态提示的菜单,如:“打开某某文件”,而不去用完全可行并且有效的提示“打开这个文档”。你完全有权利不遵循这种惯例,也就是说,如果你非要改变状态条提示的话,那就请往下继续看吧,你会明白的。书部落-计算机PDF电子书之家0P
K'BN^Q-I


C(J.I_^pRm书部落-分享计算机经典巨著,PDF电子书收藏之家,分享互联网使用动态菜单的另一场合是当你想设置某个布尔状态时。例如,隐藏或显示工具条,当工具条可见时显示“隐藏工具条”,反之显示“显示工具条”。更为普通的方法是用单个命令以校验标记来实现,当工具条可见时显示标记(如下图)。
Q].IDT7XR]下载
/e+x o-ZM(@4J

GUI的高手们常常争论哪种方法更好。可能它没有什么差别,但是即使你决定使用动态提示(如隐藏/显示工具条),你也能使用单个的命令ID,ID_VIEW_TOOLBAR,和单个的提示“隐藏或显示工具条”。我认为没有必要去实现动态提示。
|4^]rU0B/g书部落-计算机PDF电子书之家 K]\0RnhJ
在所有建议中,你要做的第一件事情是好好重新考虑用户的界面。你确实需要动态菜单项吗?以及你确实需要菜单的动态提示吗?除非两个问题的答案都是“是”。否则就止住,别再浪费时间。下载A@6p'OI xR

t
x'u
u6e&X"c书部落-计算机PDF电子书之家
要改变菜单文本是容易的。只要实现ON_UPDATE_COMMAND_UI处理器并调用CCmdUI::SetText即可:书部落-计算机PDF电子书之家wSNc(S;XX
*M6J/CTR
"?9V$G@ ^
MS1i书部落-计算机PDF电子书之家

:nm
k"]        V%G,| B0Q [Z:_下载
void CFrameWnd::OnUpdateToolbar(CCmdUI* pCmdUI) www.shubulo.com+^.D ^Tw(HoN
{
.X+R/m2r(\ mnwww.shubulo.comBOOL bVisible = IsToolbarVisible(...);
[.Lb9j@E'H下载// Note same mnemonic (&T) for both cmds!
)q        jU2u@书部落-计算机PDF电子书之家pCmdUI->SetText(bVisible ? "Hide &Toolbar" : "Show &Toolbar");
Eh%_d$i9r} U]9A(k~m7[

a;S7_ w1M w,s-s
仅此而已。下一步是提示。当你创建了一个菜单提示,你给它一个ID号。MFC使用这个ID来查找资源串获取命令提示。例如:
        @m c&L2\n2A下载
/?ZU/i\0e?+f6_S?2QSTRINGTABLE DISCARDABLE
q'O|`?-vNtI/~www.shubulo.comBEGIN/^/[z(`
|td

ID_VIEW_TOOLBAR "Show or hide the toolbar\nToggle ToolBar" 书部落-计算机PDF电子书之家+s9]9N:X.@!P?zt
END 书部落-计算机PDF电子书之家U-F&T5n7ug        K
下载(O$n$@,_tE~1[6@j&I4K
如果你的菜单命令也有工具条按钮,MFC用“\n”(新行标记)后的文本作为工具条提示文本。因为MFC允许每个命令只能有一个串,如何动态改变提示呢?最简单的方法是编写一个提示在两种情况下都工作,象前面讨论的隐藏、显示工具条的例子。但这种方法显得很笨拙。
+Bc%~O,b0H书部落-计算机PDF电子书之家www.shubulo.comT        Ex&T        NEs:HlV-t@
获得动态提示的一个方法是将命令分成几个命令-例如,ID_HIDE_ TOOLBAR 和ID_SHOW_TOOLBAR,只是一种欺骗策略。这些命令的命令处理器最终要做的事情是改变菜单项的ID为其它命令项的ID。具体实现细节我就不讲了,自己做吧。下载#gn+N^8x;r2U0n1F
R

www.shubulo.com+`Iq2K*H4z]Q
使用两个ID可能是一种简单的方法,但它不适用于所有情况。例如在MRU文件菜单中,对于每个可能的文件名字你会需要不同的ID。
g8eB'??B\0hwww.shubulo.com
[8E\0Kq-N书部落-分享计算机经典巨著,PDF电子书收藏之家,分享互联网本文提供一个例子程序,DynPrompt,如下图,

状态条采用了动态提示,为了理解DynPrompt是如何工作的,你必须对MFC的菜单提示有一些研究。当用户的鼠标 移动到一个菜单项时,Windows发送WM_MENUSELECT和菜单项的ID。MFC的CFrameWnd处理如下:下载T4K$|\V:h
下载t4t|t.up$B,lm
// much simplified
K v#]|u{9[.yh#Or9jvoid CFrameWnd::OnMenuSelect(UINT nItemID,
]ej~t电子书下载,计算机电脑教程图书UINT nFlags, HMENU hSysMenu)书部落-计算机PDF电子书之家!o2h S,dUM.p:s
{
v*b\ [\x^/L`i电子书下载,计算机电脑教程图书SendMessage(WM_SETMESSAGESTRING, nItemID); 书部落-计算机PDF电子书之家Dqb4w4R        k_ b
}

rEH%I
u RdE书部落-分享计算机经典巨著,PDF电子书收藏之家,分享互联网

[N9tf
uol a电子书下载,计算机电脑教程图书
我做了一些简化;函数的实际代码超过了60行,但基本的意思是框架发送WM_SETMESSAGESTRING消息到自身,用WPARAM传递命令ID。SETMESSAGESTRING 是MFC的一个私有消息,它在afxpriv.h中定义。这个消息在状态条窗格中设置 要显示的文本。你可以用WPARAM传递资源串的ID,或者用LPARAM传递实际的串。书部落-分享计算机经典巨著,PDF电子书收藏之家,分享互联网 tkI_.QA

,PjF(t[R6}?R@w!f// resource string ID 下载)P_Q dxM
SendMessage(WM_SETMESSAGESTRING, ID_MYSTRING);下载m1XpL(k
XUr]

/g#Z(GuzF\0B
// string 下载y+w~
D,j*?ftA

SendMessage(WM_SETMESSAGESTRING, 0, (LPARAM)_T("Hello, world")); www.shubulo.com:t:R%Xs:P&y
书部落-分享计算机经典巨著,PDF电子书收藏之家,分享互联网d%l-Q*E'OW&U3R\0P
所以,如果要实现动态菜单提示,必须重载CFrameWnd::OnMenuSelect和 用提示串发送WM_SETMESSAGESTRIN消息。
s4J5x)r.f书部落-分享计算机经典巨著,PDF电子书收藏之家,分享互联网电子书下载,计算机电脑教程图书8h6{$Lm+`&F9V
q

void CMainFrame::OnMenuSelect(UINT nItemID, UINT nFlags,www.shubulo.com+?z"JS/s)_2}+M(t
HMENU hSysMenu) !P!},\(qk0Tr        gM
{ 下载e@\0xn~
if (/* nItemID has a dynamic prompt */) {

R:`.e&KC8|e@书部落-计算机PDF电子书之家
CString sPrompt = // whatever you want 书部落-分享计算机经典巨著,PDF电子书收藏之家,分享互联网_a%r1~ C!OA
SendMessage(WM_SETMESSAGESTRING, 0, (LPARAM)(LPCTSTR)sPrompt);
2t#z}V`L#E电子书下载,计算机电脑教程图书m_nIDTracking = nItemID; 书部落-计算机PDF电子书之家\0|~:Y7~1F7z
} else {
e2^m/W5d0Y8}&m下载CFrameWnd::OnMenuSelect(nItemID, nFlags, hSysMenu); 电子书下载,计算机电脑教程图书]3l/@(B@
}
,~ER-~3}:V5s下载} 电子书下载,计算机电脑教程图书#xPi%MWEP$Z!MF
电子书下载,计算机电脑教程图书`4l7bk;Z*e,iQ)q%[u
MainFrm.cpp文件中的OnMenuSelect实际代码调用一连串函数从MRU菜单项来截获 文件名并建立所要的文本提示。别忘了还要调用CFrameWnd::OnMenuSelect来处理 未改变的提示的命令。LO,\6Fs|?-?:U
电子书下载,计算机电脑教程图书qh,_ Kb
最后,对于如何动态改变工具提示文本的方法,CFrameWnd::OnToolTipText是MFC处理工具条通知的函数。其标准实现用匹配的命令ID加载资源串,截获“\n”后的文本并将它拷贝调用者的TOOLTIPTEXT结构。你的任务是编写自己的 代码重载这个处理器。我把这个作为家庭作业
顶部
 



Powered by Discuz! 5.0.0 © 2001-2006 著作权保护声明|网站法律顾问:ItLaw-庄毅雄律师|
Processed in 0.130190 second(s), 7 queries , Gzip enabled 1024*768
当前时区 GMT+8, 现在时间是 2008-11-20 23:31 清除 Cookies - 联系我们 - 书部落-计算机编程图书资料分享 - Archiver