﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-懵懵灯灯的BLOG-随笔分类-MFC</title><link>http://www.blogjava.net/mmmyddd/category/27999.html</link><description>&lt;font color="olive"&gt;寒夜孤灯点点星&lt;/color&gt;</description><language>zh-cn</language><lastBuildDate>Wed, 12 Mar 2008 06:27:21 GMT</lastBuildDate><pubDate>Wed, 12 Mar 2008 06:27:21 GMT</pubDate><ttl>60</ttl><item><title>Microsoft编译器和动态链接器的命令行参数详解</title><link>http://www.blogjava.net/mmmyddd/archive/2008/03/12/185651.html</link><dc:creator>懵懵灯灯</dc:creator><author>懵懵灯灯</author><pubDate>Wed, 12 Mar 2008 04:29:00 GMT</pubDate><guid>http://www.blogjava.net/mmmyddd/archive/2008/03/12/185651.html</guid><wfw:comment>http://www.blogjava.net/mmmyddd/comments/185651.html</wfw:comment><comments>http://www.blogjava.net/mmmyddd/archive/2008/03/12/185651.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mmmyddd/comments/commentRss/185651.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mmmyddd/services/trackbacks/185651.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Microsoft C/C++ Compiler and Linker command parameter Usage.&nbsp;&nbsp;<a href='http://www.blogjava.net/mmmyddd/archive/2008/03/12/185651.html'>阅读全文</a><img src ="http://www.blogjava.net/mmmyddd/aggbug/185651.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mmmyddd/" target="_blank">懵懵灯灯</a> 2008-03-12 12:29 <a href="http://www.blogjava.net/mmmyddd/archive/2008/03/12/185651.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[MFC] 如何enable/disable菜单项  </title><link>http://www.blogjava.net/mmmyddd/archive/2008/01/09/174120.html</link><dc:creator>懵懵灯灯</dc:creator><author>懵懵灯灯</author><pubDate>Wed, 09 Jan 2008 13:54:00 GMT</pubDate><guid>http://www.blogjava.net/mmmyddd/archive/2008/01/09/174120.html</guid><wfw:comment>http://www.blogjava.net/mmmyddd/comments/174120.html</wfw:comment><comments>http://www.blogjava.net/mmmyddd/archive/2008/01/09/174120.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mmmyddd/comments/commentRss/174120.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mmmyddd/services/trackbacks/174120.html</trackback:ping><description><![CDATA[
		<div class="t_msgfont" id="postmessage_91555">
				<h1 class="heading">
						<span onkeypress="ExpandCollapse_CheckKey(codeExampleToggle)" style="CURSOR: default" onclick="ExpandCollapse(codeExampleToggle)" tabindex="0">---------------------------------</span>
				</h1>
				<h1 class="heading">
						<span onkeypress="ExpandCollapse_CheckKey(codeExampleToggle)" style="CURSOR: default" onclick="ExpandCollapse(codeExampleToggle)" tabindex="0">
								<font size="4">1. Programmatically Example</font>
						</span>
				</h1>
				<div class="section" id="codeExampleSection" name="collapseableSection">
						<div class="code">
								<span codelanguage="other">
										<table cellspacing="0" cellpadding="0" width="100%">
												<tbody>
														<tr>
																<th> </th>
																<th>
																		<span class="copyCode" onkeypress="CopyCode_CheckKey(this)" onmouseover="ChangeCopyCodeIcon(this)" onclick="CopyCode(this)" tabindex="0" onmouseout="ChangeCopyCodeIcon(this)">
																		</span>
																</th>
														</tr>
														<tr>
																<td colspan="2">
																		<pre>// The code fragment below shows how to disable (and gray out) the 
// File\New menu item.
// NOTE: m_bAutoMenuEnable is set to FALSE in the constructor of 
// CMainFrame so no ON_UPDATE_COMMAND_UI or ON_COMMAND handlers are 
// needed, and CMenu::EnableMenuItem() will work as expected.

CMenu* mmenu = GetMenu();
CMenu* submenu = mmenu-&gt;GetSubMenu(0);
submenu-&gt;EnableMenuItem(ID_FILE_NEW, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);</pre>
																</td>
														</tr>
												</tbody>
										</table>
								</span>
								<font size="6">
										<strong>
												<font size="4">2. Message Processing Appoach</font>
										</strong>
								</font>
								<br />
								<br />
								<br />原贴地址:<a title="如何enable/disable菜单项" href="http://www.winu.cn/thread-52578-1-1.html">http://www.winu.cn/thread-52578-1-1.html</a></div>
				</div>
				<br />
				<font style="BACKGROUND-COLOR: #ffff33">如何enable/disable菜单项</font>  <br /><br />    这个问题在以前的知识库中出现过多次，许多人问及在MFC应用程序中enable或disable菜单的问题，在主菜单中调用 CMenu::EnableMenuItem不起作用......如何disable菜单项？  <br />    根据以往的经验，要解决这种问题，似乎应该有一个象EnableMenuItem之类的API函数，它的功能就是enable或disable菜单项。Windows中确实有这样的函数-但不是在MFC的应用中。实际上，在MFC里enable或disable菜单项是通过使用ON_ UPDATE_COMMAND_UI实现的。首先让我解释一下为什么MFC的实现方法不同于标准的C和Windows API，以及MFC的实现方法的好处。  <br />    一般情况下，用户界面的状态指的是按钮，状态格，菜单项等任何反映程序状态的东西。例如，如果程序处于只读模式，那么编辑（Edit）命令应该是disable的，并且在程序的某个地方可能有一个小指示器向用户提示这个状态。另一个例子是如果剪贴板没有内容（一种状态），那么菜单中的粘贴（Paste）命令应该是disable的。所以说通常的用户界面（UI）指的就是程序表现的状态，同时，程序状态的改变应该在程序的菜单中反映出来。  <br />如何随时获得反映程序状态的用户界面呢？我自己的方法有两种：  <br />    第一种是神经过敏型，也就是说无论何时只要程序状态改变，都不要忘记同时更新用户界面，如果用户调用只读模式命令，这个命令要disable所由编辑控制。同样，如果用户调用Cut或者Copy，处理器立刻enable Paste命令。在程序的任何地方对程序状态的任何改变，都必须要更新相应的UI。  <br />    第二种方法是放松型，也就是说，不要试图去维护所有的状态信息，只根据需要更新用户界面。对于菜单来说，不用保持菜单的状态的更新，只在显示的时候进行更新。<br />    这个方法较容易，也十分简单。更重要的是，它使数据从用户界面中分离出来。每个对象只存储它自己的状态-例如，文档知道什么时候处于只读模式。UI能解释出现的各种状态，你不想低级对象调用类似EnableMenu的UI函数！MFC提供一个UI更新机制来实现后一种方法，详细的方法描述因为内容太多，将在另文中讨论，其基本思路是这样的：当用户调用一个菜单的时候，Windows发送一个WM_INITMENUPOPUP消息。MFC创建一个暂时的CCmdUI对象处理这个消息，为每一个菜单项做连续初始化并将它传递到应用程序中的对象。MFC为此调用ON_UPDATE_COMMAND_UI消息处理器更新用户界面：  <br />ON_UPDATE_COMMAND_UI(ID_FOO, OnUpdateFoo)  <br />    只要用户进入包含Foo的菜单项，MFC就会调用OnUpdateFoo函数。你不必担心必须调用::EnableMenuItem（第一种方法）的所有地方；要做的只是从程序状态确定菜单状态。典型的处理方法如下：  <br />void CMainFrame::OnUpdateFoo(CCmdUI* pCmdUI) <br />{<br />     pCmdUI-&gt;Enable(pObj-&gt;GetFoo()); <br />} <br /><br />    GetFoo()是个假设的函数，它获得某个对象的foo状态-例如，m_pDocument-&gt;GetReadOnly()。可能有20函数来修改foo状态（自然是通过方法SetFoo），但更新菜单的地方只有一处。当然有可能是更复杂的情形，如：  <br />pCmdUI-&gt;Enable(m_bFoo &amp;&amp;<br />    (GetStatusX(...) || GetStatusY(...))); <br /><br />    在Paste菜单的情形中，你必须检查剪贴板是否有粘贴的内容，内容有可能是文本或图形，这里关键是在需要的时候决定菜单的状态，菜单更新代码被单独放在一个函数中-远离潜在的对象-替代了遍及所有对象的洒水式EnableMenuItem调用。  <br />    MFC使用CCmdUI和ON_UPDATE_COMMAND_UI来调整按钮、状态条窗格和菜单项的状态，并且你可以自己扩展其它的UI项目。例如，当用户点击下拉箭头时，你可以根据程序的状态调整组合框或列表框的内容。CCmdUI::Enable是个虚拟函数，在对于菜单项的操作当中，它变成了::EnableMenuItem。  <br />    在前面的例子中，我们讨论的UI处理是在CMainFrame中实现的，但你也能将这种处理放在框架，视图，文档，应用（派生于CWinApp）或任何其它类中，命令通过CCmdTarget::OnCmdMsg发送。如果MFC找不到特定菜单的ON_UPDATE_COMMAND_UI，它用以下的规则自动做enable或disable：  <br />    如果命令有一个处理器（ON_COMMAND），MFC enable菜单项；否则，MFC disable菜单项。你可以设置CFrameWnd::m_bAutoMenuEnable = FALSE重载这个行为，这样的话，所有菜单项都将被enable-不管有没有处理器。  <br />    所以，在MFC应用程序中，不要用EnableMenuItem来enable或disable菜单，而要使用ON_UPDATE_COMMAND_UI处理器来实现菜单的enable或disable。  <br /></div>
		<p>
				<a title="如何enable/disable菜单项" href="http://www.winu.cn/thread-52578-1-1.html">
				</a> </p>
		<br />
<img src ="http://www.blogjava.net/mmmyddd/aggbug/174120.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mmmyddd/" target="_blank">懵懵灯灯</a> 2008-01-09 21:54 <a href="http://www.blogjava.net/mmmyddd/archive/2008/01/09/174120.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[MFC] CListCtrl的LVS_EX_FULLROWSELECT风格</title><link>http://www.blogjava.net/mmmyddd/archive/2007/12/09/166530.html</link><dc:creator>懵懵灯灯</dc:creator><author>懵懵灯灯</author><pubDate>Sun, 09 Dec 2007 15:44:00 GMT</pubDate><guid>http://www.blogjava.net/mmmyddd/archive/2007/12/09/166530.html</guid><wfw:comment>http://www.blogjava.net/mmmyddd/comments/166530.html</wfw:comment><comments>http://www.blogjava.net/mmmyddd/archive/2007/12/09/166530.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mmmyddd/comments/commentRss/166530.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mmmyddd/services/trackbacks/166530.html</trackback:ping><description><![CDATA[<p>作一个CFormView,其中增加一个CListCtrl控件，想把这个控件的style设置为整行高亮显示。<br />
在网上误传的方法为：<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">1</span>&nbsp;<span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;CMyView::OnInitialUpdate()<br />
</span><span style="color: #008080">2</span>&nbsp;<span style="color: #000000">{<br />
</span><span style="color: #008080">3</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">INIT&nbsp;the&nbsp;control</span><span style="color: #008000"><br />
</span><span style="color: #008080">4</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;CFormView::OnInitialUpdate();<br />
</span><span style="color: #008080">5</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">6</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;CListCtrl&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;list</span><span style="color: #000000">=</span><span style="color: #000000">static_cast</span><span style="color: #000000">&lt;</span><span style="color: #000000">CListCtrl</span><span style="color: #000000">*&gt;</span><span style="color: #000000">&nbsp;(GetDlgItem(IDC_LIST));<br />
</span><span style="color: #008080">7</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;list</span><span style="color: #000000">-&gt;</span><span style="color: #000000">ModifyStyleEx(</span><span style="color: #000000">0</span><span style="color: #000000">,LVS_EX_FULLROWSELECT</span><span style="color: #000000">|</span><span style="color: #000000">LVS_EX_GRIDLINES);<br />
</span><span style="color: #008080">8</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span></div>
<p><br />
其中ModifyStyle 或者 ModifyStyleEx 都是修改的CWnd中的扩展属性，而正解为：<br />

<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">1</span>&nbsp;<span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;CMyView::OnInitialUpdate()<br />
</span><span style="color: #008080">2</span>&nbsp;<span style="color: #000000">{<br />
</span><span style="color: #008080">3</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;CFormView::OnInitialUpdate();<br />
</span><span style="color: #008080">4</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">5</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;CListCtrl&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;list</span><span style="color: #000000">=</span><span style="color: #000000">static_cast</span><span style="color: #000000">&lt;</span><span style="color: #000000">CListCtrl</span><span style="color: #000000">*&gt;</span><span style="color: #000000">&nbsp;(GetDlgItem(IDC_LIST));<br />
</span><span style="color: #008080">6</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;&nbsp;&nbsp;dwStyle&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;list</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetExtendedStyle();&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">7</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;dwStyle&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">|=</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;LVS_EX_FULLROWSELECT&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">|</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;LVS_EX_GRIDLINES;&nbsp;<br />
</span><span style="color: #008080">8</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;list</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetExtendedStyle(dwStyle);&nbsp;&nbsp;&nbsp;</span></div>
<br />
另外两个函数也容易引起误解：<br />
CWnd::getExStyle<br />
CListCtrl::getExtendedStyle<br />
这两个函数所得到的style不在同一个style空间，如果用混了出现的效果就会比较奇怪。<br />
<br />
最后感慨一下在网上传播的东西真是很多错误。<br />
</p>
<img src ="http://www.blogjava.net/mmmyddd/aggbug/166530.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mmmyddd/" target="_blank">懵懵灯灯</a> 2007-12-09 23:44 <a href="http://www.blogjava.net/mmmyddd/archive/2007/12/09/166530.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>