﻿<?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>C++博客-春暖花开-文章分类-界面控件学习</title><link>http://www.cppblog.com/SpringSnow/category/7660.html</link><description>雪化了，花开了，春天来了</description><language>zh-cn</language><lastBuildDate>Fri, 25 Jul 2008 03:27:09 GMT</lastBuildDate><pubDate>Fri, 25 Jul 2008 03:27:09 GMT</pubDate><ttl>60</ttl><item><title>转载：VC中使用ListCtrl经验总结(1) </title><link>http://www.cppblog.com/SpringSnow/articles/57048.html</link><dc:creator>SpringSnow</dc:creator><author>SpringSnow</author><pubDate>Thu, 24 Jul 2008 05:04:00 GMT</pubDate><guid>http://www.cppblog.com/SpringSnow/articles/57048.html</guid><wfw:comment>http://www.cppblog.com/SpringSnow/comments/57048.html</wfw:comment><comments>http://www.cppblog.com/SpringSnow/articles/57048.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/SpringSnow/comments/commentRss/57048.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SpringSnow/services/trackbacks/57048.html</trackback:ping><description><![CDATA[<br>[作者]铁观音<br>[链接地址]http://www.cppblog.com/microli/articles/11499.html<br><br>ListCtrl在工作中，常常用到，也常常看到大家发帖问怎么用这个控件，
<p>故总结了一下自己的使用经验，以供参考使用。</p>
<p>　　先注明一下，这里，我们用m_listctrl来表示一个CListCtrl的类对象，</p>
<p>然后这里我们的ListCtrl都是report形式，至于其他的如什么大图标，小图标</p>
<p>的暂时不讲，毕竟report是大众话的使用。其次，我们这里用条款一，条款二</p>
<p>来描述第一点，第二点，这个是参照《Effective C++》的叫法，俺觉得这么</p>
<p>叫比较COOL :)</p>
<p>　条款一：设置ListCtrl的风格</p>
<p>　在CSDN上常常看到有人问怎么设置风格的，他们ListCtrl的样子是一个列表</p>
<p>，有横条和竖条分界线，然后选中一行，要整一行都选中，而不是只有某一列</p>
<p>被选中，等等，这里给一个比较全面的设置方法。</p>
<p>//获得原有风格<br>&nbsp;DWORD dwStyle = ::GetWindowLong(m_listctrl.m_hWnd, GWL_STYLE); <br>&nbsp;dwStyle &amp;= ~(LVS_TYPEMASK);<br>&nbsp;dwStyle &amp;= ~(LVS_EDITLABELS);</p>
<p>&nbsp;//设置新风格<br>&nbsp;&nbsp;&nbsp; SetWindowLong(m_listctrl.m_hWnd, GWL_STYLE, </p>
<p>dwStyle,|LVS_REPORT|LVS_NOLABELWRAP|LVS_SHOWSELALWAYS);</p>
<p><br>&nbsp;//设置扩展风格<br>&nbsp;DWORD styles = </p>
<p>LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES|LVS_EX_CHECKBOXES;</p>
<p>&nbsp;ListView_SetExtendedListViewStyleEx(m_listctrl.m_hWnd, styles, </p>
<p>styles );</p>
<p>其中LVS_EX_FULLROWSELECT　就是前面说得整行选中</p>
<p>LVS_EX_GRIDLINES　网格线（只适用与report风格的listctrl）</p>
<p>LVS_EX_CHECKBOXES　前面加个checkbox</p>
<p>pListCtrl-&gt;SetExtendedStyle(&nbsp; m_listctrl.GetExtendedStyle()</p>
<p>|LVS_EX_SUBITEMIMAGES);</p>
<p><br>这也是一个很重要的属性，这样的话，可以在列表中加ICON，记得windows的</p>
<p>任务管理器吗，你想做得那样，这个属性也要加哦，这个我以后会讲的～</p>
<p>条款二：加入列头</p>
<p>　　这是一个比较实质的东西，给列表框分列，然后加上列头</p>
<p>　　代码说话，来了</p>
<p>　　TCHAR rgtsz[2][10] = {_T("列头1"), _T("列头2")};<br>&nbsp;<br>&nbsp;LV_COLUMN lvcolumn;<br>&nbsp;CRect rect;<br>&nbsp;m_listctrl.GetWindowRect(&amp;rect);<br>&nbsp;for(int i=0;i&lt;2;i++)<br>&nbsp;{<br>&nbsp; 　lvcolumn.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT <br>&nbsp;&nbsp;&nbsp;&nbsp; 　　　　　　　　 | LVCF_WIDTH | LVCF_ORDER;<br>&nbsp; 　lvcolumn.fmt = LVCFMT_LEFT;<br>&nbsp; 　lvcolumn.pszText = rgtsz[i];<br>&nbsp;　 lvcolumn.iSubItem = i;<br>&nbsp; 　lvcolumn.iOrder = i;<br>&nbsp;　 if(i==0)<br>&nbsp; 　{<br>&nbsp;&nbsp; 　　　lvcolumn.cx = rect.Width()*3/5 ; <br>&nbsp;　 }<br>&nbsp;　 else<br>&nbsp;&nbsp; 　　lvcolumn.cx = rect.Width()*2/5;<br>&nbsp; 　　　　</p>
<p>　　　m_listctrl.InsertColumn(i, &amp;lvcolumn);<br>&nbsp;　}</p>
<p>这是插入两列的做法，你要插入20列？？随便你，依样画葫芦～～</p>
<p>　lvcolumn.mask 中那个mask可以有各种属性，具体去看msdn吧，</p>
<p>&nbsp;</p>
<p>条款三：把记录，插入列表框中</p>
<p>　int nIndex = m_listctrl.GetItemCount();</p>
<p>&nbsp; LV_ITEM&nbsp;&nbsp; lvitemAdd = {0};<br>&nbsp; lvitemAdd.mask = LVIF_TEXT;<br>&nbsp; lvitemAdd.iItem = nIndex ;<br>&nbsp; lvitemAdd.iSubItem = 0;<br>&nbsp; lvitemAdd.pszText =_T("毛毛1");;</p>
<p><br>&nbsp; if (m_listctrl.InsertItem(&amp;lvitemAdd) != -1)<br>&nbsp; { <br>&nbsp;&nbsp; LV_ITEM lvitem = {0};<br>&nbsp;&nbsp; lvitem.mask = LVIF_TEXT;<br>&nbsp;&nbsp; lvitem.iItem = nIndex ;<br>&nbsp;&nbsp; lvitem.iSubItem = 1;<br>&nbsp;<br>&nbsp;&nbsp; lvitem.pszText =_T("毛毛2");<br>&nbsp;&nbsp; m_listctrl.SetItem(&amp;lvitem);<br>&nbsp;&nbsp; <br>&nbsp; }</p>
<p>nIndex 是当前的行数，然后把新的一行，插在最下面，</p>
<p>&nbsp;</p>
<p>条款四：给列表中插入图标</p>
<p>　在report格式中，也能插入图标</p>
<p>　继续代码说话</p>
<p>　m_image是个CImageList对象</p>
<p>　m_image.Create(16,16, TRUE|ILC_COLOR24, 3, 1);</p>
<p>&nbsp;m_listctrl.SetImageList(&amp;m_image,LVSIL_SMALL);</p>
<p>然后调用CImageList的成员函数int CImageList::Add( HICON hIcon );</p>
<p>把ICON插入到imagelist，</p>
<p>　然后在插入记录的时候</p>
<p>　lvitemAdd.mask = LVIF_TEXT;　－》　lvitemAdd.mask = </p>
<p>LVIF_TEXT|LVIF_IMAGE</p>
<p>　然后添加一个lvitemAdd.iImage = n;</p>
<p>　这个n是imagelist中的序号，表示是具体的哪一个图标，list么，呵呵</p>
<p>&nbsp;</p>
<p>条款五：　插入记录时使用额外的信息，lParam 的使用</p>
<p>　　　有时候，你想对于某一行，加入一些额外的信息，那么就可以使用这个</p>
<p>lParam </p>
<p>　　ｍｓｄｎ是这么描述的Specifies the 32-bit value of the item</p>
<p>　　我上次是为了在某一行加入一个信息，窗口句柄，然后是这么加的，</p>
<p>　　int nIndex = m_listctrl.GetItemCount();</p>
<p>&nbsp; LV_ITEM&nbsp;&nbsp; lvitemAdd = {0};<br>&nbsp; lvitemAdd.mask = LVIF_TEXT|LVIF_IMAGE|LVIF_PARAM;<br>&nbsp; lvitemAdd.iItem = nIndex ;<br>&nbsp; lvitemAdd.iSubItem = 0;<br>&nbsp; lvitemAdd.pszText =_T("毛毛1");;</p>
<p>&nbsp; lvitemAdd.iImage = n;<br>&nbsp; lvitemAdd.lParam = (LPARAM)hwnd;(某个窗口的窗口句柄)</p>
<p><br>&nbsp; if (m_listctrl.InsertItem(&amp;lvitemAdd) != -1)<br>&nbsp; { <br>&nbsp;&nbsp; LV_ITEM lvitem = {0};<br>&nbsp;&nbsp; lvitem.mask = LVIF_TEXT;<br>&nbsp;&nbsp; lvitem.iItem = nIndex ;<br>&nbsp;&nbsp; lvitem.iSubItem = 1;<br>&nbsp;<br>&nbsp;&nbsp; lvitem.pszText =_T("毛毛2");<br>&nbsp;&nbsp; m_listctrl.SetItem(&amp;lvitem);<br>&nbsp;&nbsp; <br>&nbsp; }</p>
<p>ok，这是一个比较全的例子的，又插ICON，又使用PARAM的</p>
<p>条款六　：　点击列表框，获取选中行信息</p>
<p>　　响应NM_CLICK消息，如果你有MSDN，可以看到，有专门关于listview的</p>
<p>NM_CLICK的介绍</p>
<p>void CMyDlg::OnItemClick(NMHDR* pNMHDR, LRESULT* pResult) <br>{<br>&nbsp;// TODO: Add your control notification handler code here<br>&nbsp;int nItem = -1;<br>&nbsp;<br>&nbsp;LPNMITEMACTIVATE lpNMItemActivate = (LPNMITEMACTIVATE)pNMHDR;</p>
<p>&nbsp;if(lpNMItemActivate != NULL)<br>&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp; nItem = lpNMItemActivate-&gt;iItem;<br>&nbsp;}</p>
<p>} </p>
<p>现在nItem就是点击选中那行的index了，有了index，获取那行的信息还难吗</p>
<p>？</p>
<p>懒汉说：难，因为你还没讲，晕，那就继续说</p>
<p>&nbsp;</p>
<p>条款七：　根据行的index，获取该行的信息</p>
<p>　直接上代码吧</p>
<p>　LV_ITEM lvitem = {0};<br>&nbsp;&nbsp; lvitem.iItem = nIndex;<br>&nbsp;&nbsp; lvitem.iSubItem = 0;<br>&nbsp;&nbsp; lvitem.mask = LVIF_TEXT|LVIF_IMAGE|LVIF_PARAM;</p>
<p>m_listctrl.GetItem(&amp;lvitem)</p>
<p>这样，就把nindex,第一列的信息取出来了，包括刚才我们加入的ICON,和那个</p>
<p>额外信息（窗口句柄），</p>
<p>比如我要获取窗口句柄，就可以hwnd = (HWND)lvitem.lParam; </p>
<p>mask 用来指明你想获取那些信息</p>
<p>具体可以查msdn中LVITEM Structure的定义和CListCtrl::GetItem</p>
<p>&nbsp;</p>
<p>条款八：用程序选中某一行，使之选中</p>
<p>选中之　</p>
<p>m_listctrl.SetItemState</p>
<p>(nIndex,LVIS_SELECTED|LVIS_FOCUSED,LVIS_SELECTED|LVIS_FOCUSED);</p>
<p>不选中，取消选中之</p>
<p>m_listctrl.SetItemState(nIndex,0,LVIS_SELECTED|LVIS_FOCUSED);</p>
<p>&nbsp;</p>
<p>条款九：获取当前所有选中的行（多选）</p>
<p>　　这个，俺就比较懒了，抄msdn的代码吧，反正很简单</p>
<p>　　</p>
<p>Example<br>// CListCtrl* pListCtrl = (CListCtrl*) GetDlgItem</p>
<p>(IDC_YOURLISTCONTROL);<br>ASSERT(pListCtrl != NULL);</p>
<p>POSITION pos = pList-&gt;GetFirstSelectedItemPosition();<br>if (pos == NULL)<br>&nbsp;&nbsp; TRACE0("No items were selected!\n");<br>else<br>{<br>&nbsp; while (pos)<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp; int nItem = pList-&gt;GetNextSelectedItem(pos);<br>&nbsp;&nbsp;&nbsp;&nbsp; TRACE1("Item %d was selected!\n", nItem);<br>&nbsp;&nbsp;&nbsp;&nbsp; // you could do your own processing on nItem here<br>&nbsp; }<br>}</p>
<p>&nbsp;</p>
<p>条款十：删除条款九中选中的行</p>
<p>　　这个相对前面九个条款是比较麻烦的，因为如果你要删除多行的话。往往要出错</p>
<p>　　比如，我现在要删除第0行和第1行（列表的行序列是从0开始的）</p>
<p>　　那么好啊。我来删了</p>
<p>　　m_listctrl.DeleteItem(0)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_listctrl.DeleteItem(1)</p>
<p>　　恭喜你，错了，我好开心啊　：）</p>
<p>　　因为你删除第0行以后，下面的行会往上移，那么原来的第1行就变成了第0行，那么你再 m_listctrl.DeleteItem(1)，那么删除的是原来的第２行，真麻烦，</p>
<p>　　　所以，只有从下往上删，才是安全的，先删的，不会影响后面的操作，</p>
<p>　　　　m_listctrl.DeleteItem(1)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_listctrl.DeleteItem(0)</p>
<p>　　但有时候，我们也不知道要删除哪些行，只知道要删除选中的那些行，像条款九中的那些</p>
<p>　　　如果我们还是用</p>
<p>　　　</p>
<p>POSITION pos = m_listctrl.GetFirstSelectedItemPosition();<br>if (pos == NULL)<br>&nbsp;&nbsp; TRACE0("No items were selected!\n");<br>else<br>{<br>&nbsp; while (pos)<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp; int nItem = m_listctrl.GetNextSelectedItem(pos);<br>&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>　m_listctrl.DeleteItem(nItem );</p>
<p>&nbsp; }<br>}</p>
<p>你就等着收尸吧</p>
<p>这时候我们就要B4微软了，为虾米木有GetLastselectedItemPosition&nbsp;和GetPrevSelectedItem</p>
<p>多写一对成员函数会死啊　:(</p>
<p>　没办法，办法自己想，这里有个笨办法</p>
<p>　POSITION&nbsp; sSelPos = NULL;</p>
<p>&nbsp;while(sSelPos = m_listctrl.GetFirstSelectedItemPosition())<br>&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;int nSelItem = -1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;nSelItem = m_listctrl.GetNextSelectedItem(sSelPos);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(nSelItem &gt;= 0 &amp;&amp; nSelItem&lt;m_listctrl.GetItemCount())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 好了，这个nSelItem 就是我们要的DD</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>}</p>
<p>GetNextSelectedItem这个函数，看msdn的用法，其实是返回第一个的index，然后走到下一个选中的行去，所以这么做也是安全的，在实际中，俺也是这么做的，测试也通过，没问题的</p>
<p>当然，还有个办法，先通过GetFirstSelectedItemPosition和GetNextSelectedItem</p>
<p>来获取所有的选中行的index，然后把这些index放到一个数组里，然后再从下往上删</p>
<p>唉真麻烦啊，还要不定数组，不说用new在堆上开吧，那么一个vector总是要的吧，麻烦啊</p>
<p>所以我暂时是用上述的办法来删除，也供大家参考，希望能找到更好的办法。</p>
<p>&nbsp;</p>
<p>好了，今天就暂时先整理上述十点。listctrl其他高级的用法，网上资料也很多，我也暂时不总结，以后有机会再说吧。</p>
<p>搞了好长时间啊，要睡觉去了，累死了　：）</p>
<br>
<img src ="http://www.cppblog.com/SpringSnow/aggbug/57048.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/SpringSnow/" target="_blank">SpringSnow</a> 2008-07-24 13:04 <a href="http://www.cppblog.com/SpringSnow/articles/57048.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转载：CEdit &amp; CRichEdit 使用技巧</title><link>http://www.cppblog.com/SpringSnow/articles/57047.html</link><dc:creator>SpringSnow</dc:creator><author>SpringSnow</author><pubDate>Thu, 24 Jul 2008 05:01:00 GMT</pubDate><guid>http://www.cppblog.com/SpringSnow/articles/57047.html</guid><wfw:comment>http://www.cppblog.com/SpringSnow/comments/57047.html</wfw:comment><comments>http://www.cppblog.com/SpringSnow/articles/57047.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/SpringSnow/comments/commentRss/57047.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SpringSnow/services/trackbacks/57047.html</trackback:ping><description><![CDATA[<div class=postText>【原】CEdit &amp; CRichEdit 使用技巧<br>作者：lixiaosan<br>日期：04/07/2006<br><br><br>注：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_edit1代表ID为IDC_EDIT1的CEdit控件的control类型的变量<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_richedit1代表ID为IDC_RICHEDIT1的CRichEditCtrl控件的control类型的变量<br><br>
<hr style="WIDTH: 100%; HEIGHT: 2px">
<span style="COLOR: rgb(153,51,0)">1.设置edit只读属性<br><br></span>&nbsp;&nbsp;&nbsp; 方法一：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_edit1.SetReadOnly(TRUE);<br>&nbsp;&nbsp;&nbsp; 方法二：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ::SendMessage(m_edit1.m_hWnd, EM_SETREADONLY, TRUE, 0);<br><br>
<hr style="WIDTH: 100%; HEIGHT: 2px">
<span style="COLOR: rgb(153,51,0)">2.判断edit中光标状态并得到选中内容(richedit同样适用)<br><br></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int nStart, nEnd;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CString strTemp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_edit1.GetSel(nStart, nEnd);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(nStart == nEnd)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strTemp.Format(_T("光标在%d"), nStart);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AfxMessageBox(strTemp);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //得到edit选中的内容&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_edit1.GetWindowText(strTemp);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strTemp = strTemp.Mid(nStart) - strTemp.Mid(nEnd);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AfxMessageBox(strTemp); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; 注：GetSel后，如果nStart和nEnd，表明光标处于某个位置（直观来看就是光标在闪动）；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果nStart和nEnd不相等，表明用户在edit中选中了一段内容。<br><br>
<hr style="WIDTH: 100%; HEIGHT: 2px">
<span style="COLOR: rgb(153,51,0)">3.在edit最后添加字符串<br><br></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CString str;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_edit1.SetSel(-1, -1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_edit1.ReplaceSel(str);<br><br>
<hr style="WIDTH: 100%; HEIGHT: 2px">
<span style="COLOR: rgb(153,51,0)">4.随输入自动滚动到最后一行(richedit同样适用)<br><br></span>&nbsp;&nbsp;&nbsp; 方法一：（摘自msdn）<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // The pointer to my edit.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; extern CEdit* pmyEdit;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int nFirstVisible = pmyEdit-&gt;GetFirstVisibleLine();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Scroll the edit control so that the first visible line<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // is the first line of text.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (nFirstVisible &gt; 0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pmyEdit-&gt;LineScroll(-nFirstVisible, 0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; 方法二：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_richedit.PostMessage(WM_VSCROLL, SB_BOTTOM, 0);<br><br>
<hr style="WIDTH: 100%; HEIGHT: 2px">
<span style="COLOR: rgb(153,51,0)">5.如何限制edit输入指定字符<br><br></span>&nbsp;&nbsp; 可以从CEdit派生一个类，添加WM_CHAR消息映射。下面一个例子实现了限定输入16进制字符的功能。<br><br>&nbsp;&nbsp; void CMyHexEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)&nbsp; <br>&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( (nChar &gt;= '0' &amp;&amp; nChar &lt;= '9') || <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (nChar &gt;= 'a' &amp;&amp; nChar &lt;= 'f') || <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; (nChar &gt;= 'A' &amp;&amp; nChar &lt;= 'F') || <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nChar == VK_BACK ||&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nChar == VK_DELETE)&nbsp;&nbsp;&nbsp; //msdn的virtual key<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CEdit::OnChar(nChar, nRepCnt, nFlags); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; }<br><br>
<hr style="WIDTH: 100%; HEIGHT: 2px">
<span style="COLOR: rgb(153,51,0)">6.如何使用richedit<br><br></span>&nbsp;&nbsp;&nbsp; 添加AfxInitRichEdit();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CxxxApp::InitInstance()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AfxInitRichEdit();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .............<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp; AfxInitRichEdit()功能：装载 RichEdit 1.0 Control (RICHED32.DLL).<br><br>
<hr style="WIDTH: 100%; HEIGHT: 2px">
<span style="COLOR: rgb(153,51,0)">7.如何使用richedit2.0 or richedit3.0<br><br></span>&nbsp;&nbsp;&nbsp; 使用原因：由于RichEdit2.0A自动为宽字符（WideChar），所以它可以解决中文乱码以及一些汉字问题<br><br>&nbsp;&nbsp;&nbsp; 方法一：（msdn上的做法，适用于用VC.NET及以后版本创建的工程）<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; To update rich edit controls in existing Visual C++ applications to version 2.0,<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; open the .RC file as text, change the class name of each rich edit control from&nbsp;&nbsp; "RICHEDIT" to&nbsp; "RichEdit20a". <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Then replace the call to AfxInitRichEdit with AfxInitRichEdit2.<br>&nbsp;&nbsp;&nbsp; 方法二：以对话框为例：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (1)&nbsp;&nbsp;&nbsp; 增加一全局变量 HMODULE hMod;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (2)&nbsp;&nbsp;&nbsp; 在CxxxApp::InitInstance()中添加一句hMod = LoadLibrary(_T("riched20.dll"));<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; 在CxxxApp::ExitInstance()中添加一句FreeLibrary(hMod);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; (3)&nbsp;&nbsp;&nbsp; &nbsp; 在对话框上放一个richedit，文本方式打开.rc文件修改该richedit控件的类名"RICHEDIT" to&nbsp; "RichEdit20a".<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; (4)&nbsp;&nbsp;&nbsp; &nbsp; 在对话框头文件添加 CRichEditCtrl m_richedit;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; 在OnInitDialog中添加 m_richedit.SubclassDlgItem(IDC_RICHEDIT1, this);<br><br>
<hr style="WIDTH: 100%; HEIGHT: 2px">
<span style="COLOR: rgb(153,51,0)">8.改变richedit指定区域的颜色及字体<br><br></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CHARFORMAT cf;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ZeroMemory(&amp;cf, sizeof(CHARFORMAT));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cf.cbSize = sizeof(CHARFORMAT);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cf.dwMask = CFM_BOLD | CFM_COLOR | CFM_FACE |<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CFM_ITALIC | CFM_SIZE | CFM_UNDERLINE;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cf.dwEffects = 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cf.yHeight = 12*12;//文字高度<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cf.crTextColor = RGB(200, 100, 255); //文字颜色<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strcpy(cf.szFaceName ,_T("隶书"));//设置字体<br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_richedit1.SetSel(1, 5); //设置处理区域<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_richedit1.SetSelectionCharFormat(cf);<br><br>
<hr style="WIDTH: 100%; HEIGHT: 2px">
<span style="COLOR: rgb(153,51,0)">9.设置行间距（只适用于richedit2.0）<br><br></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PARAFORMAT2 pf;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pf2.cbSize = sizeof(PARAFORMAT2);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pf2.dwMask = PFM_LINESPACING | PFM_SPACEAFTER;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pf2.dyLineSpacing = 200;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pf2.bLineSpacingRule&nbsp; = 4;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_richedit.SetParaFormat(pf2);<br><br>
<hr style="WIDTH: 100%; HEIGHT: 2px">
<span style="COLOR: rgb(153,51,0)">10.richedit插入位图<br><br></span>Q220844：How to insert a bitmap into an RTF document using the RichEdit control in Visual C++ 6.0<br><a href="http://support.microsoft.com/default.aspx?scid=kb;en-us;220844"><font color=#0000ff><u>http://support.microsoft.com/default.aspx?scid=kb;en-us;220844</u></font></a><br><a href="http://www.codeguru.com/Cpp/controls/richedit/article.php/c2417/"><font color=#0000ff><u>http://www.codeguru.com/Cpp/controls/richedit/article.php/c2417/</u></font></a><br><a href="http://www.codeguru.com/Cpp/controls/richedit/article.php/c5383/"><u><font color=#0000ff>http://www.codeguru.com/Cpp/controls/richedit/article.php/c5383/</font></u></a><br><br><u><font color=#0000ff>
<hr style="WIDTH: 100%; HEIGHT: 2px">
</font></u><span style="COLOR: rgb(153,51,0)">11.richedit插入gif动画<br><a href="http://www.codeproject.com/richedit/AnimatedEmoticon.asp"><br></a></span><a href="javascript:void(0);/*1144809701660*/"><u><font color=#0000ff>http://www.codeproject.com/richedit/AnimatedEmoticon.asp</font></u></a><br><br><u><font color=#0000ff>
<hr style="WIDTH: 100%; HEIGHT: 2px">
</font></u><span style="COLOR: rgb(153,51,0)">12.richedit嵌入ole对象<br><br></span><a href="http://support.microsoft.com/kb/141549/en-us"><u><font color=#0000ff>http://support.microsoft.com/kb/141549/en-us</font></u></a><br><br><u><font color=#0000ff>
<hr style="WIDTH: 100%; HEIGHT: 2px">
</font></u><span style="COLOR: rgb(153,51,0)">13.使richedit选中内容只读<br><br></span><a href="http://www.codeguru.com/cpp/controls/richedit/article.php/c2401/"><u><font color=#0000ff>http://www.codeguru.com/cpp/controls/richedit/article.php/c2401/</font></u></a><br><br><u><font color=#0000ff>
<hr style="WIDTH: 100%; HEIGHT: 2px">
</font></u><span style="COLOR: rgb(153,51,0)">14.打印richedit</span><span style="COLOR: rgb(0,0,0)"><br><br><a href="http://www.protext.com/MFC/RichEdit3.htm"><u><font color=#0000ff>http://www.protext.com/MFC/RichEdit3.htm</font></u></a></span><br><a href="http://www.protext.com/MFC/RichEdit3.htm"><span style="COLOR: rgb(0,0,0)"></span></a><br><u><font color=#0000ff>
<hr style="WIDTH: 100%; HEIGHT: 2px">
</font></u><span style="COLOR: rgb(153,51,0)">15.richeidt用于聊天消息窗口<br><br></span><a href="http://www.vckbase.com/document/viewdoc/?id=1087"><font color=#0000ff><u>http://www.vckbase.com/document/viewdoc/?id=1087</u></font></a><br><a href="http://www.codeproject.com/richedit/chatrichedit.asp"><font color=#0000ff><u>http://www.codeproject.com/richedit/chatrichedit.asp</u></font></a><br><a href="http://www.codeguru.com/Cpp/controls/richedit/article.php/c2395/"><u><font color=#0000ff>http://www.codeguru.com/Cpp/controls/richedit/article.php/c2395/</font></u></a><br><br><u><font color=#0000ff>
<hr style="WIDTH: 100%; HEIGHT: 2px">
</font></u><span style="COLOR: rgb(153,51,0)">16.解决richedit的EN_SETFOCUS和EN_KILLFOCUS无响应的问题<br><br></span><a href="http://support.microsoft.com/kb/181664/en-us"><u><font color=#0000ff>http://support.microsoft.com/kb/181664/en-us</font></u></a><br><br><u><font color=#0000ff>
<hr style="WIDTH: 100%; HEIGHT: 2px">
</font></u><span style="COLOR: rgb(153,51,0)">17.richedit拼写检查<br><br></span><a href="http://www.codeproject.com/com/AutoSpellCheck.asp"><u><font color=#0000ff>http://www.codeproject.com/com/AutoSpellCheck.asp</font></u></a><br><br><u><font color=#0000ff>
<hr style="WIDTH: 100%; HEIGHT: 2px">
</font></u><span style="COLOR: rgb(153,51,0)">18.改变edit背景色<br><br></span>Q117778：How to change the background color of an MFC edit control<br><a href="http://support.microsoft.com/kb/117778/en-us"><u><font color=#810081>http://support.microsoft.com/kb/117778/en-us</font></u></a><br><br><u><font color=#810081>
<hr style="WIDTH: 100%; HEIGHT: 2px">
</font></u><span style="COLOR: rgb(153,51,0)">19.当edit控件的父窗口属性是带标题栏WS_CAPTION和子窗口WS_CHILD时，不能设置焦点SetFocus<br><br></span>Q230587：PRB: Can't Set Focus to an Edit Control When its Parent Is an Inactive Captioned Child Window<br style="COLOR: rgb(153,51,0)"><span style="COLOR: rgb(153,51,0)"><a href="http://support.microsoft.com/kb/230587/en-us"><u><span style="COLOR: rgb(153,51,0)">http://support.microsoft.com/kb/230587/en-us</span><br style="COLOR: rgb(153,51,0)"></u></a></span><br><u>
<hr style="WIDTH: 100%; HEIGHT: 2px">
</u><span style="COLOR: rgb(153,51,0)">20. 在Edit中回车时，会退出对话框&nbsp; </span><br><br>选中Edit的风格Want Return。<br><br>MSDN的解释如下：<br><font size=+0><font face=verdana,arial,helvetica size=2><strong>ES_WANTRETURN</strong>&nbsp;&nbsp;&nbsp;Specifies that a carriage return be inserted when the user presses the ENTER key while entering text into a multiple-line edit control in a dialog box. Without this style, pressing the ENTER key has the same effect as pressing the dialog box's default pushbutton. This style has no effect on a single-line edit control.<br><br></font></font>
<hr style="WIDTH: 100%; HEIGHT: 2px">
<span style="COLOR: rgb(153,51,0)">21. 动态创建的edit没有边框的问题</span><br><br>&nbsp;&nbsp;&nbsp; m_edit.Create(....);<br>&nbsp;&nbsp;&nbsp; m_edit.ModifyStyleEx(0, WS_EX_CLIENTEDGE, SWP_DRAWFRAME);<br>
<hr style="WIDTH: 100%; HEIGHT: 2px">
<span style="COLOR: rgb(153,51,0)">22. 一个能显示RTF，ole（包括gif， wmv，excel ，ppt）的例子</span><br><br><a href="http://www.codeproject.com/richedit/COleRichEditCtrl.asp"><u><font color=#0000ff>http://www.codeproject.com/richedit/COleRichEditCtrl.asp</font></u></a></div>
<img src ="http://www.cppblog.com/SpringSnow/aggbug/57047.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/SpringSnow/" target="_blank">SpringSnow</a> 2008-07-24 13:01 <a href="http://www.cppblog.com/SpringSnow/articles/57047.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>