﻿<?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++博客-&lt;a href="http://cppblog.com/jianc/"&gt;jianc's blog&lt;/a&gt;-随笔分类-win32</title><link>http://www.cppblog.com/jianc/category/18733.html</link><description>&lt;script type="text/javascript"&gt;
    function OnClient(){
        var tmp = 1;
        var tmp2 = 2;
        var sum = tmp + tmp2;

        alert(sum);
    }
&lt;/script&gt;</description><language>zh-cn</language><lastBuildDate>Mon, 11 Jun 2012 08:37:23 GMT</lastBuildDate><pubDate>Mon, 11 Jun 2012 08:37:23 GMT</pubDate><ttl>60</ttl><item><title>对话框淡入浅出效果</title><link>http://www.cppblog.com/jianc/archive/2012/05/29/176639.html</link><dc:creator>jianc</dc:creator><author>jianc</author><pubDate>Tue, 29 May 2012 10:52:00 GMT</pubDate><guid>http://www.cppblog.com/jianc/archive/2012/05/29/176639.html</guid><wfw:comment>http://www.cppblog.com/jianc/comments/176639.html</wfw:comment><comments>http://www.cppblog.com/jianc/archive/2012/05/29/176639.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jianc/comments/commentRss/176639.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jianc/services/trackbacks/176639.html</trackback:ping><description><![CDATA[要实现对话框淡入浅出效果, 还是挺简单的, 说白了, 就是在对话框初始化时候加个定时器, 在对话框销毁前也加个定时器, 定时器的操作, 无非就是更新对话框界面的透明度, 要改变对话框的透明度, 用一个API就搞定了:SetLayeredWindowAttributes<br /><br />恩, 思路就是这样, 这里上关键代码吧<br /><div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">typedef&nbsp;BOOL&nbsp;(__stdcall&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">FunSetLayeredWindowAttributes)(HWND&nbsp;hwnd,&nbsp;COLORREF&nbsp;crKey,&nbsp;BYTE&nbsp;bAlpha,&nbsp;DWORD&nbsp;dwFlags);<br />FunSetLayeredWindowAttributes&nbsp;funSetLayeredWindowAttributes;<br />funSetLayeredWindowAttributes&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;&nbsp;(FunSetLayeredWindowAttributes)GetProcAddress(GetModuleHandle(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">user32.dll</span><span style="color: #000000; ">"</span><span style="color: #000000; ">),&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">SetLayeredWindowAttributes</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);ModifyStyleEx(NULL,&nbsp;</span><span style="color: #000000; ">0x80000</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">WS_EX_LAYERED</span><span style="color: #008000; ">*/</span><span style="color: #000000; ">);&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">窗口要有WS_EX_LAYERED属性才能用设置透明的那个API</span></div><div></div><br /><div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">enum</span><span style="color: #000000; ">{IDT_SHOW&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">100</span><span style="color: #000000; ">,&nbsp;IDT_EXIT&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">101</span><span style="color: #000000; ">};</span></div></div>在OnInitDialog方法里面添加一个定时器</div><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">SetTimer(IDT_SHOW,&nbsp;</span><span style="color: #000000; ">50</span><span style="color: #000000; ">,&nbsp;NULL);</span></div><br />同样, 在OnCancel方法里面添加一个定时器, 顺便把IDT_SHOW定时器给KILL掉<br /><div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">KillTimer(IDT_SHOW);<br />SetTimer(IDT_EXIT,&nbsp;</span><span style="color: #000000; ">50</span><span style="color: #000000; ">,&nbsp;NULL);</span></div></div><br />OnTimer方法这样写:<br /><div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">switch</span><span style="color: #000000; ">(nIDEvent)<br />{<br /></span><span style="color: #0000FF; ">case</span><span style="color: #000000; ">&nbsp;IDT_SHOW:<br />&nbsp;&nbsp;&nbsp;&nbsp;funSetLayeredWindowAttributes(</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">m_hWnd,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;m_current&nbsp;</span><span style="color: #000000; ">%</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">255</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;m_current&nbsp;</span><span style="color: #000000; ">+=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">5</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(m_current&nbsp;</span><span style="color: #000000; ">&gt;=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">255</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KillTimer(IDT_SHOW);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">;<br /></span><span style="color: #0000FF; ">case</span><span style="color: #000000; ">&nbsp;IDT_EXIT:<br />&nbsp;&nbsp;&nbsp;&nbsp;m_current&nbsp;</span><span style="color: #000000; ">-=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">5</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;funSetLayeredWindowAttributes(</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">m_hWnd,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;m_current&nbsp;</span><span style="color: #000000; ">%</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">255</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(m_current&nbsp;</span><span style="color: #000000; ">&lt;=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">5</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CDialog::OnCancel();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KillTimer(IDT_EXIT);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">;<br />}</span></div></div><br />很简单吧, 一个淡入浅出效果就出来了<br /><br />另:<br />static控件背景透明<br />添加WM_CTLCOLOR消息映射<div>ON_WM_CTLCOLOR()<br />添加响应函数<br /><div>afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);</div><br />实现响应函数<br /><div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(IDS_STATIC&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;pWnd</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">GetDlgCtrlID())<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;pDC</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">SetBkMode(TRANSPARENT);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;(HBRUSH)::GetStockObject(NULL_BRUSH);<br />}</span></div></div><br /><br />这里, 封装了一个基类, 方便以后用<br />FadeIODlg.h<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">#pragma&nbsp;once<br /><br /></span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;CFadeIODlg&nbsp;:&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;CDialog<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;DECLARE_MESSAGE_MAP()<br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">:<br />&nbsp;&nbsp;&nbsp;&nbsp;CFadeIODlg(UINT&nbsp;uDLGID,&nbsp;CWnd</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;pParent&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;NULL);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">virtual</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">~</span><span style="color: #000000; ">CFadeIODlg();<br /><br /></span><span style="color: #0000FF; ">protected</span><span style="color: #000000; ">:<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">virtual</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;DoDataExchange(CDataExchange</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;pDX);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">virtual</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;OnCancel();<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">virtual</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;OnOK();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;afx_msg&nbsp;BOOL&nbsp;OnInitDialog();<br />&nbsp;&nbsp;&nbsp;&nbsp;afx_msg&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;OnTimer(UINT&nbsp;nIDEvent);&nbsp;&nbsp;&nbsp;&nbsp;<br /><br /></span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">:<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">enum</span><span style="color: #000000; ">{&nbsp;TIME_BEGIN&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">100</span><span style="color: #000000; ">,&nbsp;TIME_END&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">101</span><span style="color: #000000; ">};<br />&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;BOOL&nbsp;(__stdcall&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">FUNSetLayeredWindowAttributes)(HWND&nbsp;hwnd,&nbsp;COLORREF&nbsp;crKey,&nbsp;BYTE&nbsp;bAlpha,&nbsp;DWORD&nbsp;dwFlags);<br />&nbsp;&nbsp;&nbsp;&nbsp;FUNSetLayeredWindowAttributes&nbsp;m_funTransparent;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">enum</span><span style="color: #000000; ">{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MAX_TRANSPARENT&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">255</span><span style="color: #000000; ">,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">最大透明度</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NUM_BEGIN&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">10</span><span style="color: #000000; ">,&nbsp;&nbsp;&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 /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NUM_END&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">10</span><span style="color: #000000; ">,&nbsp;&nbsp;&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 /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NUM_CHANGE&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">5</span><span style="color: #000000; ">,&nbsp;&nbsp;&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 /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;};<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_currentTransparent;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">当前窗口透明度</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">};<br /><br /></span></div><br />FadeIODlg.cpp<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">stdafx.h</span><span style="color: #000000; ">"</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">UI.h</span><span style="color: #000000; ">"</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">FadeIODlg.h</span><span style="color: #000000; ">"</span><span style="color: #000000; "><br /><br />#ifdef&nbsp;_DEBUG<br /></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;new&nbsp;DEBUG_NEW</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">#undef</span><span style="color: #000000; ">&nbsp;THIS_FILE</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;THIS_FILE[]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;__FILE__;<br /></span><span style="color: #0000FF; ">#endif</span><span style="color: #000000; "><br /><br /><br />CFadeIODlg::CFadeIODlg(UINT&nbsp;uDLGID,&nbsp;CWnd</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;pParent&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;=&nbsp;NULL&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;CDialog(uDLGID,&nbsp;pParent)<br />{}<br /><br />CFadeIODlg::</span><span style="color: #000000; ">~</span><span style="color: #000000; ">CFadeIODlg()<br />{}<br /><br /></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;CFadeIODlg::DoDataExchange(CDataExchange</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;pDX)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;CDialog::DoDataExchange(pDX);<br />}<br /><br /><br />BEGIN_MESSAGE_MAP(CFadeIODlg,&nbsp;CDialog)<br />&nbsp;&nbsp;&nbsp;&nbsp;ON_WM_TIMER()<br />END_MESSAGE_MAP()<br /><br />BOOL&nbsp;CFadeIODlg::OnInitDialog()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;CDialog::OnInitDialog();<br />&nbsp;&nbsp;&nbsp;&nbsp;ModifyStyleEx(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0x80000</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;m_currentTransparent&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;m_funTransparent&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(FUNSetLayeredWindowAttributes)GetProcAddress(GetModuleHandle(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">User32.dll</span><span style="color: #000000; ">"</span><span style="color: #000000; ">),&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">SetLayeredWindowAttributes</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(m_funTransparent)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">m_funTransparent(this-&gt;GetSafeHwnd(),&nbsp;0,&nbsp;0,&nbsp;2);</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetTimer(TIME_BEGIN,&nbsp;NUM_BEGIN,&nbsp;NULL);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;TRUE;<br />}<br /><br /></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;CFadeIODlg::OnTimer(UINT&nbsp;nIDEvent)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">switch</span><span style="color: #000000; ">(nIDEvent)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">case</span><span style="color: #000000; ">&nbsp;TIME_BEGIN:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(m_currentTransparent&nbsp;</span><span style="color: #000000; ">&lt;=</span><span style="color: #000000; ">&nbsp;MAX_TRANSPARENT)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_funTransparent(</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">GetSafeHwnd(),&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;m_currentTransparent,&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_currentTransparent&nbsp;</span><span style="color: #000000; ">+=</span><span style="color: #000000; ">&nbsp;NUM_CHANGE;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KillTimer(TIME_BEGIN);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">case</span><span style="color: #000000; ">&nbsp;TIME_END:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(m_currentTransparent&nbsp;</span><span style="color: #000000; ">&gt;=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(m_currentTransparent&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;MAX_TRANSPARENT)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_currentTransparent&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;MAX_TRANSPARENT;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_funTransparent(</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">GetSafeHwnd(),&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;m_currentTransparent,&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_currentTransparent&nbsp;</span><span style="color: #000000; ">-=</span><span style="color: #000000; ">&nbsp;NUM_CHANGE;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KillTimer(TIME_END);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CDialog::OnCancel();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /></span><span style="color: #0000FF; ">void</span><span style="color: #000000;">&nbsp;CFadeIODlg::OnOK()<br />{<br />}<br /><br /></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;CFadeIODlg::OnCancel()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(m_funTransparent)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KillTimer(TIME_BEGIN);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetTimer(TIME_END,&nbsp;NUM_END,&nbsp;NULL);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CDialog::OnCancel();<br />}</span></div><br /><br />ok, 完成, 以后直接继承这个对话框, 稍微修改一下, 效果就出来了</div><img src ="http://www.cppblog.com/jianc/aggbug/176639.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jianc/" target="_blank">jianc</a> 2012-05-29 18:52 <a href="http://www.cppblog.com/jianc/archive/2012/05/29/176639.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HOOK CreateProcess没什么作用</title><link>http://www.cppblog.com/jianc/archive/2012/05/24/176027.html</link><dc:creator>jianc</dc:creator><author>jianc</author><pubDate>Thu, 24 May 2012 07:59:00 GMT</pubDate><guid>http://www.cppblog.com/jianc/archive/2012/05/24/176027.html</guid><wfw:comment>http://www.cppblog.com/jianc/comments/176027.html</wfw:comment><comments>http://www.cppblog.com/jianc/archive/2012/05/24/176027.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jianc/comments/commentRss/176027.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jianc/services/trackbacks/176027.html</trackback:ping><description><![CDATA[本来以为, 对CreateProcessA和CreateProcessW进行HOOK, 就可以对进程的打开做一到防线, 比如, 阻止某某文件运行<br />但是发现没什么作用, 看了一下, kernel32.dll确实是导出了CreateProcessA和CreateProcessW, 但估计这两个只是转发函数, 其实调用的是NTDLL.DLL里面的ZwCreateProcess或ZwCreateProcessEx<br /><img src ="http://www.cppblog.com/jianc/aggbug/176027.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jianc/" target="_blank">jianc</a> 2012-05-24 15:59 <a href="http://www.cppblog.com/jianc/archive/2012/05/24/176027.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MFC对话框工程, theApp对象的析构</title><link>http://www.cppblog.com/jianc/archive/2012/05/23/175894.html</link><dc:creator>jianc</dc:creator><author>jianc</author><pubDate>Wed, 23 May 2012 06:23:00 GMT</pubDate><guid>http://www.cppblog.com/jianc/archive/2012/05/23/175894.html</guid><wfw:comment>http://www.cppblog.com/jianc/comments/175894.html</wfw:comment><comments>http://www.cppblog.com/jianc/archive/2012/05/23/175894.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jianc/comments/commentRss/175894.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jianc/services/trackbacks/175894.html</trackback:ping><description><![CDATA[一开始, 我不清楚某某原因, 我在继承自CWinApp的app类中添加一个虚函数<div>virtual int ExitInstance();<br /><br />然后, 当我在对话框工程退出的时候, 发现这个ExitInstance方法并没有被调用, 我就有些糊涂, baidu+google, ...<br /><br />然后, 我就想, 我添加一个app类的析构方法算了, 但发现这个析构函数还是诡异的没被调用...<br /><br />theApp原本是一个全局对象, 它的构造和析构原本就是CRT库来处理的<br /><br />后来发现, 只要在theApp对象的成员InitInstance方法返回TRUE(默认是返回FALSE)就可以成功的调用ExitInstance和析构函数了<br /><br />ok, 诡异的InitInstance返回FALSE后, 就不会调用theApp对象的析构!</div><img src ="http://www.cppblog.com/jianc/aggbug/175894.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jianc/" target="_blank">jianc</a> 2012-05-23 14:23 <a href="http://www.cppblog.com/jianc/archive/2012/05/23/175894.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GDI Plus库使用基础</title><link>http://www.cppblog.com/jianc/archive/2012/05/17/175197.html</link><dc:creator>jianc</dc:creator><author>jianc</author><pubDate>Thu, 17 May 2012 05:19:00 GMT</pubDate><guid>http://www.cppblog.com/jianc/archive/2012/05/17/175197.html</guid><wfw:comment>http://www.cppblog.com/jianc/comments/175197.html</wfw:comment><comments>http://www.cppblog.com/jianc/archive/2012/05/17/175197.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jianc/comments/commentRss/175197.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jianc/services/trackbacks/175197.html</trackback:ping><description><![CDATA[vc6使用GDI Plus库要装上Platform SDK2003<br /><br />配置好库环境后, 下面写出使用GDI Plus的基本步骤:<br />1.包含头文件<br />#include &lt;gdiplus.h&gt;<br />2.使用名字空间<br />using namespace Gdiplus;<br />3.连接必要的导入库文件<br />#pragma comment(lib, "gdiplus.lib")<br />4.初始化<br /><div>ULONG_PTR m_gdiplusToken;<br /><div>GdiplusStartupInput m_gdiplusStartupInput;<br /><div>GdiplusStartup(&amp;m_gdiplusToken, &amp;m_gdiplusStartupInput, NULL);</div>5.使用GDI Plus库<br />6.用完库后, 释放操作<br /><div>GdiplusShutdown(m_gdiplusToken);</div></div></div><img src ="http://www.cppblog.com/jianc/aggbug/175197.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jianc/" target="_blank">jianc</a> 2012-05-17 13:19 <a href="http://www.cppblog.com/jianc/archive/2012/05/17/175197.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MFC点击Dialog窗体可拖动</title><link>http://www.cppblog.com/jianc/archive/2012/05/11/174547.html</link><dc:creator>jianc</dc:creator><author>jianc</author><pubDate>Fri, 11 May 2012 02:59:00 GMT</pubDate><guid>http://www.cppblog.com/jianc/archive/2012/05/11/174547.html</guid><wfw:comment>http://www.cppblog.com/jianc/comments/174547.html</wfw:comment><comments>http://www.cppblog.com/jianc/archive/2012/05/11/174547.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jianc/comments/commentRss/174547.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jianc/services/trackbacks/174547.html</trackback:ping><description><![CDATA[<div>MFC创建一个可通过鼠标点击客户区拖动窗口位置的方法<br /><br />通过添加消息响应函数<br />afx_msg UINT OnNcHitTest(CPoint point);<br />添加宏<br />ON_WM_NCHITTEST()<br /><br />然后, 定义OnNcHitTest的行为即可, OnNcHitTest的代码如下:<br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">UINT&nbsp;CTimerDlg::OnNcHitTest(CPoint&nbsp;point)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;CRect&nbsp;rect;<br />&nbsp;&nbsp;&nbsp;&nbsp;GetClientRect(rect);<br />&nbsp;&nbsp;&nbsp;&nbsp;ClientToScreen(rect);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(rect.PtInRect(point))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;HTCAPTION;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;CDialog::OnNcHitTest(point);<br />}</span></div><br />首先, 发生WM_NCHITTEST消息的时候, 程序先取得客户区的窗口矩形, 这里用到GetClientRect方法得到, 由于GetClientRect取得的是相对于窗口坐标系统, 但OnNcHitTest的参数point却是相对于屏幕的坐标系统, 所以这里用到了ClientToScreen把取到的客户区矩形转成相对于屏幕的坐标, 然后用CRect类的PtInRect方法判断point是否落在这个矩形里面, 如果是, 则返回HTCAPTION(就相当于这次点击是点击标题栏), 所以, 就可以这样来拖动窗口了. 如果, OnNcHitTest直接返回HTCAPTION的话, 那么, 但用户点击非客户区的时候, 有些功能会失效, 比如点击系统的关闭按钮, 试一下就会发现这个按钮无效了; ok, 如果点击的是非客户端, 者直接返回CDialog::OnNcHitTest(point), 这就是按默认处理了.<br /><br />以上的这个方法比较麻烦, 其实可以更简单一点, 只要先调用父类的OnNcHitTest(point), 取得返回值, 在判断是不是HTCLIENT, 如果是, 则返回HTCAPTION, 否则直接返回父类OnNcHitTest(point)的返回值就ok了, 修改后如下:<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">UINT&nbsp;CTimerDlg::OnNcHitTest(CPoint&nbsp;point)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;UINT&nbsp;uRet&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;CDialog::OnNcHitTest(point);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(HTCLIENT&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;uRet)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;HTCAPTION;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;uRet;<br />}</span></div><br />再简化一下, 就成这样子:<br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">UINT&nbsp;CTimerDlg::OnNcHitTest(CPoint&nbsp;point)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;UINT&nbsp;uRet&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;CDialog::OnNcHitTest(point);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;(HTCLIENT&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;uRet)&nbsp;</span><span style="color: #000000; ">?</span><span style="color: #000000; ">&nbsp;HTCAPTION&nbsp;:&nbsp;uRet;<br />}</span></div><br /><br /><br /></div><img src ="http://www.cppblog.com/jianc/aggbug/174547.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jianc/" target="_blank">jianc</a> 2012-05-11 10:59 <a href="http://www.cppblog.com/jianc/archive/2012/05/11/174547.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>可等待计时器内核对象</title><link>http://www.cppblog.com/jianc/archive/2012/05/10/174491.html</link><dc:creator>jianc</dc:creator><author>jianc</author><pubDate>Thu, 10 May 2012 12:38:00 GMT</pubDate><guid>http://www.cppblog.com/jianc/archive/2012/05/10/174491.html</guid><wfw:comment>http://www.cppblog.com/jianc/comments/174491.html</wfw:comment><comments>http://www.cppblog.com/jianc/archive/2012/05/10/174491.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jianc/comments/commentRss/174491.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jianc/services/trackbacks/174491.html</trackback:ping><description><![CDATA[<div>之前学习win32 platform sdk编程的时候, 有学到一个计时器的东西, 那个挺简单的, 就是调用SetTimer创建一个基于某个窗口回调的计时器, 既间隔时间使窗口收到WM_TIMER消息, 或间隔时间, 调用我们自己定义的一个回调函数.<br />创建可等待计时器内核对象, 可以实现类似功能, 现在, 下边给出如何使用可等待计时器内核对象<br /><div>1.CreateWatchDogTimer</div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><span style="color: #000000; ">HANDLE&nbsp;CreateWatchDogTimer(<br />&nbsp;&nbsp;LPCWSTR&nbsp;pszWatchDogName,<br />&nbsp;&nbsp;DWORD&nbsp;dwPeriod,<br />&nbsp;&nbsp;DWORD&nbsp;dwWait,<br />&nbsp;&nbsp;DWORD&nbsp;dwDfltAction,<br />&nbsp;&nbsp;DWORD&nbsp;dwParam,<br />&nbsp;&nbsp;DWORD&nbsp;dwFlags<br />);</span></div><br /><br />2.SetWaitableTimer<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">BOOL&nbsp;WINAPI&nbsp;SetWaitableTimer(<br />&nbsp;&nbsp;__in&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HANDLE&nbsp;hTimer,<br />&nbsp;&nbsp;__in&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;LARGE_INTEGER</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;pDueTime,<br />&nbsp;&nbsp;__in&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LONG&nbsp;lPeriod,<br />&nbsp;&nbsp;__in_opt&nbsp;&nbsp;PTIMERAPCROUTINE&nbsp;pfnCompletionRoutine,<br />&nbsp;&nbsp;__in_opt&nbsp;&nbsp;LPVOID&nbsp;lpArgToCompletionRoutine,<br />&nbsp;&nbsp;__in&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BOOL&nbsp;fResume<br />);</span></div><br /><br />CreateWatchDogTimer函数就是创建一个可等待事件内核对象<br />SetWaitableTimer函数就是设置内核对象的触发时间和时间间隔<br /><br />废话不多说了, 这里直接上代码<br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;CDialogDemoDlg::OnBtnCreateTimer()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;SYSTEMTIME&nbsp;st;<br />&nbsp;&nbsp;&nbsp;&nbsp;st.wYear&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">2012</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;st.wDay&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">10</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;st.wDayOfWeek&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;st.wHour&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">20</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;st.wMilliseconds&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;st.wMinute&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">16</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;st.wMonth&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">5</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;st.wSecond&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;FILETIME&nbsp;localft;<br />&nbsp;&nbsp;&nbsp;&nbsp;FILETIME&nbsp;utc;<br />&nbsp;&nbsp;&nbsp;&nbsp;SystemTimeToFileTime(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">st,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">localft);<br />&nbsp;&nbsp;&nbsp;&nbsp;LocalFileTimeToFileTime(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">localft,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">utc);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;LARGE_INTEGER&nbsp;liUTC;<br />&nbsp;&nbsp;&nbsp;&nbsp;liUTC.LowPart&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;utc.dwLowDateTime;<br />&nbsp;&nbsp;&nbsp;&nbsp;liUTC.HighPart&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;utc.dwHighDateTime;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;m_Timer&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;CreateWaitableTimer(NULL,&nbsp;FALSE,&nbsp;NULL);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;SetWaitableTimer(m_Timer,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">liUTC,&nbsp;</span><span style="color: #000000; ">10</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1000</span><span style="color: #000000; ">,&nbsp;NULL,&nbsp;NULL,&nbsp;FALSE);<br />}<br /><br /></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;CDialogDemoDlg::ThreadProc2(CDialogDemoDlg</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;pDlg)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;ret&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;WaitForSingleObject(pDlg</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">m_Timer,&nbsp;INFINITE);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(WAIT_OBJECT_0&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;ret)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AfxMessageBox(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">可等待事件内核对象触发!</span><span style="color: #000000; ">"</span><span style="color: #000000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</span></div><br /><br />ThreadProc2是一个线程, 当时间一到, WaitForSingleObject就会返回, 因为这里创建的是一个自动复位内核对象, 说以WaitForSingleObject返回是会自动把内核对象复位, 这里为演示, 写了个死循环, 所以, 下一次调用WaitForSingleObject时, 如果时间未到, 线程任然会被挂起.<br />具体用法细节, MSDN<br />参考: windows核心编程</div><img src ="http://www.cppblog.com/jianc/aggbug/174491.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jianc/" target="_blank">jianc</a> 2012-05-10 20:38 <a href="http://www.cppblog.com/jianc/archive/2012/05/10/174491.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>修改文件的时间DEMO</title><link>http://www.cppblog.com/jianc/archive/2012/04/27/172954.html</link><dc:creator>jianc</dc:creator><author>jianc</author><pubDate>Fri, 27 Apr 2012 11:45:00 GMT</pubDate><guid>http://www.cppblog.com/jianc/archive/2012/04/27/172954.html</guid><wfw:comment>http://www.cppblog.com/jianc/comments/172954.html</wfw:comment><comments>http://www.cppblog.com/jianc/archive/2012/04/27/172954.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jianc/comments/commentRss/172954.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jianc/services/trackbacks/172954.html</trackback:ping><description><![CDATA[无事, 直接上代码<br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">windows.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">iostream</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">using</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">namespace</span><span style="color: #000000; ">&nbsp;std;<br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;main(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;argc,&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;argv[])<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;FILETIME&nbsp;fTm;<br />&nbsp;&nbsp;&nbsp;&nbsp;SYSTEMTIME&nbsp;sysTm;<br />&nbsp;&nbsp;&nbsp; HANDLE&nbsp;hFile;<br />&nbsp;&nbsp;&nbsp; hFile&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;CreateFile(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">d:/test.txt</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;GENERIC_READ&nbsp;</span><span style="color: #000000; ">|</span><span style="color: #000000; ">&nbsp;GENERIC_WRITE,&nbsp;FILE_SHARE_READ,&nbsp;NULL,&nbsp;OPEN_EXISTING,&nbsp;FILE_ATTRIBUTE_ARCHIVE,&nbsp;NULL);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(INVALID_HANDLE_VALUE&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;hFile)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">no</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;GetLocalTime(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">sysTm);<br />&nbsp;&nbsp;&nbsp;&nbsp;sysTm.wYear&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">2013</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp; SystemTimeToFileTime(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">sysTm,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">fTm);<br />&nbsp;&nbsp;&nbsp; BOOL&nbsp;bRet&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;SetFileTime(hFile,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">fTm,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">fTm,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">fTm);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;ret&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;GetLastError();<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(bRet)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">ok</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp; </span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />}</span></div><br />主要调用SystemTimeToFileTime<br /><img src ="http://www.cppblog.com/jianc/aggbug/172954.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jianc/" target="_blank">jianc</a> 2012-04-27 19:45 <a href="http://www.cppblog.com/jianc/archive/2012/04/27/172954.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>搜索MessageBox窗口的显示消息</title><link>http://www.cppblog.com/jianc/archive/2012/04/01/169786.html</link><dc:creator>jianc</dc:creator><author>jianc</author><pubDate>Sun, 01 Apr 2012 06:47:00 GMT</pubDate><guid>http://www.cppblog.com/jianc/archive/2012/04/01/169786.html</guid><wfw:comment>http://www.cppblog.com/jianc/comments/169786.html</wfw:comment><comments>http://www.cppblog.com/jianc/archive/2012/04/01/169786.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jianc/comments/commentRss/169786.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jianc/services/trackbacks/169786.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">BOOL&nbsp;CALLBACK&nbsp;EnumWindowsProc(HWND&nbsp;hwnd,&nbsp;LPARAM&nbsp;lParam)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;TCHAR&nbsp;szBuf[</span><span style="color: #000000; ">4096</span><span style="color: #000000; ">];<br />&nbsp;&nbsp;&nbsp;&nbsp;GetClassName(hwnd,&nbsp;szBuf,&nbsp;</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(szBuf));<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">&nbsp;str&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;szBuf;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(</span><span style="color: #000000; ">!</span><span style="color: #000000; ">str.compare(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">#32770</span><span style="color: #000000; ">"</span><span style="color: #000000; ">))<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HWND&nbsp;hSubWnd&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;GetDlgItem(hwnd,&nbsp;</span><span style="color: #000000; ">0xffff</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(hSubWnd)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;len&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;GetWindowText(hSubWnd,&nbsp;szBuf,&nbsp;</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(szBuf));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">yes:</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">szBuf&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;TRUE;<br />}<br /><br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;EnumWindows(EnumWindowsProc,&nbsp;NULL);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />}</span></div><img src ="http://www.cppblog.com/jianc/aggbug/169786.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jianc/" target="_blank">jianc</a> 2012-04-01 14:47 <a href="http://www.cppblog.com/jianc/archive/2012/04/01/169786.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>