﻿<?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++博客-远风工作室-随笔分类-MFC</title><link>http://www.cppblog.com/amazon/category/8952.html</link><description /><language>zh-cn</language><lastBuildDate>Sat, 01 Oct 2011 07:42:49 GMT</lastBuildDate><pubDate>Sat, 01 Oct 2011 07:42:49 GMT</pubDate><ttl>60</ttl><item><title>"编程之美 - CPU占用率"总结</title><link>http://www.cppblog.com/amazon/archive/2009/08/31/94885.html</link><dc:creator>远风</dc:creator><author>远风</author><pubDate>Mon, 31 Aug 2009 07:49:00 GMT</pubDate><guid>http://www.cppblog.com/amazon/archive/2009/08/31/94885.html</guid><wfw:comment>http://www.cppblog.com/amazon/comments/94885.html</wfw:comment><comments>http://www.cppblog.com/amazon/archive/2009/08/31/94885.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/amazon/comments/commentRss/94885.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/amazon/services/trackbacks/94885.html</trackback:ping><description><![CDATA[<p>下面是一些了解当前线程/进程/系统效能的API，所有描述来自MSDN文档，具体如下：<br><br><strong>DWORD GetTickCount(void);</strong><br>/*<br>Header: Winbase.h, include Windows.h<br>Link Library: Kernel32.lib<br>DLL: Dernel32.dll<br>Details:<br>The GetTickCount function retrieves the number of milliseconds that have elapsed since the system was started. It is limited to the resolution of the system timer. To obtain the system timer resolution, use the GetSystemTimeAdjustment function.<br>Remarks:<br>The elapsed time is stored as a DWORD value. Therefore, the time will wrap around to zero if the system is run continuously for 49.7 days.<br>Example Code:<br>The following example demonstrates how to use a this function to wait for a time interval to pass. Due to the nature of unsigned arithmetic, this code works correctly if the return value wraps one time. If the difference between the two calls to GetTickCount is more than 49.7 days, the return value could wrap more than one time and this code will not work.<br>DWORD dwStart = GetTickCount();<br>if( GetTickCount() - dwStart &gt;= TIMELIMIT )<br>&nbsp;&nbsp;&nbsp; Cancel();<br>*/<br><br><strong>void Sleep(DWORD dwMilliseconds);</strong><br>/*<br>Header: Winbase.h, include Windows.h<br>Library: Kernel32.lib<br>DLL: Kernel32.dll<br>Details:<br>This function suspends the execution of the current thread for a specified interval.<br>Parameters:<br>Specifies the time, in milliseconds, for which to suspend execution. <br>A value of zero causes the thread to relinquish the remainder of its time slice to any other thread of equal priority that is ready to run. If no other threads of equal priority are ready to run, the function returns immediately, and the thread continues execution. <br>A value of INFINITE causes an infinite delay.<br>Remarks:<br>You have to be careful when using Sleep and code that directly or indirectly creates windows. If a thread creates any windows, it must process messages. Message broadcasts are sent to all windows in the system. If you have a thread that uses Sleep with infinite delay, the system will deadlock. Therefore, if you have a thread that creates windows, use MsgWaitForMultipleObjects or MsgWaitForMultipleObjectsEx, rather than Sleep.<br>*/<br><br><strong>DWORD WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseconds);</strong><br>/*<br>Header: Winbase.h, include Windows.h<br>Library: Kernel32.lib<br>DLL: Kernel32.dll<br>Details:<br>The WaitForSingleObject function returns when the specified object is in the signaled state or the time-out interval elapses.<br>Parameters:<br>hHandle: <br>Handle to the object. If this handle is closed while the wait is still pending, the function's behavior is undefined.<br>dwMilliseconds: <br>Time-out interval, in milliseconds. The function returns if the interval elapses, even if the object's state is nonsignaled. If dwMilliseconds is zero, the function tests the object's state and returns immediately. If dwMilliseconds is INFINITE, the function's time-out interval never elapses.<br>Return Values:<br>If the function succeeds, the return value indicates the event that caused the function to return. It can be one of the following values.<br>WAIT_ABANDONED：当hHandle为mutex时，如果拥有mutex的线程在结束时没有释放核心对象会引发此返回值。<br>WAIT_OBJECT_0：核心对象已被激活<br>WAIT_TIMEOUT：等待超时<br>WAIT_FAILED：出现错误，可通过GetLastError得到错误代码<br>Remarks:<br>The WaitForSingleObject function checks the current state of the specified object. If the object's state is nonsignaled, the calling thread enters the wait state. It uses no processor time while waiting for the object state to become signaled or the time-out interval to elapse.<br>The function modifies the state of some types of synchronization objects. Modification occurs only for the object whose signaled state caused the function to return. For example, the count of a semaphore object is decreased by one.<br>*/<br><br><strong>HRESULT GetProcessorInfo(WORD* pwProcessorArchitectureOut, WORD* pwProcessorLevelOut);</strong><br>/*<br>DLL: Clcfgsrv.dll<br>Details:<br>The GetProcessorInfo method retrieves the processor information for the node.<br>Parameters:<br>pwProcessorArchitectureOut: Processor architecture information. <br>pwProcessorLevelOut: Processor level information.<br>*/</p>
<p><strong>DWORD_PTR SetThreadAffinityMask(HANDLE hThread, DWORD_PTR dwThreadAffinityMask);</strong><br>/*<br>Header: Winbase.h, include Windows.h<br>DLL: Kernel32.dll<br>Library: Kernel32.lib<br>Details:<br>The SetThreadAffinityMask function sets a processor affinity mask for the specified thread.<br>Return Values:<br>If the function succeeds, the return value is the thread's previous affinity mask. Windows Me/98/95: The return value is 1. To succeed, hThread must be valid and dwThreadAffinityMask must be 1.<br>If the function fails, the return value is zero. To get extended error information, call GetLastError.<br>Remarks:<br>A thread affinity mask is a bit vector in which each bit represents the processors that a thread is allowed to run on.<br>A thread affinity mask must be a proper subset of the process affinity mask for the containing process of a thread. A thread is only allowed to run on the processors its process is allowed to run on.<br>*/</p>
<p><strong>DWORD timeGetTime(VOID);</strong><br>/*<br>Header: Mmsystem.h, include Windows.h<br>Library: Winmm.lib<br>Details:<br>The timeGetTime function retrieves the system time, in milliseconds. The system time is the time elapsed since Windows was started.<br>Remarks:<br>The only difference between this function and the timeGetSystemTime function is that timeGetSystemTime uses the MMTIME structure to return the system time. The timeGetTime function has less overhead than timeGetSystemTime.<br>Note that the value returned by the timeGetTime function is a DWORD value. The return value wraps around to 0 every 2^32 milliseconds, which is about 49.71 days. This can cause problems in code that directly uses the timeGetTime return value in computations, particularly where the value is used to control code execution. You should always use the difference between two timeGetTime return values in computations.<br>*/</p>
<p><strong>MMRESULT timeGetSystemTime(LPMMTIME pmmt, UINT cbmmt);</strong><br>/*<br>Header: Mmsystem.h, include Windows.h<br>Library: Winmm.lib<br>Details:<br>The timeGetSystemTime function retrieves the system time, in milliseconds. The system time is the time elapsed since Windows was started. This function works very much like the timeGetTime function. See timeGetTime for details of these functions' operation.<br>Parameters:<br>pmmt:&nbsp; Pointer to an MMTIME structure.<br>cbmmt: Size, in bytes, of the MMTIME structure.<br>Return Values:<br>Returns TIMERR_NOERROR. The system time is returned in the ms member of the MMTIME structure.<br>*/<br><br>在使用Windows.h中定义：<br>typedef unsigned long&nbsp; DWORD;<br>typedef unsigned char&nbsp; BYTE;<br>typedef unsigned short WORD;<br>typedef unsigned int&nbsp;UINT;<br><br></p>
<img src ="http://www.cppblog.com/amazon/aggbug/94885.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/amazon/" target="_blank">远风</a> 2009-08-31 15:49 <a href="http://www.cppblog.com/amazon/archive/2009/08/31/94885.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VC中ListCtrl经验总结【转载】</title><link>http://www.cppblog.com/amazon/archive/2008/11/29/68159.html</link><dc:creator>远风</dc:creator><author>远风</author><pubDate>Sat, 29 Nov 2008 06:27:00 GMT</pubDate><guid>http://www.cppblog.com/amazon/archive/2008/11/29/68159.html</guid><wfw:comment>http://www.cppblog.com/amazon/comments/68159.html</wfw:comment><comments>http://www.cppblog.com/amazon/archive/2008/11/29/68159.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/amazon/comments/commentRss/68159.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/amazon/services/trackbacks/68159.html</trackback:ping><description><![CDATA[ListCtrl在工作中，常常用到，也常常看到大家发帖问怎么用这个控件，故总结了一下自己的使用经验，以供参考使用。<br><br>先注明一下，这里，我们用m_listctrl来表示一个CListCtrl的类对象，然后这里我们的ListCtrl都是report形式，至于其他的如什么大图标，小图标的暂时不讲，毕竟report是大众话的使用。其次，我们这里用条款一，条款二来描述第一点，第二点，这个是参照《Effective C++》的叫法，俺觉得这么叫比较COOL :)<br><br><strong>条款一：设置ListCtrl的风格</strong><br><br>在CSDN上常常看到有人问怎么设置风格的，他们ListCtrl的样子是一个列表，有横条和竖条分界线，然后选中一行，要整一行都选中，而不是只有某一列被选中，等等，这里给一个比较全面的设置方法。<br><br>//获得原有风格<br>DWORD dwStyle = ::GetWindowLong(m_listctrl.m_hWnd, GWL_STYLE); <br>dwStyle &amp;= ~(LVS_TYPEMASK);<br>dwStyle &amp;= ~(LVS_EDITLABELS);<br>//设置新风格<br>SetWindowLong(m_listctrl.m_hWnd, GWL_STYLE,dwStyle, |LVS_REPORT | LVS_NOLABELWRAP | LVS_SHOWSELALWAYS);<br>//设置扩展风格<br>DWORD styles = LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES|LVS_EX_CHECKBOXES;<br>ListView_SetExtendedListViewStyleEx(m_listctrl.m_hWnd, styles, styles );<br><br>其中LVS_EX_FULLROWSELECT　就是前面说得整行选中<br>LVS_EX_GRIDLINES　网格线（只适用与report风格的listctrl）<br>LVS_EX_CHECKBOXES　前面加个checkbox<br>pListCtrl-&gt;SetExtendedStyle( m_listctrl.GetExtendedStyle() | LVS_EX_SUBITEMIMAGES);<br><br>这也是一个很重要的属性，这样的话，可以在列表中加ICON，记得windows的任务管理器吗，你想做得那样，这个属性也要加哦，这个我以后会讲的～<br><br><strong>条款二：加入列头<br><br></strong>这是一个比较实质的东西，给列表框分列，然后加上列头，代码说话，来了<br><br>TCHAR rgtsz[2][10] = {_T("列头1"), _T("列头2")};<br>LV_COLUMN lvcolumn;<br>CRect rect;<br>m_listctrl.GetWindowRect(&amp;rect);<br>for(int i=0;i&lt;2;i++)<br>{<br>　lvcolumn.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH | LVCF_ORDER;<br>　lvcolumn.fmt = LVCFMT_LEFT;<br>　lvcolumn.pszText = rgtsz[i];<br>　lvcolumn.iSubItem = i;<br>　lvcolumn.iOrder = i;<br>　if(i==0)<br>　{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lvcolumn.cx = rect.Width()*3/5 ; <br>　}<br>　else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lvcolumn.cx = rect.Width()*2/5;<br><br>&nbsp;&nbsp;&nbsp; m_listctrl.InsertColumn(i, &amp;lvcolumn);<br>}<br><br>这是插入两列的做法，你要插入20列？？随便你，依样画葫芦～～<br>lvcolumn.mask 中那个mask可以有各种属性，具体去看msdn吧，<br><br><strong>条款三：把记录，插入列表框中<br><br></strong>int nIndex = m_listctrl.GetItemCount();<br>LV_ITEM&nbsp;&nbsp; lvitemAdd = {0};<br>lvitemAdd.mask = LVIF_TEXT;<br>lvitemAdd.iItem = nIndex ;<br>lvitemAdd.iSubItem = 0;<br>lvitemAdd.pszText =_T("毛毛1");;<br><br>if (m_listctrl.InsertItem(&amp;lvitemAdd) != -1)<br>{ <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><br>&nbsp;&nbsp; lvitem.pszText =_T("毛毛2");<br>&nbsp;&nbsp; m_listctrl.SetItem(&amp;lvitem);&nbsp;&nbsp; <br>}<br><br>nIndex 是当前的行数，然后把新的一行，插在最下面，<br><br><strong>条款四：给列表中插入图标<br><br></strong>在report格式中，也能插入图标<br>继续代码说话<br><br>m_image是个CImageList对象<br>m_image.Create(16,16, TRUE|ILC_COLOR24, 3, 1);<br>m_listctrl.SetImageList(&amp;m_image,LVSIL_SMALL);<br><br>然后调用CImageList的成员函数int CImageList::Add( HICON hIcon );<br>把ICON插入到imagelist，<br>然后在插入记录的时候<br><br>lvitemAdd.mask = LVIF_TEXT;　<br>lvitemAdd.mask = LVIF_TEXT|LVIF_IMAGE<br><br>然后添加一个lvitemAdd.iImage = n;<br>这个n是imagelist中的序号，表示是具体的哪一个图标，list么，呵呵<br><br><strong>条款五：插入记录时使用额外的信息，lParam 的使用<br><br></strong>有时候，你想对于某一行，加入一些额外的信息，那么就可以使用这个lParam<br>msdn是这么描述的Specifies the 32-bit value of the item<br>我上次是为了在某一行加入一个信息，窗口句柄，然后是这么加的，<br><br>int nIndex = m_listctrl.GetItemCount();<br>LV_ITEM&nbsp;&nbsp; lvitemAdd = {0};<br>lvitemAdd.mask = LVIF_TEXT|LVIF_IMAGE|LVIF_PARAM;<br>lvitemAdd.iItem = nIndex ;<br>lvitemAdd.iSubItem = 0;<br>lvitemAdd.pszText =_T("毛毛1");;<br>lvitemAdd.iImage = n;<br>lvitemAdd.lParam = (LPARAM)hwnd;(某个窗口的窗口句柄)<br><br>if (m_listctrl.InsertItem(&amp;lvitemAdd) != -1)<br>{ <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><br>&nbsp;&nbsp; lvitem.pszText =_T("毛毛2");<br>&nbsp;&nbsp; m_listctrl.SetItem(&amp;lvitem);&nbsp;&nbsp; <br>}<br><br>ok，这是一个比较全的例子的，又插ICON，又使用PARAM的<br><br><strong>条款六　：　点击列表框，获取选中行信息<br><br></strong>响应NM_CLICK消息，如果你有MSDN，可以看到，有专门关于listview的NM_CLICK的介绍<br><br>void CMyDlg::OnItemClick(NMHDR* pNMHDR, LRESULT* pResult) <br>{<br>&nbsp;&nbsp;&nbsp;// TODO: Add your control notification handler code here<br>&nbsp;&nbsp;&nbsp;int nItem = -1;<br><br>&nbsp;&nbsp;&nbsp;LPNMITEMACTIVATE lpNMItemActivate = (LPNMITEMACTIVATE)pNMHDR;<br>&nbsp;&nbsp;&nbsp;if(lpNMItemActivate != NULL)<br>&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nItem = lpNMItemActivate-&gt;iItem;<br>&nbsp;&nbsp;&nbsp;}<br>}<br><br>现在nItem就是点击选中那行的index了，有了index，获取那行的信息还难吗<br>懒汉说：难，因为你还没讲，晕，那就继续说<br><br><strong>条款七：　根据行的index，获取该行的信息<br><br></strong>直接上代码吧<br><br>LV_ITEM lvitem = {0};<br>lvitem.iItem = nIndex;<br>lvitem.iSubItem = 0;<br>lvitem.mask = LVIF_TEXT|LVIF_IMAGE|LVIF_PARAM;<br>m_listctrl.GetItem(&amp;lvitem)<br><br>这样，就把nindex,第一列的信息取出来了，包括刚才我们加入的ICON,和那个额外信息（窗口句柄），比如我要获取窗口句柄，就可以hwnd = (HWND)lvitem.lParam;<br>mask 用来指明你想获取那些信息<br>具体可以查msdn中LVITEM Structure的定义和CListCtrl::GetItem<br><br><strong>条款八：用程序选中某一行，使之选中<br><br></strong>选中之　<br>m_listctrl.SetItemState(nIndex,LVIS_SELECTED|LVIS_FOCUSED,LVIS_SELECTED|LVIS_FOCUSED);<br>不选中，取消选中之<br>m_listctrl.SetItemState(nIndex,0,LVIS_SELECTED|LVIS_FOCUSED);<br><br><strong>条款九：获取当前所有选中的行（多选）<br><br></strong>这个，俺就比较懒了，抄msdn的代码吧，反正很简单<br><br>// CListCtrl* pListCtrl = (CListCtrl*) GetDlgItem<br>(IDC_YOURLISTCONTROL);<br>ASSERT(pListCtrl != NULL);
<p>POSITION pos = pList-&gt;GetFirstSelectedItemPosition();<br>if (pos == NULL)<br>&nbsp;&nbsp; TRACE0("No items were selected!\n");<br>else<br>{<br>&nbsp;&nbsp;&nbsp;while (pos)<br>&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int nItem = pList-&gt;GetNextSelectedItem(pos);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TRACE1("Item %d was selected!\n", nItem);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // you could do your own processing on nItem here<br>&nbsp;&nbsp;&nbsp;}<br>}<br><br><strong>条款十：删除条款九中选中的行<br><br></strong>这个相对前面九个条款是比较麻烦的，因为如果你要删除多行的话，往往要出错。比如，我现在要删除第0行和第1行（列表的行序列是从0开始的）<br>那么好啊。我来删了<br><br>m_listctrl.DeleteItem(0)<br>m_listctrl.DeleteItem(1)<br><br>恭喜你，错了，我好开心啊　：）<br>因为你删除第0行以后，下面的行会往上移，那么原来的第1行就变成了第0行，那么你再 m_listctrl.DeleteItem(1)，那么删除的是原来的第２行，真麻烦，<br>所以，只有从下往上删，才是安全的，先删的，不会影响后面的操作，<br><br>m_listctrl.DeleteItem(1)<br>m_listctrl.DeleteItem(0)<br><br>但有时候，我们也不知道要删除哪些行，只知道要删除选中的那些行，像条款九中的那些<br>如果我们还是用<br><br>POSITION pos = m_listctrl.GetFirstSelectedItemPosition();<br>if (pos == NULL)<br>&nbsp;&nbsp; TRACE0("No items were selected!\n");<br>else<br>{<br>&nbsp;&nbsp;&nbsp;while (pos)<br>&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int nItem = m_listctrl.GetNextSelectedItem(pos);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_listctrl.DeleteItem(nItem );</p>
<p>&nbsp;&nbsp;&nbsp;}<br>}<br><br>你就等着收尸吧<br>这时候我们就要B4微软了，为虾米木有GetLastselectedItemPosition 和GetPrevSelectedItem，多写一对成员函数会死啊　:(<br>没办法，办法自己想，这里有个笨办法<br><br>POSITION sSelPos = NULL;<br>while(sSelPos = m_listctrl.GetFirstSelectedItemPosition())<br>{<br>&nbsp;&nbsp;&nbsp;int nSelItem = -1;<br>&nbsp;&nbsp;&nbsp;nSelItem = m_listctrl.GetNextSelectedItem(sSelPos);<br>&nbsp;&nbsp;&nbsp;if(nSelItem &gt;= 0 &amp;&amp; nSelItem&lt;m_listctrl.GetItemCount())<br>&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//好了，这个nSelItem 就是我们要的DD<br>&nbsp;&nbsp;&nbsp;}<br>}<br><br>GetNextSelectedItem这个函数，看msdn的用法，其实是返回第一个的index，然后走到下一个选中的行去，所以这么做也是安全的，在实际中，俺也是这么做的，测试也通过，没问题的<br>当然，还有个办法，先通过GetFirstSelectedItemPosition和GetNextSelectedItem来获取所有的选中行的index，然后把这些index放到一个数组里，然后再从下往上删<br>唉真麻烦啊，还要不定数组，不说用new在堆上开吧，那么一个vector总是要的吧，麻烦啊，所以我暂时是用上述的办法来删除，也供大家参考，希望能找到更好的办法。<br><br>好了，今天就暂时先整理上述十点。listctrl其他高级的用法，网上资料也很多，我也暂时不总结，以后有机会再说吧。<br></p>
  <img src ="http://www.cppblog.com/amazon/aggbug/68159.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/amazon/" target="_blank">远风</a> 2008-11-29 14:27 <a href="http://www.cppblog.com/amazon/archive/2008/11/29/68159.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>个性控制对话框上的控件显示【转载】</title><link>http://www.cppblog.com/amazon/archive/2008/11/29/68155.html</link><dc:creator>远风</dc:creator><author>远风</author><pubDate>Sat, 29 Nov 2008 05:36:00 GMT</pubDate><guid>http://www.cppblog.com/amazon/archive/2008/11/29/68155.html</guid><wfw:comment>http://www.cppblog.com/amazon/comments/68155.html</wfw:comment><comments>http://www.cppblog.com/amazon/archive/2008/11/29/68155.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/amazon/comments/commentRss/68155.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/amazon/services/trackbacks/68155.html</trackback:ping><description><![CDATA[<p>如何个性控制对话框上的控件显示？涉及到这方面的知识实在太多，限于个人能力，我也不能在这里非常全面的介绍了，本文主要介绍日常最常用的几个功能：控件背景色设定、控件字体显示、控件字色显示、控件的亮\灰显示。而这里的控件，也主要就介绍静态控件、文本框控件、check控件，按钮控件等。<br><br>众所周知，在VC中做界面几乎是所有工具中最艰难的一种（当然，如果是骨灰级的高手，那就变成&#8220;VC是做界面最丰富多彩的开发工具&#8221;了，我肯定离那境界还有好几个十万八千里！）。而VC中的界面，大多由对话框界面组成，所以包括本人在内，相信很多人都有感慨，要是VC的对话框能够随心所欲的定制该多好啊？？在别的地方也看过一些换肤软件，总感觉不好使，当然，看到金山、瑞星那种界面就很向往了，可惜是只可YY想一下，就我个人而言，是不太可能一个人实现的。<br><br>言归正传，就我个人的使用和实践而言，在对话框中，不写派生类的情况下，可以简单实现一些控件的背景色、字体显示什么的属性，零零岁岁的装饰一下，也可以稍微美化一下我们自己的软件界面了。下面简单说明一下实现过程：<br><br>对话框中所有控件，着色显示都需要重载函数WM_CTRCOLOR，它一般生成以下的成员函数，在这个里面实现几乎所有本文要说到的控件操作。<br>OnCtrColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) ;<br>参数说明：<br>pDC是设备指针；<br>pWnd是窗口指针；<br>nCtlColor是控件类型；<br><br>因为对话框中的每个控件都会响应一次该函数，所以一般情况下，要对某个控件操作，就要先通过语句<br>if (pWnd-&gt;GetDlgCtrlID() == IDC_STATIC_TITLE)&nbsp; <br>找到该控件，或者通过语句<br>if (nCtlColor == CTLCOLOR_BIN |&nbsp; nCtlColor == CTLCOLOR_TEXT）；<br>找到控件类。<br><br>然后再通过设定设备环境来达到改变控件显示属性的目的。<br>改变控件显示字体，要先创建自己的特定字体，再选入设备<br>改变控件背景色，要先创建自己的特定画刷，再选入设备<br>改变控件显示字体的颜色，只要设置一下就可以了<br><br>1.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;静态控件<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这几乎是最简单的了，如果想改变某个ID为ID_MY_SEL_STATIC静态控件的背景色，只要语句<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HBRUSH CViewWaveparamDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (pWnd-&gt;GetDlgCtrlID() == ID_MY_SEL_STATIC)&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pDC-&gt;SetBkColor(RGB(0,0,255));//蓝色<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pDC-&gt;SetBkMode(TRANSPARENT);&nbsp; //调用该语句主要是为了显示文本时，文本背景依然是蓝色<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return ::CreateSolidBrush(RGB(98,176,255));//返回创建的画刷<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return hbr;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果想改变该控件的字体颜色，只需要在上面的函数if语句中加入一下语句就可以了<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pDC-&gt;SetTextColor(RGB(255,255,255));//显示字体为白色<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果要改变控件的字体，则需要在对话框的初始函数中创建一个字体，最好用成员变量；然后把该字体选入特定的控件的设备环境中<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetObject(::GetStockObject(DEFAULT_GUI_FONT),sizeof(m_logfont),&amp;m_logfont); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_logfont.lfHeight = 16;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_logfont.lfWeight = 16;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strcpy(m_logfont.lfFaceName, "黑体");<br>&nbsp;&nbsp;&nbsp; &nbsp; m_logfont.lfCharSet = GB2312_CHARSET;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VERIFY(m_Textfont.CreateFontIndirect(&amp;m_logfont));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GetDlgItem(ID_MY_SEL_STATIC)-&gt;SetFont(&amp;m_Textfont);<br><br>2.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;文本控件、check控件等基本都是这样就可以实现了。<br><br>3.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;按钮控件<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我起初也像上面这样来做，可是就是显示出来不是那么回事，我查了很多书籍，才发觉，原来按钮用这个样子是做不出来的。必须派生类，从CButton派生。然后在派生类中重载函数OnDrawItem（），只有这样才能实现本文所述的功能。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;涉及到派生，我想不是我三言两语能说清楚的，在此只是提个思路，恕在下无力！推荐个网上比较好的以后派生类CButtonST.<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其实我这篇文章很粗浅的，但是我希望能起到一个抛砖引玉的作用，有高手看到了本文，把你的见解和更好的实现方法贴上来，供不会的朋友借鉴临摹一下。先在此感谢了！<br><br>漏了一点，就是显示控件的亮\灰控制，补上。（不好意思，见谅见谅）<br><br>加入控制ID为ID_MY_BUTTON的显示，<br>在本对话框类中实现用语句<br>GetDlgItem(ID_MY_BUTTON)-&gt;EnableWindow(false);<br>在非本对话框类中实现用语句<br>HWND Ctrlhwnd, dlghwnd;<br>GetDlgItem(IDD_BASE_DIALOG, &amp;dlghwnd);<br>VERIFY(dlghwnd);<br>Ctrlhwnd = ::GetDlgItem(dlghwnd, ID_MY_BUTTON）;<br>VERIFY(Ctrlhwnd);<br>::EnableWindow(Ctrlhwnd, true); </p>
  <img src ="http://www.cppblog.com/amazon/aggbug/68155.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/amazon/" target="_blank">远风</a> 2008-11-29 13:36 <a href="http://www.cppblog.com/amazon/archive/2008/11/29/68155.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用ODBC数据源与Access数据库连接的两种方法</title><link>http://www.cppblog.com/amazon/archive/2008/11/29/68149.html</link><dc:creator>远风</dc:creator><author>远风</author><pubDate>Sat, 29 Nov 2008 05:08:00 GMT</pubDate><guid>http://www.cppblog.com/amazon/archive/2008/11/29/68149.html</guid><wfw:comment>http://www.cppblog.com/amazon/comments/68149.html</wfw:comment><comments>http://www.cppblog.com/amazon/archive/2008/11/29/68149.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/amazon/comments/commentRss/68149.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/amazon/services/trackbacks/68149.html</trackback:ping><description><![CDATA[<p>以Access文件作为数据库进行连接，一般可以使用ODBC接口，在这里我们使用MFC的CDatabase类，该类是对SQLConnect等ODBC的API的封装。需要包含<span style="COLOR: red">afxdb.h头文件</span>。利用ODBC数据源进行数据库连接有两种方法：一种是自动或手工配置ODBC数据源后连接，一种是不用配置ODBC数据源，而是直接根据Access文件的路径进行连接。<br><br>在MFC中，为ODBC预定义了几个类，其中主要的是数据库<span style="BACKGROUND-COLOR: #ffffff">类(CDatabase)和记录集合类(CRecoredset)。这两个类既有联系又有区别，在应用程序中，可以分别使用，也可以同时使用，每一类也可以同时存在多个对象。CDatabase的</span>每一个对象代表了一个数据源的连接，CRecordset的每一个对象代表了从一个数据表中按预定的查询条件获得的记录的集合，一般说来，前者适宜于对数据源下的某个数据表格进行整体操作，后者用于对所选的记录集合进行处理。<br><br>两种方法主要根据CDatabase类的Open函数而来：<br></p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">BOOL&nbsp;CDatabase::Open(<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LPCTSTR&nbsp;lpszDSN,&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BOOL&nbsp;bExclusive&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;FALSE,<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BOOL&nbsp;bReadonly&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;FALSE,&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LPCTSTR&nbsp;lpszConnect&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;_T(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">ODBC;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">),<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BOOL&nbsp;bUseCursorLib&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;TRUE&nbsp;);</span></div>
<p>参数说明如下：<br>(1)lpszDSN：要连接的数据源的名字，如果lpszDSN = NULL且lpszConnect中也没有指明数据源名，则该调用会自动出现一个对话框列出所有可用的数据源(名)，让用户选择。<br>(2)bExclusive：只支持&#8220;假&#8221;(False)值，表示为共享(share)方式连接。因此，应用程序在运行前，一定要装入share.exe或在Windows的system.ini中装入vshare.386。(什么意思不太懂......) <br>(3)ReadOnly：指明数据源操作方式是&#8220;只读&#8221;还是可以修改。<br>(4)lpszConnect:：指明连接字符串，包括数据源名、用户标识码、口令等信息。该字符串必须以&#8220;ODBC;&#8221;开头，表示该连接是与一个ODBC数据源的连接(考虑以后版本支持非ODBC数据源)。<br><br><strong>1.根据Access文件的路径进行连接</strong> <br></p>
<p>&nbsp;</p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">CString&nbsp;strConnect;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">strConnect&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;_T(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">ODBC;DRIVER={MICROSOFT&nbsp;ACCESS&nbsp;DRIVER(*.mdb)};UID=;PWD=;DBQ=D:\\MusicSearch.mdb</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">CDatabase&nbsp;db;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">db.Open(NULL,&nbsp;FALSE,&nbsp;FALSE,&nbsp;strConnect))<br><img id=Codehighlighter1_180_198_Open_Image onclick="this.style.display='none'; Codehighlighter1_180_198_Open_Text.style.display='none'; Codehighlighter1_180_198_Closed_Image.style.display='inline'; Codehighlighter1_180_198_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_180_198_Closed_Image onclick="this.style.display='none'; Codehighlighter1_180_198_Closed_Text.style.display='none'; Codehighlighter1_180_198_Open_Image.style.display='inline'; Codehighlighter1_180_198_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_180_198_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_180_198_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;TRUE;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">CString&nbsp;strSQL;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">strSQL&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;_T(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">select&nbsp;TOP&nbsp;100&nbsp;*&nbsp;from&nbsp;Music</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">CRecordset&nbsp;rs(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">db);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">rs.Open(CRecordset::forwardOnly,&nbsp;strSQL);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">CString&nbsp;strValue;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">rs.IsEOF())<br><img id=Codehighlighter1_372_411_Open_Image onclick="this.style.display='none'; Codehighlighter1_372_411_Open_Text.style.display='none'; Codehighlighter1_372_411_Closed_Image.style.display='inline'; Codehighlighter1_372_411_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_372_411_Closed_Image onclick="this.style.display='none'; Codehighlighter1_372_411_Closed_Text.style.display='none'; Codehighlighter1_372_411_Open_Image.style.display='inline'; Codehighlighter1_372_411_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_372_411_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_372_411_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">添加功能</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;rs.MoveNext();<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000">&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">rs.Close();<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">db.Close();<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span></div>
<p><br><strong>2.配置ODBC数据源后连接</strong><br></p>
<p>&nbsp;</p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">CDatabase&nbsp;db;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">db.Open(_T(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">MusicSearch</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)))<br><img id=Codehighlighter1_46_64_Open_Image onclick="this.style.display='none'; Codehighlighter1_46_64_Open_Text.style.display='none'; Codehighlighter1_46_64_Closed_Image.style.display='inline'; Codehighlighter1_46_64_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_46_64_Closed_Image onclick="this.style.display='none'; Codehighlighter1_46_64_Closed_Text.style.display='none'; Codehighlighter1_46_64_Open_Image.style.display='inline'; Codehighlighter1_46_64_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_46_64_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_46_64_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;TRUE;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">CString&nbsp;strSQL;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">strSQL&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;_T(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">select&nbsp;TOP&nbsp;100&nbsp;*&nbsp;from&nbsp;Music</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">CRecordset&nbsp;rs(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">db);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">rs.Open(CRecordset::forwardOnly,&nbsp;strSQL);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">以下添加功能<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span></div>
<p><br><br>&nbsp;</p>
<img src ="http://www.cppblog.com/amazon/aggbug/68149.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/amazon/" target="_blank">远风</a> 2008-11-29 13:08 <a href="http://www.cppblog.com/amazon/archive/2008/11/29/68149.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ListCtrl排序扩展类--CSortListCtrl【转载】</title><link>http://www.cppblog.com/amazon/archive/2008/11/28/68042.html</link><dc:creator>远风</dc:creator><author>远风</author><pubDate>Thu, 27 Nov 2008 16:43:00 GMT</pubDate><guid>http://www.cppblog.com/amazon/archive/2008/11/28/68042.html</guid><wfw:comment>http://www.cppblog.com/amazon/comments/68042.html</wfw:comment><comments>http://www.cppblog.com/amazon/archive/2008/11/28/68042.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/amazon/comments/commentRss/68042.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/amazon/services/trackbacks/68042.html</trackback:ping><description><![CDATA[<p>1. CSortList是CListCtrl的派生类。</p>
<p>2. 要让CSortList自行排序，当然得让CSortList自己处理LVN_COLUMNCLICK消息</p>
<p>&nbsp;&nbsp;&nbsp; ON_NOTIFY_REFLECT(LVN_COLUMNCLICK, OnLvnColumnclick)<br>&nbsp;&nbsp;&nbsp; OnLvnColumnclick的作用就是设置排序列，排序方式，最后调用SortItems()。</p>
<p>3. 排序的具体实现，也就是CALLBACK ListCompare(...)的实现：<br>&nbsp;&nbsp;&nbsp; 基本要求: 让CSortList根据Item进行排序，而与数据源无关。(当然这样也有不足之处，就是排序只能按文本排序了。如果你需要按数字排序的话，那就只有特殊处理了。)</p>
<p>&nbsp;&nbsp; 这里涉及到的最主要的函数是：<br>&nbsp;&nbsp; (1)ListCompare - 实现排序的回调函数<br>&nbsp;&nbsp; int CALLBACK CSortList::ListCompare(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)；<br>&nbsp;&nbsp; (2)CListCtrl::FindItem - 查找相应的Item, 查找方式可指定<br>&nbsp;&nbsp; int FindItem( LVFINDINFO* pFindInfo, int nStart = -1 ) const;<br>&nbsp;&nbsp; FindItem的具体细节请参考MSDN.<br>&nbsp;&nbsp; <br>&nbsp;&nbsp; 基本思路：<br>&nbsp;&nbsp; (1)ListCompare的原型：传入的参数lParam1,lParam2是相应两行的ItemData；<br>&nbsp;&nbsp; (2)FindItem根据lParam1,lParam2得到相应的Item；<br>&nbsp;&nbsp;&nbsp;FindItem有多种查找方式(查找方式通过LVFINDINFO-&gt;flags进行设置)，这里只是根据ItemData进行查找。<br>&nbsp;&nbsp; (3)再用GetItemText得到排序列的ItemText；<br>&nbsp;&nbsp; (4)最后就是比较ItemText了。<br><br>下面是源代码：<br>只有两个文件：CSortListCtrl.H, CSortListCtrl.cpp<br>直接把这两个文件放到项目里就可以了。<br><a href="http://www.cppblog.com/Files/amazon/CSortListCtrl.rar">/Files/amazon/CSortListCtrl.rar</a><br><br>在对话框程序C***Dlg中，可添加如下初始化信息，设置控件的风格和扩展风格。注意要根据HDITEM类型变量和CHeaderCtrl::SetItem函数设置列的类型属性。<br></p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">CSortListCtrl&nbsp;m_test;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">初始化控件</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">&nbsp;DWORD&nbsp;dwStyle&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;::GetWindowLong(m_test.m_hWnd,&nbsp;GWL_STYLE);&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;dwStyle&nbsp;</span><span style="COLOR: #000000">&amp;=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">(LVS_TYPEMASK);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;dwStyle&nbsp;</span><span style="COLOR: #000000">&amp;=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">(LVS_EDITLABELS);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">设置新风格</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">&nbsp;SetWindowLongW(m_test.m_hWnd,&nbsp;GWL_STYLE,&nbsp;dwStyle</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">LVS_REPORT</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">LVS_NOLABELWRAP</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">LVS_SHOWSELALWAYS);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">设置扩展风格</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">&nbsp;DWORD&nbsp;styles&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;LVS_EX_FULLROWSELECT</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">LVS_EX_GRIDLINES</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">LVS_EX_CHECKBOXES;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;ListView_SetExtendedListViewStyleEx(m_test.m_hWnd,&nbsp;styles,&nbsp;styles);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;m_test.SetExtendedStyle(m_test.GetExtendedStyle()&nbsp;</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">&nbsp;LVS_EX_SUBITEMIMAGES);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;HDITEM&nbsp;headerItem;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;headerItem.mask&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;HDI_LPARAM;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;CHeaderCtrl</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;pHeaderCtrl&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;m_test.GetHeaderCtrl(&nbsp;);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;m_test.InsertColumn(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;_T(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">歌曲</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">),&nbsp;LVCFMT_LEFT,&nbsp;</span><span style="COLOR: #000000">150</span><span style="COLOR: #000000">);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif">.<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif">..<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;headerItem.lParam&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;CSortListCtrl::DATA_TYPE::STRING_TYPE;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;pHeaderCtrl</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">SetItem(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">headerItem);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif">.<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif">..<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span></div>
<p><br>&nbsp;</p>
  <img src ="http://www.cppblog.com/amazon/aggbug/68042.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/amazon/" target="_blank">远风</a> 2008-11-28 00:43 <a href="http://www.cppblog.com/amazon/archive/2008/11/28/68042.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>自定义Button控件--CBitButtonNL【转载】</title><link>http://www.cppblog.com/amazon/archive/2008/11/27/68024.html</link><dc:creator>远风</dc:creator><author>远风</author><pubDate>Thu, 27 Nov 2008 12:34:00 GMT</pubDate><guid>http://www.cppblog.com/amazon/archive/2008/11/27/68024.html</guid><wfw:comment>http://www.cppblog.com/amazon/comments/68024.html</wfw:comment><comments>http://www.cppblog.com/amazon/archive/2008/11/27/68024.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/amazon/comments/commentRss/68024.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/amazon/services/trackbacks/68024.html</trackback:ping><description><![CDATA[<p>CBitButtonNL继承自CButton控件类，能实现鼠标热敏，显示3d文字，可根据按键的聚焦、按下、热态、失效等操作显示不同按键位图，达到动态效果。好东西要好好保存着，以备不时之需～<br><br>在工程中加入BitButtonNL.h和BitButtonNL.cpp文件，然后便可使用该类提供的函数进行操作。例如，在对话框类C***Dlg.cpp的OnInitDialog函数中可以添加如下代码：<br><br></p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">CBitButtonNL&nbsp;m_btnSearch;&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">CString&nbsp;strFontName&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;_T(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">宋体</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">set&nbsp;bitmap</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">&nbsp;m_btnSearch.SetBitmaps(<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IDB_BITMAP_OTHER_NORMAL,&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IDB_BITMAP_OTHER_DOWN,&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IDB_BITMAP_OTHER_UP,&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IDB_BITMAP_OTHER_NO);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">按钮的四种位图</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">&nbsp;m_btnSearch.SetForceColor(RGB(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">),&nbsp;RGB(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">),&nbsp;RGB(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">文字颜色</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">&nbsp;m_btnSearch.SetSound(MAKEINTRESOURCE(IDR_WAVEMOVE),&nbsp;::GetModuleHandle(NULL));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">聚焦声音</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">&nbsp;m_btnSearch.SetSound(MAKEINTRESOURCE(IDR_WAVECLICK),&nbsp;::GetModuleHandle(NULL),&nbsp;TRUE);&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">按下声音</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">&nbsp;m_btnSearch.SizeToContent();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">按钮自动适应第一个图片大小</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">&nbsp;m_btnSearch.SetWindowText(TEXT(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">搜索</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">改变按钮显示文字</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">&nbsp;m_btnSearch.SetBtnCursor(IDC_CURSOR_HAND,&nbsp;FALSE);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">按钮鼠标类型</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">&nbsp;m_btnSearch.SetTextAlign(NL_ALIGN_CENTER,&nbsp;FALSE);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">设置文字排列方式<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">set&nbsp;font</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">&nbsp;m_btnSearch<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;.SetDrawText(TRUE,&nbsp;FALSE)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">是否显示按钮文字</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;.SetFont3D(FALSE,&nbsp;</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,&nbsp;FALSE)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">显示文字3d效果</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;.SetText3DBKColor(RGB(</span><span style="COLOR: #000000">95</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">95</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">95</span><span style="COLOR: #000000">))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">3d阴影颜色</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;.SetFontBold(TRUE,&nbsp;FALSE)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">粗体</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;.SetFontSize(</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">,&nbsp;FALSE)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">字体大小</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;.SetFontName(strFontName)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">字体名称</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;;</span></div>
<br>其中：<br>(1)IDB_BITMAP_OTHER_NORMAL、IDB_BITMAP_OTHER_DOWN、IDB_BITMAP_OTHER_UP、IDB_BITMAP_OTHER_NO分别是按键默认、按下、热态、失效时的位图资源ID；<br>(2)IDR_WAVEMOVE和IDR_WAVECLICK是.wav音频资源ID；<br>(3)IDC_CURSOR_HAND是cursor资源ID。<br><br><span style="COLOR: #000000">源代码如下：</span><br><a href="http://www.cppblog.com/Files/amazon/CBitButtonNL.rar">/Files/amazon/CBitButtonNL.rar</a> 
  <img src ="http://www.cppblog.com/amazon/aggbug/68024.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/amazon/" target="_blank">远风</a> 2008-11-27 20:34 <a href="http://www.cppblog.com/amazon/archive/2008/11/27/68024.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用SqlConfigDataSource实现ODBC数据源配置</title><link>http://www.cppblog.com/amazon/archive/2008/11/26/67938.html</link><dc:creator>远风</dc:creator><author>远风</author><pubDate>Wed, 26 Nov 2008 15:24:00 GMT</pubDate><guid>http://www.cppblog.com/amazon/archive/2008/11/26/67938.html</guid><wfw:comment>http://www.cppblog.com/amazon/comments/67938.html</wfw:comment><comments>http://www.cppblog.com/amazon/archive/2008/11/26/67938.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/amazon/comments/commentRss/67938.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/amazon/services/trackbacks/67938.html</trackback:ping><description><![CDATA[<p>&nbsp;ODBC（Open Database Conectivity）即开放式数据库互联，作为Windows开放性结构的一个重要部分已经为很多的Windows程序员所熟悉，ODBC的工作依赖于数据库制造商提供的驱动程序，使用ODBC API的时候，Windows的ODBC管理程序，把数据库访问的请求传递给正确的驱动程序，驱动程序再使用SQL语句指示DBMS完成数据库访问工作。</p>
<p>一般来说，实现数据库到ODBC驱动程序管理器的注册有以下两种方法：一是编程时手工配置ODBC数据源，发布时使用InstallShield等安装制作软件自动配置ODBC数据源；二是考虑用程序替用户完成这些配置工作，实现的方法有几种，一种办法是用程序修改Windows注册表，程序员可以用Windows API函数增改HKEY_LOCAL_MACHINE\Software\ODBC\ODBC.INI中的键值，这种方法比较烦琐，另一种是在程序中使用ODBC API的方法，程序员可以在任何时候都可以用Visual C++编写的程序调用这些API函数来设置ODBC数据源。<br><br>创建ODBC数据源可以调用Windows系统子目录下的动态链接库<font color=#ff0000>ODBCCP32.DLL</font>中的函数SQLConfigDataSource()，该函数可以动态地增加、修改和删除数据源。<br><br>SQLConfigDataSource()的原型如下:<br><br><span style="COLOR: red">BOOL SQLConfigDataSource(HWND hwndParent, UINT fRequest, LPCSTR IpszDriver, LPCSTR IpszAttributes);<br></span>其中四个参数的用法如下:<br>●参数hwndPwent是父级窗口句柄。如果句柄为NULL，将不会显示一些有关的对话框。如果参数 IpszAttributes提供的信息不够完善，在创建过程中就会出现对话框要求用户提供相应信息。<br>●参数fRequest可以设置为下面的数值之一:<br>ODBC_ADD_DSN: 增加＿个新数据源<br>ODBC_CONHG_DSN: 配置（修改)一个已经存在的数据源<br>ODBC_REMOVE_DSN: 删除一个已经存在的数据源<br>ODBC_ADD_SYS_DSN: 增加一个新的系统数据源<br>ODBC_CONFIG_SYS_DSN: 更改一个已经存在的系统数据源<br>ODBC_REMOVE_SYS_DSN: 删除一个已经存在的系统数据源<br>●参数lpszDriver是数据库引擎名称，可以参见ODBC管理器中对ODBC驱动程序的描述。比如要加载的是Excel数据库，那么数据库引擎名称就为Microsoft Excel Driver(*.xls)<br>●参数lpszAttributes为一连串的"KeyName=value"字符串，每两个KeyName值之间用\0""字符隔开(或者\0隔开即可)。KeyName主要是新数据源缺省的驱动程序注册说明，其中最主要的关键字是"DSN"(新数据源的名称)和"DBQ"(数据源的地址)，其余关键字则根据不同的数据源有不同要求。关于lpszAttributes参数的具体设置，详细可以参考Windows系统目录下帮助文件Odbcjtn.hlp主题目录标签中的"ODBC API函数改变|SQLConfigDatasource"条目。<br><br>SqlConfigDataSource的应用条件：<br><br><span style="COLOR: red">使用SqlConfigDataSource函数之前，必须把ODBCINST.H文件包含在工程头文件中，将ODBCCP32.LIB加入工程，同时保证ODBCCP32.DLL运行时处于系统子目录下。<br></span>若使用VC6.0，在安装目录中的Lib文件夹下寻找ODBCCP32.LIB并添加到工程中；若使用的是VC2005，貌似安装目录的lib文件夹下没有该lib文件，只能使用VC6.0下的......<br><br>例：</p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">SQLConfigDataSource(<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL,<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ODBC_ADD_SYS_DSN,<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Microsoft&nbsp;Access&nbsp;Driver&nbsp;(*.mdb)</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">DSN=TryDB\0</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">DBQ=D:\\TryDB.mdb\0</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);</span></div>
<p>&nbsp;</p>
<img src ="http://www.cppblog.com/amazon/aggbug/67938.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/amazon/" target="_blank">远风</a> 2008-11-26 23:24 <a href="http://www.cppblog.com/amazon/archive/2008/11/26/67938.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>