??xml version="1.0" encoding="utf-8" standalone="yes"?>成人综合久久精品色婷婷,久久久久久亚洲精品无码,亚洲一区二区三区日本久久九http://www.shnenglu.com/zhaoyg/category/12443.html记录Ҏ(gu)Q成未?/description>zh-cnMon, 10 Jan 2011 05:38:26 GMTMon, 10 Jan 2011 05:38:26 GMT60目录扫描http://www.shnenglu.com/zhaoyg/archive/2011/01/09/138212.htmlzhaoygzhaoygSun, 09 Jan 2011 12:44:00 GMThttp://www.shnenglu.com/zhaoyg/archive/2011/01/09/138212.htmlhttp://www.shnenglu.com/zhaoyg/comments/138212.htmlhttp://www.shnenglu.com/zhaoyg/archive/2011/01/09/138212.html#Feedback0http://www.shnenglu.com/zhaoyg/comments/commentRss/138212.htmlhttp://www.shnenglu.com/zhaoyg/services/trackbacks/138212.htmlclass ...  阅读全文

zhaoyg 2011-01-09 20:44 发表评论
]]>
我也来说说透明?rn)态文本框的实?/title><link>http://www.shnenglu.com/zhaoyg/archive/2010/11/14/133590.html</link><dc:creator>zhaoyg</dc:creator><author>zhaoyg</author><pubDate>Sun, 14 Nov 2010 07:34:00 GMT</pubDate><guid>http://www.shnenglu.com/zhaoyg/archive/2010/11/14/133590.html</guid><wfw:comment>http://www.shnenglu.com/zhaoyg/comments/133590.html</wfw:comment><comments>http://www.shnenglu.com/zhaoyg/archive/2010/11/14/133590.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.shnenglu.com/zhaoyg/comments/commentRss/133590.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/zhaoyg/services/trackbacks/133590.html</trackback:ping><description><![CDATA[<span style="FONT-SIZE: 14pt">Google一?#8220;透明?rn)态文本框”Q给出的大多数都是靠如下代码来实现的Q?br></span><br> <div style="BORDER-BOTTOM: #ff0000 1px solid; BORDER-LEFT: #ff0000 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #ffcc99; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #ff0000 1px solid; BORDER-RIGHT: #ff0000 1px solid; PADDING-TOP: 4px"><span style="COLOR: #000000">HBRUSH CTransparentLabelDlg::OnCtlColor(CDC</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> pDC, CWnd</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> pWnd, UINT nCtlColor)<br>{<br>    HBRUSH hbr </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> CDialog::OnCtlColor(pDC, pWnd, nCtlColor);<br><br>    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (CTLCOLOR_STATIC </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> nCtlColor)<br>    {<br>        pDC</span><span style="COLOR: #000000">-></span><span style="COLOR: #000000">SetBkMode(TRANSPARENT);<br>        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> (HBRUSH)GetStockObject(NULL_BRUSH);<br>    }<br><br>    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> TODO:  如果默认的不是所需ȝQ则q回另一个画W?/span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> hbr;<br>}<br></span></div> <br><span style="FONT-SIZE: 14pt">效果如图Q?br></span>                                                                              <img border=0 alt="" src="http://www.shnenglu.com/images/cppblog_com/zhaoyg/1.png" width=456 height=277><br><br><span style="FONT-SIZE: 14pt">在大多数情况下这U方法都没问题,但是Q当需要动态更攚w(rn)态文本框中的内容时就?x)出现这L(fng)问题Q?br></span>                         <img border=0 alt="" src="http://www.shnenglu.com/images/cppblog_com/zhaoyg/3.png" width=888 height=217><br><span style="FONT-SIZE: 14pt">也就是出C(jin)文字重叠现象?br><br>其原因出?#8220;透明”w上。一般情况下在绘制界面时?x)先l制对话框的背景然后才会(x)l制子控Ӟ而子控g通常都会(x)自绘其背景的Q于是子控gl制完之后就?x)盖住对话框原先所l制的一部分内容Q所?#8220;透明”效果是靠禁止子控g自绘背景而实现的?br><br>?jin)解?#8220;透明”后,再来回到刚才的问题上。因为现在静(rn)态文本框不会(x)L除背景而只是绘制出文字Q于是之前的“试”׃(x)D留在对话框背景上,只有引v对话框背景重l时才能L。于是,我们应该在设|完文本框的文字后再让对话框重绘背景才行?br>修改一?#8220;更改文本”按钮响应函数Q?br></span> <div style="BORDER-BOTTOM: #ff0000 1px solid; BORDER-LEFT: #ff0000 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #ffcc99; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; COLOR: #ffffff; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #ff0000 1px solid; BORDER-RIGHT: #ff0000 1px solid; PADDING-TOP: 4px"><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> CTransparentLabelDlg::OnBnClickedButton1()<br>{<br>    CString tmp;<br>    GetDlgItemText(IDC_EDIT1 , tmp);<br>    SetDlgItemText(IDC_STATIC1 , tmp);<br><br>    // 一下ؓ(f)新添加内宏V只需局部重l背景即?br>    CRect rect;<br>    GetDlgItem(IDC_STATIC1)</span><span style="COLOR: #000000">-></span><span style="COLOR: #000000">GetWindowRect(</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">rect);<br>    ScreenToClient(</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">rect);<br>    InvalidateRect(</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">rect);<br>    UpdateWindow();<br><br>}</span></div> <span style="FONT-SIZE: 14pt">效果如图Q?br></span>                                <img border=0 alt="" src="http://www.shnenglu.com/images/cppblog_com/zhaoyg/5.png" width=888 height=217> <br><br><span style="FONT-SIZE: 14pt">q样一来就更好的实C(jin)“透明”?br><br>以上只是弟的一些理解,如果有什么地方说的不对,或者你有更好的Ҏ(gu)来实?#8220;透明”Q还望告知,弟先谢q了(jin) : P</span> <img src ="http://www.shnenglu.com/zhaoyg/aggbug/133590.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/zhaoyg/" target="_blank">zhaoyg</a> 2010-11-14 15:34 <a href="http://www.shnenglu.com/zhaoyg/archive/2010/11/14/133590.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]用MFC~制Windows打印E序http://www.shnenglu.com/zhaoyg/archive/2010/07/15/120496.htmlzhaoygzhaoygThu, 15 Jul 2010 15:53:00 GMThttp://www.shnenglu.com/zhaoyg/archive/2010/07/15/120496.htmlhttp://www.shnenglu.com/zhaoyg/comments/120496.htmlhttp://www.shnenglu.com/zhaoyg/archive/2010/07/15/120496.html#Feedback0http://www.shnenglu.com/zhaoyg/comments/commentRss/120496.htmlhttp://www.shnenglu.com/zhaoyg/services/trackbacks/120496.html
一般来_(d)用Visual   C++~制需要打印的E序Ӟ在用AppWizard生成工程文g时就加入打印和打印预览选项Q该选项在AppWizard的第四步Q。若用手工加入,则稍微麻?ch)些? 

MFC对于打印的支持是在视cCView中实现的Q该cM有如下几个成员函数是与打印或打印预览有关的:(x)  

BOOL   OnPreparePrinting(CPrintInfopInfo)  

void   OnBeginPrinting(CDCpDC,   CPrintInfopInfo)  

void   OnPrepareDC(CDCpDC,   CPrintInfopInfo)  

void   OnPrint(CDCpDC,   CPrintInfopInfo)  

void   OnEndPrinting(CDCpDC,   CPrintInfopInfo)  

其中QpDC是打印或昄的设备场指针QpInfo是打印过E信息指针。pInfo包含许多有用的信息,如打印的总页数、当前打印页的页码、是打印q是打印预览、是否l打印等Q具体参数内容和意义可以参考MFC联机手册? 

以上几个函数都是虚函敎ͼ可以重蝲。若在用AppWizard生成工程文g旉择?jin)打印和打印预览选项Q则函数OnPreparePrinting、OnBeginPrinting、OnEndPrinting自动地被AppWizard插入C的视cM加以重蝲。另外两个函数则可以手工加入Q如果用的是Visual   C++   4.0以上版本Q可以通过ClassWizard加入到视cM? 

q几个函数在用户选择打印命o(h)时由应用框架自动调用Q用L(fng)序不用显式调用。下面讲q这几个函数在打印过E中的调用顺序及(qing)其意义? 

1.OnPreparePrinting  

OnPreparePrinting函数最先被调用Q用来初始化打印机等。比如,若没有安装打印机Q则该函数将提示用户安装打印机。用L(fng)序可以向其中加入别的初始化代码,比如Q计打C的文档所需要的总页敎ͼ然后调用视类中的打印机初始化函数BOOL   DoPreparePrinting(CPrintInfopInfo)卛_。而用AppWizard生成的代码中QOnPreparePrinting函数只是调用函数DoPreparePrintingQƈ传递参数? 

2.OnBeingPrinting  

OnBeingPrinting函数是开始打印文档前调用的函敎ͼ用户可以在其中加入另一些对于打印过E的初始化代码,比如分配打印q程中将要用的“W?#8221;QCPenQ?#8220;刷子”QCBrushQ等Q默认的代码中该函数直接返回? 

3.OnEndPrinting  

OnEndPrinting函数是与OnBeginPrinting函数相对应的函数Q它在打印完成后由应用框架调用,用于释放在OnBeginPrinting中分配的“对象”Q如“W?#8221;?#8220;刷子”{,光认的代码中该函数直接返回? 

4.OnPrepareDC  

OnPrepareDC函数用于在打印前准备打印讑֤场,如窗口大、原点,视图大小、原点等。同时该函数在视cLC文档内Ҏ(gu)也被调用Q默认的代码中该函数调用基类中的OnPrepareDC函数? 

5.OnPrint  

OnPrint函数则是具体的打印过E,它利用前面准备好的设备场q行打印? 

q几个函CQOnPreparePrinting、OnBeginPrinting、OnEndPrinting函数在一ơ打印过E中只被调用一ơ,不管q一ơ打印内Ҏ(gu)多少,而OnPrepareDC、OnPrint函数则每打印一都被调用一ơ,q种调用ơ序对于打印是很有用的? 

在编E中Q相信大家只要用好这几个基本函数Q一定会(x)~制出满意的Windows打印E序?


zhaoyg 2010-07-15 23:53 发表评论
]]>
让进度条接收鼠标双击消息http://www.shnenglu.com/zhaoyg/archive/2010/05/06/114707.htmlzhaoygzhaoygThu, 06 May 2010 14:24:00 GMThttp://www.shnenglu.com/zhaoyg/archive/2010/05/06/114707.htmlhttp://www.shnenglu.com/zhaoyg/comments/114707.htmlhttp://www.shnenglu.com/zhaoyg/archive/2010/05/06/114707.html#Feedback0http://www.shnenglu.com/zhaoyg/comments/commentRss/114707.htmlhttp://www.shnenglu.com/zhaoyg/services/trackbacks/114707.htmlQ按我的观点Q一般来讲进度条是用来昄q度的,也就是说Q除?jin)设|进度外Q估计不再需要和用户有什么交互了(jin)Q但是近来在做一个东西的时候需要完成这L(fng)功能Q就是用q度条显C文件的dq度Qƈ且可?span style="COLOR: red">通过双击q度条来Ҏ(gu)件进?#8220;跌”?br>对于双击q度条,当初?j)想Q添加一个WM_LBUTTONDBLCLK 响应函数是?jin),但后来发现进度条中没有这个消息。于是就想那在PreTranslateMessage中截莯度条的WM_LBUTTONDBLCLK 消息Q但实验后发现PreTranslateMessageq不能截到这个消息?br>后来在MSDN中对于WM_LBUTTONDBCLICK消息有这么一行文字:(x)

Only windows that have the CS_DBLCLKS WNDCLASS style will receive OnLButtonDblClk calls
”?br>
看到q行文字后,我便认ؓ(f)是进度条的wndclass对象中没有CS_DBCLKSQ经下面代码认Q证明了(jin)我的正确

 LONG style = GetClassLong(m_ProcessCtrl.GetSafeHwnd() , GCL_STYLE);
 
bool val = style & CS_DBLCLKS;  // val 为false说明q度条真的没有CS_DBLCLKS


Z(jin)让进度条可以获取鼠标双击Q只需在OnInitDialog中加入如下两行代码便可以?jin)?x)

 LONG style = GetClassLong(m_ProcessCtrl.GetSafeHwnd() , GCL_STYLE);
 SetClassLong(m_ProcessCtrl.GetSafeHwnd() , GCL_STYLE , style 
| CS_DBLCLKS );
在PreTranslateMessage中加?br>
BOOL CDataAnalyzerDlg::PreTranslateMessage(MSG* pMsg)
{
    
if (pMsg->hwnd == m_ProcessCtrl.m_hWnd && WM_LBUTTONDBLCLK == pMsg->message)
    {
        if (m_isStartRead)
        {
            // 计算偏移?br>            // ........
            // ........

            m_ProcessCtrl.SetPos(offset
);
        }
    }

    
return CDialog::PreTranslateMessage(pMsg);
}

有了(jin)上面的代码,问题p决了(jin)?br>
P.S.:
 当然通过l承一个进度条c,然后在那个派生类中接收WM_LBUTTONDBLCLK也应该是可以的?

zhaoyg 2010-05-06 22:24 发表评论
]]>
[转]VC++?PostMessage和SendMessage的区?/title><link>http://www.shnenglu.com/zhaoyg/archive/2010/03/07/109096.html</link><dc:creator>zhaoyg</dc:creator><author>zhaoyg</author><pubDate>Sun, 07 Mar 2010 03:47:00 GMT</pubDate><guid>http://www.shnenglu.com/zhaoyg/archive/2010/03/07/109096.html</guid><wfw:comment>http://www.shnenglu.com/zhaoyg/comments/109096.html</wfw:comment><comments>http://www.shnenglu.com/zhaoyg/archive/2010/03/07/109096.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/zhaoyg/comments/commentRss/109096.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/zhaoyg/services/trackbacks/109096.html</trackback:ping><description><![CDATA[ <p> <font color="#003366" size="3">1Q?PostMessage只把消息攑օ队列Q不其他程序是否处理都q回Q然后l执行,q是个异步消息投攑և数。而SendMessage必须{待其他E序处理消息完了(jin)之后才返回,l箋执行Q这是个同步消息投放函数。而且QPostMessage的返回DCPostMessage函数执行是否正确Q而SendMessage的返回DC其他程序处理消息后的返回倹{这点大家应该都明白?</font> </p> <p> <font color="#003366" size="3">2Q?如果在同一个线E内QPostMessage发送消息时Q消息要先放入线E的消息队列Q然后通过消息循环Dispatch到目标窗口。SendMessage发送消息时Q系l直接调用目标窗口的消息处理E序Qƈ结果返回。SendMessage在同一U程中发送消息ƈ不入U程消息队列?如果在不同线E内。最好用PostThreadMessage代替PostMessage,他工作的很好。SendMessage发送消息到目标H口所属的U程的消息队列,然后发送消息的U程{待(事实上,他应该还在做一些监工作,比如监视QS_SENDMESSAGE标志)Q直到目标窗口处理完q且l果q回Q发送消息的U程才l运行。这是SendMessage的一般情况,事实上,处理q程要复杂的多。比如,当发送消息的U程监测到有别的H口SendMessage一个消息到来时Q他直接调用H口处理q程(重入)Qƈ处理结果返?q个q程不需要消息@环中GetMessage{的支持)?</font> </p> <p> <font color="#003366" size="3">3Q?msdn: If you send a message in the range below WM_USER to the asynchronous message functions (PostMessage, SendNotifyMessage, and SendMessageCallback), its message parameters can not include pointers. Otherwise, the operation will fail.</font> </p> <p> <font color="#003366" size="3">如果发送的消息码在WM_USER之下(非自定义消息)且消息参C带有指针Q那么PostMessage,SendNotifyMessage,SendMessageCallbackq些异步消息发送函数将?x)调用失败?最好不要用PostMessage发送带有指针参数的消息?/font> </p> <img src ="http://www.shnenglu.com/zhaoyg/aggbug/109096.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/zhaoyg/" target="_blank">zhaoyg</a> 2010-03-07 11:47 <a href="http://www.shnenglu.com/zhaoyg/archive/2010/03/07/109096.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个很q托盘c?/title><link>http://www.shnenglu.com/zhaoyg/archive/2010/02/01/106955.html</link><dc:creator>zhaoyg</dc:creator><author>zhaoyg</author><pubDate>Mon, 01 Feb 2010 10:10:00 GMT</pubDate><guid>http://www.shnenglu.com/zhaoyg/archive/2010/02/01/106955.html</guid><wfw:comment>http://www.shnenglu.com/zhaoyg/comments/106955.html</wfw:comment><comments>http://www.shnenglu.com/zhaoyg/archive/2010/02/01/106955.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/zhaoyg/comments/commentRss/106955.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/zhaoyg/services/trackbacks/106955.html</trackback:ping><description><![CDATA[     摘要: 很弱的托盘类  <a href='http://www.shnenglu.com/zhaoyg/archive/2010/02/01/106955.html'>阅读全文</a><img src ="http://www.shnenglu.com/zhaoyg/aggbug/106955.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/zhaoyg/" target="_blank">zhaoyg</a> 2010-02-01 18:10 <a href="http://www.shnenglu.com/zhaoyg/archive/2010/02/01/106955.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]MFC中基于对话框的程序启动后自动隐藏http://www.shnenglu.com/zhaoyg/archive/2010/01/26/106491.htmlzhaoygzhaoygTue, 26 Jan 2010 14:33:00 GMThttp://www.shnenglu.com/zhaoyg/archive/2010/01/26/106491.htmlhttp://www.shnenglu.com/zhaoyg/comments/106491.htmlhttp://www.shnenglu.com/zhaoyg/archive/2010/01/26/106491.html#Feedback0http://www.shnenglu.com/zhaoyg/comments/commentRss/106491.htmlhttp://www.shnenglu.com/zhaoyg/services/trackbacks/106491.html本文单介l一下VC中基于对话框的程序启动后的自动隐藏技术?br>
有的E序需要在启动后立即隐藏主H口Q只在系l托盘区域显CZ个图标,q常见于很多后台服务E序。对于基于对话框的程序,要实现此功能需要一Ҏ(gu)巧?br>
    该技术的关键点在于,需要用非模态对话框Q而不是默认的模态对话框。模态对话框的DoModal()事实上执行了(jin)对话框的创徏、显C、消息@环等一pdq程。我们这里要做的是把这个过E重玎ͼq控制中间的昄q程来达到我们隐藏主H口的目的。现实v来非常简单,我们只需要把CXXXApp中的InitInstance()函数中默认的对话框显CZ码:(x)

BOOL CXXXApp::InitInstance()
{
    
//  其它代码

    
// ȝ口对话框实例
    CXXXDlg dlg;
    m_pMainWnd 
= &dlg;

    
// 模态对话框
    dlg.DoModal();


    
return FALSE;
}

改变为如下代码即可,其它地方的代码完全不用修改:(x)

BOOL CXXXApp::InitInstance()
{
    
//  其它代码

    
// ȝ口对话框实例
    CXXXDlg dlg;
    m_pMainWnd 
= &dlg;

    
// 非模态对话框
    dlg.Create(CXXXDlg::IDD); 
    dlg.DoSomethingBeforeMsgLoop(); 
// 可以在此函数隐藏H口?qing)执行其它操?/span>
    dlg.RunModalLoop();

    
return FALSE;
}

在上面的代码中,可以在DoSomethingBeforeMsgLoop()函数中用ShowWindow()来隐藏窗口,同时q可以执行其它一些操作,也可以直接在DoSomethingBeforeMsgLoop()函数调用处调用ShowWindow()函数来隐藏窗口?/p>

    也有人提Z(jin)其它Ҏ(gu)。比如仍然用模态对话框Q但使用计数器设定很短一个时间来触发事gQƈ在处理该计数器事件中隐藏H口。该Ҏ(gu)可行Q但太麻?ch),没有上面的方法方ѝ?/p>

zhaoyg 2010-01-26 22:33 发表评论
]]>
文g名批量修改器http://www.shnenglu.com/zhaoyg/archive/2010/01/12/105493.htmlzhaoygzhaoygTue, 12 Jan 2010 10:53:00 GMThttp://www.shnenglu.com/zhaoyg/archive/2010/01/12/105493.htmlhttp://www.shnenglu.com/zhaoyg/comments/105493.htmlhttp://www.shnenglu.com/zhaoyg/archive/2010/01/12/105493.html#Feedback3http://www.shnenglu.com/zhaoyg/comments/commentRss/105493.htmlhttp://www.shnenglu.com/zhaoyg/services/trackbacks/105493.html  本h盘里攒?jin)不的壁纸Q但q些囑փ文g的名字都各自为政Q没有统一的格式,当有新的囄q行存放时常怼(x)产生重名的问题。ؓ(f)?jin)解决重名问题,于是才有了(jin)写q个“文g名批量修改器”的念头。虽然类似程序网上多如牛毛,但还是自己写?jin)个Q以来练l手?br>

E序界面



主要使用步骤说明Q?br>   1. d需要更名的文g
   2. ?文g名格?中输入含有通配W字W串"(*)"样式的文件名Q例?文g_(*)"
   3. ?文g序列"的两个输入框中分别输?起始"?截止"的数|以对文gq行~号?截止"?起始"的数g差即为实际更名的文g数量Q其余文件将不被更名?br>   4. ?通配W长"中输入一个数|如果该数值大于文件编L(fng)最大值的位数Q则?x)加入数值零作ؓ(f)填充?br>   5. 如果需要,q可以在"文g列表"中通过"上移"?下移"来改变文仉序,同时也可以移除某文g?br>

源码下蝲

如果有Q何意见或Q请告知本h?
EMAIL:  zhaoyg1986@gmail.com

使用图例Q?br>
为更名之前:(x)


q行更名Q?br>

更名后:(x)
 


zhaoyg 2010-01-12 18:53 发表评论
]]>
[转] MFC CListCtrl 使用介绍http://www.shnenglu.com/zhaoyg/archive/2010/01/12/105461.htmlzhaoygzhaoygMon, 11 Jan 2010 16:19:00 GMThttp://www.shnenglu.com/zhaoyg/archive/2010/01/12/105461.htmlhttp://www.shnenglu.com/zhaoyg/comments/105461.htmlhttp://www.shnenglu.com/zhaoyg/archive/2010/01/12/105461.html#Feedback0http://www.shnenglu.com/zhaoyg/comments/commentRss/105461.htmlhttp://www.shnenglu.com/zhaoyg/services/trackbacks/105461.html列表控g可以看作是功能增强的ListBoxQ它提供?jin)四U风|而且可以同时昄一列的多中属性倹{MFC中用CListCtrlcL装列表控g的各U操作。通过调用
BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );创徏一个窗口,dwStyle中可以用以下一些列表控件的专用风格Q?

  • LVS_ICON LVS_SMALLICON LVS_LIST LVS_REPORT q四U风格决定控件的外观Q同时只可以选择其中一U,分别对应Q大图标昄Q小图标昄Q列表显C,详细报表昄
  • LVS_EDITLABELS l点的显C字W可以被~辑Q对于报表风格来讲可~辑的只为第一列?
  • LVS_SHOWSELALWAYS 在失ȝҎ(gu)也显C当前选中的结?
  • LVS_SINGLESEL 同时只能选中列表中一?

首先你需要设|列表控件所使用的ImageListQ如果你使用大图标显C风|你就需要以如下形式调用Q?
CImageList* SetImageList( CImageList* pImageList, LVSIL_NORMAL);
如果使用其它三种风格昄而不xC图标你可以不进行Q何设|,否则需要以如下形式调用Q?
CImageList* SetImageList( CImageList* pImageList, LVSIL_SMALL);
通过调用int InsertItem( int nItem, LPCTSTR lpszItem );可以在列表控件中nItem指明位置插入一,lpszItem为显C字W。除LVS_REPORT风格外其他三U风格都只需要直接调?InsertItem可以了(jin)Q但如果使用报表风格必d讄列表控g中的列信息?/p>

通过调用int InsertColumn( int nCol, LPCTSTR lpszColumnHeading, int nFormat , int nWidth, int nSubItem);可以插入列。iCol为列的位|,从零开始,lpszColumnHeading为显C的列名QnFormat为显C对齐方式, nWidth为显C宽度,nSubItem为分配给该列的列索引?

在有多列的列表控件中需要ؓ(f)每一Ҏ(gu)明其在每一列中的显C字W,通过调用
BOOL SetItemText( int nItem, int nSubItem, LPTSTR lpszText );可以讄每列的显C字W。nItem|的的位置QnSubItem为列位置QlpszText为显C字W。下面的代码演示?jin)如何设|多列ƈ插入数据Q?

m_list.SetImageList(&m_listSmall,LVSIL_SMALL);//讄ImageList
m_list.InsertColumn(0,"Col 1",LVCFMT_LEFT,300,0);//讄?br>m_list.InsertColumn(1,"Col 2",LVCFMT_LEFT,300,1);
m_list.InsertColumn(2,"Col 3",LVCFMT_LEFT,300,2);
m_list.InsertItem(0,"Item 1_1");//插入?br>m_list.SetItemText(0,1,"Item 1_2");//讄该行的不同列的显C字W?br>m_list.SetItemText(0,2,"Item 1_3");

此外CListCtrlq提供了(jin)一些函数用于得?修改控g的状态?
COLORREF GetTextColor( )/BOOL SetTextColor( COLORREF cr );用于得到/讄昄的字W颜艌Ӏ?
COLORREF GetTextBkColor( )/BOOL SetTextBkColor( COLORREF cr );用于得到/讄昄的背景颜艌Ӏ?
void SetItemCount( int iCount );用于得到dq列表中的数量?
BOOL DeleteItem(int nItem);用于删除某一,BOOL DeleteAllItems( );删除所有项?
BOOL SetBkImage(HBITMAP hbm, BOOL fTile , int xOffsetPercent, int yOffsetPercent);用于讄背景位图?
CString GetItemText( int nItem, int nSubItem );用于得到某项的显C字W?

列表控g的消息映同样用ON_NOTIFY宏,形式如同QON_NOTIFY( wNotifyCode, id, memberFxn )QwNotifyCode为通知代码QidZ生该消息的窗口IDQmemberFxn为处理函敎ͼ函数的原型如同void OnXXXList(NMHDR* pNMHDR, LRESULT* pResult)Q其中pNMHDRZ数据l构Q在具体使用旉要{换成其他cd的结构。对于列表控件可能取值和对应的数据结构ؓ(f)Q?

  • LVN_BEGINLABELEDIT 在开始某编辑字W时发送,所用结构:(x)NMLVDISPINFO
  • LVN_ENDLABELEDIT 在结束某编辑字W时发送,所用结构:(x)NMLVDISPINFO
  • LVN_GETDISPINFO 在需要得到某信息时发送,Q如得到某项的显C字W)(j)所用结构:(x)NMLVDISPINFO

关于ON_NOTIFY有很多内容,在以后的内容中q行详细讲解?

关于动态提供结Ҏ(gu)昄的字W:(x)首先你在Ҏ(gu)需要指明lpszItem参数为:(x) LPSTR_TEXTCALLBACK。在控g昄该结Ҏ(gu)?x)通过发送TVN_GETDISPINFO来取得所需要的字符Q在处理该消息时先将参数 pNMHDR转换为LPNMLVDISPINFOQ然后填充其中item.pszText。通过item中的iItem,iSubItem可以知道当前昄的ؓ(f)那一V下面的代码演示?jin)这U方法:(x)

char szOut[8][3]={"No.1","No.2","No.3"};//dl点
m_list.InsertItem(LPSTR_TEXTCALLBACK,)
m_list.InsertItem(LPSTR_TEXTCALLBACK,)
//处理消息
void CParentWnd::OnGetDispInfoList(NMHDR* pNMHDR, LRESULT* pResult)

    LV_DISPINFO
* pLVDI = (LV_DISPINFO*)pNMHDR; 
    pLVDI
->item.pszText=szOut[pTVDI->item.iItem];//通过iItem得到需要显C的字符在数l中的位|?nbsp;
    *pResult = 0;
}


关于~辑某项的显C字W:(x)Q在报表风格中只对第一列有效)(j)首先需要设|列表控件的 LVS_EDITLABELS风格Q在开始编辑时该控件将?x)发送LVN_BEGINLABELEDITQ你可以通过在处理函Cq回TRUE来取消接下来的编辑,在编辑完成后?x)发送LVN_ENDLABELEDITQ在处理该消息时需要将参数pNMHDR转换为LPNMLVDISPINFOQ然后通过其中的item.pszText得到~辑后的字符Qƈ重置昄字符。如果编辑在中途中取消该变量ؓ(f)NULL。下面的代码说明如何处理q些消息Q?

 

//处理消息 LVN_BEGINLABELEDIT
void CParentWnd::OnBeginEditList(NMHDR* pNMHDR, LRESULT* pResult)
{
    LV_DISPINFO
* pLVDI = (LV_DISPINFO*)pNMHDR; 
    
if(pLVDI->item.iItem==0);//判断是否取消该操?/span>
    *pResult = 1
    
else  *pResult = 0Q?br>}

//处理消息 LVN_BEGINLABELEDIT
void CParentWnd::OnBeginEditList(NMHDR* pNMHDR, LRESULT* pResult)
{
    LV_DISPINFO
* pLVDI = (LV_DISPINFO*)pNMHDR; 
    
if(pLVDI->item.pszText==NULL);//判断是否已经取消取消~辑  
    m_list.SetItemText(pLVDI->item.iItem,0,pLVDI->pszText);//重置昄字符 
    *pResult = 0;
}


上面讲述的方法所q行的消息映必d父窗口中q行Q同样WM_NOTIFY的所有消息都需要在父窗口中处理Q?
如何得到当前选中位|:(x)在列表控件中没有一个类gListBox中GetCurSel()的函敎ͼ但是可以通过调用GetNextItem( -1, LVNI_ALL | LVNI_SELECTED);得到选中位|?/p>


下面是一些例?/p>


作者:(x)lixiaosan
旉Q?4/06/2006

以下未经说明Qlistctrl默认view 风格为report

相关cd(qing)处理函数

MFCQCListCtrlc?/p>

SDKQ以 “ListView_”开头的一些宏。如 ListView_InsertColumn


--------------------------------------------------------------------------------

1. CListCtrl 风格
      LVS_ICON: 为每个item昄大图?br>      LVS_SMALLICON: 为每个item昄图?br>      LVS_LIST: 昄一列带有小图标的item
      LVS_REPORT: 昄item详细资料

      直观的理解:(x)windows资源理器,“查看”标签下的“大图标,图标,列表Q详l资?#8221;

 

--------------------------------------------------------------------------------

2. 讄listctrl 风格?qing)扩展风?br>      LONG lStyle;
      lStyle. = GetWindowLong(m_list.m_hWnd, GWL_STYLE);//获取当前H口style
      lStyle. &= ~LVS_TYPEMASK; //清除昄方式?br>      lStyle.|= LVS_REPORT; //讄style
      SetWindowLong(m_list.m_hWnd, GWL_STYLE, lStyle);//讄style

      DWORD dwStyle. = m_list.GetExtendedStyle();
      dwStyle.|= LVS_EX_FULLROWSELECT;//选中某行使整行高亮(只适用与report风格的listctrlQ?br>      dwStyle.|= LVS_EX_GRIDLINES;//|格U(只适用与report风格的listctrlQ?br>      dwStyle.|= LVS_EX_CHECKBOXES;//item前生成checkbox控g
      m_list.SetExtendedStyle(dwStyle); //讄扩展风格

      注:(x)listview的styleh阅msdn
      http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wceshellui5/html/wce50lrflistviewstyles.asp

--------------------------------------------------------------------------------

3. 插入数据
      m_list.InsertColumn( 0, "ID", LVCFMT_LEFT, 40 );//插入?br>      m_list.InsertColumn( 1, "NAME", LVCFMT_LEFT, 50 );
      int nRow = m_list.InsertItem(0, “11”);//插入?br>      m_list.SetItemText(nRow, 1, “jacky”);//讄数据

--------------------------------------------------------------------------------

4. 一直选中item
    选中style中的Show selection alwaysQ或者在上面W?点中讄LVS_SHOWSELALWAYS

--------------------------------------------------------------------------------

5. 选中和取消选中一?/strong>
    int nIndex = 0;
    //选中
    m_list.SetItemState(nIndex, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED);
    //取消选中
    m_list.SetItemState(nIndex, 0, LVIS_SELECTED|LVIS_FOCUSED);
--------------------------------------------------------------------------------

6. 得到l(f)istctrl中所有行的checkbox的状?/strong>
      m_list.SetExtendedStyle(LVS_EX_CHECKBOXES);
      CString str;
      for(int i=0; i<m_list.GetItemCount(); i++)
      {
           if( m_list.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED || m_list.GetCheck(i))
           {
                str.Format(_T("W?d行的checkbox为选中状?), i);
                AfxMessageBox(str);
           }
      }

--------------------------------------------------------------------------------

7. 得到l(f)istctrl中所有选中行的序号

      Ҏ(gu)一Q?br>      CString str;
      for(int i=0; i<m_list.GetItemCount(); i++)
      {
           if( m_list.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED )
           {
                str.Format(_T("选中?jin)?d?), i);
                AfxMessageBox(str);
           }
      }

      Ҏ(gu)二:(x)
      POSITION pos = m_list.GetFirstSelectedItemPosition();
      if (pos == NULL)
           TRACE0("No items were selected!\n");
      else
      {
           while (pos)
           {
                int nItem = m_list.GetNextSelectedItem(pos);
                TRACE1("Item %d was selected!\n", nItem);
                // you could do your own processing on nItem here
           }
      }

--------------------------------------------------------------------------------

8. 得到item的信?/strong>
      TCHAR szBuf[1024];
      LVITEM lvi;
      lvi.iItem = nItemIndex;
      lvi.iSubItem = 0;
      lvi.mask = LVIF_TEXT;
      lvi.pszText = szBuf;
      lvi.cchTextMax = 1024;
      m_list.GetItem(&lvi);

      关于得到讄item的状态,q可以参考msdn文章
      Q173242: Use Masks to Set/Get Item States in CListCtrl
               http://support.microsoft.com/kb/173242/en-us

--------------------------------------------------------------------------------

9. 得到l(f)istctrl的所有列的header字符串内?br>      LVCOLUMN lvcol;
      char str[256];
      int   nColNum;
      CString strColumnName[4];//假如??/p>

      nColNum = 0;
      lvcol.mask = LVCF_TEXT;
      lvcol.pszText = str;
      lvcol.cchTextMax = 256;
      while(m_list.GetColumn(nColNum, &lvcol))
      {
           strColumnName[nColNum] = lvcol.pszText;
           nColNum++;
      }

--------------------------------------------------------------------------------

10. 使listctrl中一可见,x动滚动条
    m_list.EnsureVisible(i, FALSE);
--------------------------------------------------------------------------------

11. 得到l(f)istctrl列数
    int nHeadNum = m_list.GetHeaderCtrl()->GetItemCount();
--------------------------------------------------------------------------------

12. 删除所有列
    Ҏ(gu)一Q?br>         while ( m_list.DeleteColumn (0))
       因ؓ(f)你删除了(jin)W一列后Q后面的列会(x)依次向上Ud?/p>

    Ҏ(gu)二:(x)
      int nColumns = 4;
      for (int i=nColumns-1; i>=0; i--)
          m_list.DeleteColumn (i);

--------------------------------------------------------------------------------

13. 得到单击的listctrl的行列号
      dlistctrl控g的NM_CLICK消息相应函数
      void CTest6Dlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)
      {
           // Ҏ(gu)一Q?br>           /*
           DWORD dwPos = GetMessagePos();
           CPoint point( LOWORD(dwPos), HIWORD(dwPos) );
  
           m_list.ScreenToClient(&point);
  
           LVHITTESTINFO lvinfo;
           lvinfo.pt = point;
           lvinfo.flags = LVHT_ABOVE;
    
           int nItem = m_list.SubItemHitTest(&lvinfo);
           if(nItem != -1)
           {
                CString strtemp;
                strtemp.Format("单击的是W?d行第%d?, lvinfo.iItem, lvinfo.iSubItem);
                AfxMessageBox(strtemp);
           }
          */
  
          // Ҏ(gu)?
          /*
           NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
           if(pNMListView->iItem != -1)
           {
                CString strtemp;
                strtemp.Format("单击的是W?d行第%d?,
                                pNMListView->iItem, pNMListView->iSubItem);
                AfxMessageBox(strtemp);
           }
          */
           *pResult = 0;
      }

--------------------------------------------------------------------------------

14. 判断是否点击在listctrl的checkbox?/strong>
      dlistctrl控g的NM_CLICK消息相应函数
      void CTest6Dlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)
      {
           DWORD dwPos = GetMessagePos();
           CPoint point( LOWORD(dwPos), HIWORD(dwPos) );
  
           m_list.ScreenToClient(&point);
  
           LVHITTESTINFO lvinfo;
           lvinfo.pt = point;
           lvinfo.flags = LVHT_ABOVE;
    
           UINT nFlag;
           int nItem = m_list.HitTest(point, &nFlag);
           //判断是否点在checkbox?br>           if(nFlag == LVHT_ONITEMSTATEICON)
           {
                AfxMessageBox("点在listctrl的checkbox?);
           }
           *pResult = 0;
      }

--------------------------------------------------------------------------------

15. 右键点击listctrl的item弹出菜单
      dlistctrl控g的NM_RCLICK消息相应函数
      void CTest6Dlg::OnRclickList1(NMHDR* pNMHDR, LRESULT* pResult)
      {
           NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
           if(pNMListView->iItem != -1)
           {
                DWORD dwPos = GetMessagePos();
                CPoint point( LOWORD(dwPos), HIWORD(dwPos) );
   
                CMenu menu;
                VERIFY( menu.LoadMenu( IDR_MENU1 ) );
                CMenu* popup = menu.GetSubMenu(0);
                ASSERT( popup != NULL );
                popup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this );
           }
           *pResult = 0;
}

 
--------------------------------------------------------------------------------

16. item切换焦点?包括用键盘和鼠标切换item?Q状态的一些变化顺?/strong>
      dlistctrl控g的LVN_ITEMCHANGED消息相应函数
      void CTest6Dlg::OnItemchangedList1(NMHDR* pNMHDR, LRESULT* pResult)
      {
           NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
           // TODO: Add your control notification handler code here
   
           CString sTemp;

           if((pNMListView->uOldState & LVIS_FOCUSED) == LVIS_FOCUSED &&
            (pNMListView->uNewState & LVIS_FOCUSED) == 0)
           {
                sTemp.Format("%d losted focus",pNMListView->iItem);
           }
           else if((pNMListView->uOldState & LVIS_FOCUSED) == 0 &&
               (pNMListView->uNewState & LVIS_FOCUSED) == LVIS_FOCUSED)
           {
                sTemp.Format("%d got focus",pNMListView->iItem);
           }

           if((pNMListView->uOldState & LVIS_SELECTED) == LVIS_SELECTED &&
            (pNMListView->uNewState & LVIS_SELECTED) == 0)
           {
                sTemp.Format("%d losted selected",pNMListView->iItem);
           }
           else if((pNMListView->uOldState & LVIS_SELECTED) == 0 &&
            (pNMListView->uNewState & LVIS_SELECTED) == LVIS_SELECTED)
           {
                sTemp.Format("%d got selected",pNMListView->iItem);
           }
   
           *pResult = 0;
      }

--------------------------------------------------------------------------------

17. 得到另一个进E里的listctrl控g的item内容
http://www.codeproject.com/threads/int64_memsteal.asp

--------------------------------------------------------------------------------

18. 选中listview中的item
Q131284: How To Select a Listview Item Programmatically
http://support.microsoft.com/kb/131284/en-us

--------------------------------------------------------------------------------

19. 如何在CListView中用CListCtrl的派生类
http://www.codeguru.com/cpp/controls/listview/introduction/article.php/c919/

--------------------------------------------------------------------------------

20. listctrl的subitemd图标
      m_list.SetExtendedStyle(LVS_EX_SUBITEMIMAGES);
      m_list.SetItem(..); //具体参数请参考msdn

--------------------------------------------------------------------------------

21. 在CListCtrl昄文gQƈҎ(gu)文gcd来显C图?/strong>
      |上扑ֈ的代码,share
      BOOL CTest6Dlg::OnInitDialog()
      {
           CDialog::OnInitDialog();
  
           HIMAGELIST himlSmall;
           HIMAGELIST himlLarge;
           SHFILEINFO sfi;
           char cSysDir[MAX_PATH];
           CString strBuf;

           memset(cSysDir, 0, MAX_PATH);
  
           GetWindowsDirectory(cSysDir, MAX_PATH);
           strBuf = cSysDir;
           sprintf(cSysDir, "%s", strBuf.Left(strBuf.Find("\\")+1));

           himlSmall = (HIMAGELIST)SHGetFileInfo ((LPCSTR)cSysDir,
                      0,
                      &sfi,
                      sizeof(SHFILEINFO),
                      SHGFI_SYSICONINDEX | SHGFI_SMALLICON );
  
           himlLarge = (HIMAGELIST)SHGetFileInfo((LPCSTR)cSysDir,
                      0,
                      &sfi,
                      sizeof(SHFILEINFO),
                      SHGFI_SYSICONINDEX | SHGFI_LARGEICON);
  
           if (himlSmall && himlLarge)
           {
                ::SendMessage(m_list.m_hWnd, LVM_SETIMAGELIST,
                             (WPARAM)LVSIL_SMALL, (LPARAM)himlSmall);
                ::SendMessage(m_list.m_hWnd, LVM_SETIMAGELIST,
                             (WPARAM)LVSIL_NORMAL, (LPARAM)himlLarge);
           }
           return TRUE; // return TRUE unless you set the focus to a control
      }

      void CTest6Dlg::AddFiles(LPCTSTR lpszFileName, BOOL bAddToDocument)
      {
           int nIcon = GetIconIndex(lpszFileName, FALSE, FALSE);
           CString strSize;
           CFileFind filefind;

           // get file size
           if (filefind.FindFile(lpszFileName))
           {
                filefind.FindNextFile();
                strSize.Format("%d", filefind.GetLength());
           }
           else
                strSize = "0";
  
           // split path and filename
           CString strFileName = lpszFileName;
           CString strPath;

           int nPos = strFileName.ReverseFind('\\');
           if (nPos != -1)
           {
                strPath = strFileName.Left(nPos);
                strFileName = strFileName.Mid(nPos + 1);
           }
  
           // insert to list
           int nItem = m_list.GetItemCount();
           m_list.InsertItem(nItem, strFileName, nIcon);
           m_list.SetItemText(nItem, 1, strSize);
           m_list.SetItemText(nItem, 2, strFileName.Right(3));
           m_list.SetItemText(nItem, 3, strPath);
      }

      int CTest6Dlg::GetIconIndex(LPCTSTR lpszPath, BOOL bIsDir, BOOL bSelected)
      {
           SHFILEINFO sfi;
           memset(&sfi, 0, sizeof(sfi));
  
           if (bIsDir)
           {
            SHGetFileInfo(lpszPath,
                         FILE_ATTRIBUTE_DIRECTORY,
                         &sfi,
                         sizeof(sfi),
                         SHGFI_SMALLICON | SHGFI_SYSICONINDEX |
                         SHGFI_USEFILEATTRIBUTES |(bSelected ? SHGFI_OPENICON : 0));
            return sfi.iIcon;
           }
           else
           {
            SHGetFileInfo (lpszPath,
                         FILE_ATTRIBUTE_NORMAL,
                         &sfi,
                         sizeof(sfi),
                         SHGFI_SMALLICON | SHGFI_SYSICONINDEX |
                         SHGFI_USEFILEATTRIBUTES | (bSelected ? SHGFI_OPENICON : 0));
            return   sfi.iIcon;
           }
           return -1;
      }


本文来自CSDN博客Q{载请标明出处Q?a >http://blog.csdn.net/KataDoc360/archive/2009/05/18/4195356.aspx



zhaoyg 2010-01-12 00:19 发表评论
]]>
讄控g的字?/title><link>http://www.shnenglu.com/zhaoyg/archive/2009/12/30/104492.html</link><dc:creator>zhaoyg</dc:creator><author>zhaoyg</author><pubDate>Wed, 30 Dec 2009 14:05:00 GMT</pubDate><guid>http://www.shnenglu.com/zhaoyg/archive/2009/12/30/104492.html</guid><wfw:comment>http://www.shnenglu.com/zhaoyg/comments/104492.html</wfw:comment><comments>http://www.shnenglu.com/zhaoyg/archive/2009/12/30/104492.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/zhaoyg/comments/commentRss/104492.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/zhaoyg/services/trackbacks/104492.html</trackback:ping><description><![CDATA[<span style="COLOR: #000000">前提假定Q对话框上有一个ID为IDC_TEST的控件?br><br>在OnInitDialog函数中插入一下代码:(x)<br> <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"><span style="COLOR: #000000">m_font.CreatePointFont(</span><span style="COLOR: #000000">909</span><span style="COLOR: #000000">,_T(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">宋体</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">));<br>GetDlgItem(IDC_TEST)</span><span style="COLOR: #000000">-></span><span style="COLOR: #000000">SetFont(</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">m_font);</span></div> ~译后便可看见效?br><br>说明Q?br>在我W一ơ尝试更Ҏ(gu)件变量的字体Ӟ使用?jin)如下的代码Q?br> <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.shnenglu.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">CFont font<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif">font.CreatePointFont(</span><span style="COLOR: #000000">909</span><span style="COLOR: #000000">,_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.shnenglu.com/Images/OutliningIndicators/None.gif">GetDlgItem(IDC_TEST)</span><span style="COLOR: #000000">-></span><span style="COLOR: #000000">SetFont(</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">font);<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span></div> <br>l果Q控件的字体q没有改变。后来得知SetFont函数有如下要求:(x)<br>The SetFont() member function of the CWnd class changes the font in a specified control. For this function to work correctly in a Windows- based application, you must ensure that the CFont object specified in the SetFont() call is not destroyed until after the specified control has been destroyed.</span> <br>其中?...you must ensure that the CFont object specified in the SetFont() call is not destroyed until after the specified control has been destroyed. "便是关键?br>所以在更该控g的字体时QCFont对象必须是静(rn)态或者成员变量? <img src ="http://www.shnenglu.com/zhaoyg/aggbug/104492.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/zhaoyg/" target="_blank">zhaoyg</a> 2009-12-30 22:05 <a href="http://www.shnenglu.com/zhaoyg/archive/2009/12/30/104492.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>无模式对话框的销?/title><link>http://www.shnenglu.com/zhaoyg/archive/2009/12/03/102387.html</link><dc:creator>zhaoyg</dc:creator><author>zhaoyg</author><pubDate>Thu, 03 Dec 2009 12:27:00 GMT</pubDate><guid>http://www.shnenglu.com/zhaoyg/archive/2009/12/03/102387.html</guid><wfw:comment>http://www.shnenglu.com/zhaoyg/comments/102387.html</wfw:comment><comments>http://www.shnenglu.com/zhaoyg/archive/2009/12/03/102387.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/zhaoyg/comments/commentRss/102387.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/zhaoyg/services/trackbacks/102387.html</trackback:ping><description><![CDATA[<br>from  MSDN<br><br> <p>When you implement a modeless dialog box, always override the <strong>OnCancel</strong> member function and call <strong>DestroyWindow</strong> from within it. Don't call the base class <strong>CDialog::OnCancel</strong>, because it calls <strong>EndDialog</strong>, which will make the dialog box invisible but will not destroy it. You should also override <strong>PostNcDestroy</strong> for modeless dialog boxes in order to delete <strong>this</strong>, since modeless dialog boxes are usually allocated with <strong>new</strong>. Modal dialog boxes are usually constructed on the frame and do not need <strong>PostNcDestroy</strong> cleanup.</p> <img src ="http://www.shnenglu.com/zhaoyg/aggbug/102387.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/zhaoyg/" target="_blank">zhaoyg</a> 2009-12-03 20:27 <a href="http://www.shnenglu.com/zhaoyg/archive/2009/12/03/102387.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>让CListBox响应鼠标右键http://www.shnenglu.com/zhaoyg/archive/2009/11/30/102250.htmlzhaoygzhaoygSun, 29 Nov 2009 18:54:00 GMThttp://www.shnenglu.com/zhaoyg/archive/2009/11/30/102250.htmlhttp://www.shnenglu.com/zhaoyg/comments/102250.htmlhttp://www.shnenglu.com/zhaoyg/archive/2009/11/30/102250.html#Feedback0http://www.shnenglu.com/zhaoyg/comments/commentRss/102250.htmlhttp://www.shnenglu.com/zhaoyg/services/trackbacks/102250.htmlq两天遇见了(jin)如何让CListBox的内容响应鼠标右键的问题Q没有头l,Google?jin)半天,基本上都是清一色的{复Q从clistboxz一个类Q且响应WM_RBUTTONDOWN消息。但起初的实践发玎ͼq种Ҏ(gu)只是让整个控件响应右键,而我惌的是让其内容响应?br>后来才发现是我没有领(zhn)?#8220;{复”的真谛?br>
CListBoxcd应鼠标右键,需要从CListBoxcL生出一个新c,且在该派生类中添加一个WM_RBUTTONDOWN消息的响应函敎ͼ例如如下代码Q?br>

void newlist::OnRButtonDown(UINT nFlags, CPoint point) 
{
    
// TODO: Add your message handler code here and/or call default

    MessageBox(_T(
"Ok,响应鼠标右键!"));

    CListBox::OnRButtonDown(nFlags, point);
}

以上q段代码是让整个listboxI间响应右键Qؓ(f)?jin)只让listbox中的条目响应叛_则需要更改ؓ(f)Q?br>
void newlist::OnRButtonDown(UINT nFlags, CPoint point) 
{
    
// TODO: Add your message handler code here and/or call default
    int i = GetCurSel();
    
if(LB_ERR != i)
    {
        MessageBox(
"ok");
    }

    CListBox::OnRButtonDown(nFlags, point);
}

因ؓ(f)当listbox没有选中内容或多选时QGetCurSel函数q回LB_ERRQ于是可以借由GetCurSel函数来实现只让listbox中的条目响应鼠标叛_Q而非整个控g?br>P.S: 一旦能够让listbox的内容响应右键,那么可以对listbox的内容实现右键弹?gu)单?jin)Q这正我惌的。下附右击listbox中的内容弹出菜单
void newlist::OnRButtonDown(UINT nFlags, CPoint point)
{
    
// TODO: 在此d消息处理E序代码?或调用默认?/span>

    POINT curpoint;
    GetCursorPos(
&curpoint);
    ScreenToClient(
&curpoint);

    RECT test;
    
int i = 0;

    
while(i<= GetCount())
    {
        GetItemRect(i, 
&test);

        
if (curpoint.y < test.bottom)
        {
            
// 当前右击项选中
            SetCurSel(i);

            
// 加蝲弹出菜单
            CMenu temp,*ptr;
            temp.LoadMenu(IDR_MENU1);
            ptr 
= temp.GetSubMenu(0);
            ClientToScreen(
&point);
            ptr
->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,point.x,point.y,GetParent());

            
break;
        }
        
else
            
// 若之前选中?jin)某?而现在的叛_又没有击中选项,则取消之前的选项
            SetCurSel(-1);

        i
++;
    }

    CListBox::OnRButtonDown(nFlags, point);
}


zhaoyg 2009-11-30 02:54 发表评论
]]>
ŷ˾þƬ| þԭavapp | þþƷ99þ㽶| þۺ97ɫֱ| 99þùۺϾƷԭ| þùƷһ| ɫþˬˬƬAV| ޹뾫ƷŮ˾þþò| AAAþþþƷ| ղþøŷһ| 99þþþƷѹۿ| Ʒþþþþ޾Ʒ | Ʒþþþþ| պ뾫Ʒþþò| 뾫Ʒþþɫ | ƷþþĻѿ| һþ֪ۺϾþ| þþƷ99Ʒ | 99þһ| þþƷ99þ˿| þþþþùƷ| һƷþð͹| þþþ| һɫþ88ۺպƷ | þúݺݰۺӰԺ | Ʒþþþþþ| ҹѸþӰԺ| þþƷ| Ʒþþþþùţţapp| þۺϾƷһ| ˼˼þúúȾƷ| ŷպľþ| þ99ۺϾƷ| ھƷþþþþþþõӰ| ھƷѾþӰԺ| þþþþþۺϺݺۺ| þþ޾Ʒ| þþƷƵ| ֻƬþøպ| þۺ| þ99һ|