<?xml version="1.0" encoding="UTF-8" ?> <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>WTL</title><link>http://blogs.wankuma.com/rapt/category/712.aspx</link><description>WTL</description><managingEditor>RAPT</managingEditor><dc:language>ja-JP</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>RAPT</dc:creator><title>INI 編集ツール IniModifier を作成してみる (3)</title><link>http://blogs.wankuma.com/rapt/archive/2008/08/17/153287.aspx</link><pubDate>Sun, 17 Aug 2008 16:20:00 GMT</pubDate><guid>http://blogs.wankuma.com/rapt/archive/2008/08/17/153287.aspx</guid><wfw:comment>http://blogs.wankuma.com/rapt/comments/153287.aspx</wfw:comment><comments>http://blogs.wankuma.com/rapt/archive/2008/08/17/153287.aspx#Feedback</comments><slash:comments>235</slash:comments><wfw:commentRss>http://blogs.wankuma.com/rapt/comments/commentRss/153287.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/rapt/services/trackbacks/153287.aspx</trackback:ping><description>&lt;h1&gt;INI 編集ツール IniModifier を作成してみる (3)&lt;/h1&gt;
&lt;p&gt;過去の記事へのリンク：
&lt;br&gt;&lt;A href="http://blogs.wankuma.com/rapt/archive/2008/08/16/153180.aspx" title="INI 編集ツール IniModifier を作成してみる (1) へ"&gt;INI 編集ツール IniModifier を作成してみる (1)&lt;/a&gt;
&lt;br&gt;&lt;A href="http://blogs.wankuma.com/rapt/archive/2008/08/16/153188.aspx" title="INI 編集ツール IniModifier を作成してみる (2) へ"&gt;INI 編集ツール IniModifier を作成してみる (2)&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
まずは、WTL::CRichEditCtrl のヘッダを見てみることにする。&lt;br&gt;
WTL は SDK のラッパであり、MFC とほぼ同機能のメソッドを持っているので迷ったら、MSDN で MFC と SDK のヘルプを見るのが常套手段。
&lt;/p&gt;
&lt;h2&gt;WTL::CRichEditCtrl&lt;/h2&gt;
&lt;div style="font-family:monospace; padding:10px; border:3px double green; margin:10px;"&gt;
&lt;span style="color:green;"&gt;// WTL::CRichEditCtrl (CRichEditCtrlT&amp;lt;ATL::CWindow&amp;gt;) の宣言&lt;/span&gt;
&lt;br&gt;&lt;span style="color:green;"&gt;// Constructors&lt;/span&gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; CRichEditCtrl( &lt;span style="color:magenta;"&gt;HWND&lt;/span&gt; hWnd = &lt;span style="color:magenta;"&gt;NULL&lt;/span&gt; );
&lt;br&gt;&amp;nbsp; &amp;nbsp; CRichEditCtrl&amp;amp; &lt;span style="color:blue;"&gt;operator&lt;/span&gt; =( &lt;span style="color:magenta;"&gt;HWND&lt;/span&gt; hWnd );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;HWND&lt;/span&gt; Create( &lt;span style="color:magenta;"&gt;HWND&lt;/span&gt; hWndParent, ATL::_U_RECT rect = &lt;span style="color:magenta;"&gt;NULL&lt;/span&gt;, &lt;span style="color:magenta;"&gt;LPCTSTR&lt;/span&gt; szWindowName = &lt;span style="color:magenta;"&gt;NULL&lt;/span&gt;,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;DWORD&lt;/span&gt; dwStyle = &lt;span style="color:red;"&gt;0&lt;/span&gt;, &lt;span style="color:magenta;"&gt;DWORD&lt;/span&gt; dwExStyle = &lt;span style="color:red;"&gt;0&lt;/span&gt;,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ATL::_U_MENUorID MenuOrID = &lt;span style="color:red;"&gt;0U&lt;/span&gt;, &lt;span style="color:magenta;"&gt;LPVOID&lt;/span&gt; lpCreateParam = &lt;span style="color:magenta;"&gt;NULL&lt;/span&gt; );
&lt;br&gt;
&lt;br&gt;&lt;span style="color:green;"&gt;// Attributes&lt;/span&gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:magenta;"&gt;LPCTSTR&lt;/span&gt; GetWndClassName();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:magenta;"&gt;LPCTSTR&lt;/span&gt; GetLibraryName();
&lt;br&gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;int&lt;/span&gt; GetLineCount() &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; GetModify() &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;void&lt;/span&gt; SetModify( &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; bModified = &lt;span style="color:magenta;"&gt;TRUE&lt;/span&gt; );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;void&lt;/span&gt; GetRect( &lt;span style="color:magenta;"&gt;LPRECT&lt;/span&gt; lpRect ) &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;DWORD&lt;/span&gt; GetOptions() &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;DWORD&lt;/span&gt; SetOptions( &lt;span style="color:magenta;"&gt;WORD&lt;/span&gt; wOperation, &lt;span style="color:magenta;"&gt;DWORD&lt;/span&gt; dwOptions );
&lt;br&gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:green;"&gt;// NOTE: first word in lpszBuffer must contain the size of the buffer!&lt;/span&gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;int&lt;/span&gt; GetLine( &lt;span style="color:blue;"&gt;int&lt;/span&gt; nIndex, &lt;span style="color:magenta;"&gt;LPTSTR&lt;/span&gt; lpszBuffer ) &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;int&lt;/span&gt; GetLine( &lt;span style="color:blue;"&gt;int&lt;/span&gt; nIndex, &lt;span style="color:magenta;"&gt;LPTSTR&lt;/span&gt; lpszBuffer, &lt;span style="color:blue;"&gt;int&lt;/span&gt; nMaxLength ) &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; CanUndo() &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; CanPaste( &lt;span style="color:magenta;"&gt;UINT&lt;/span&gt; nFormat = &lt;span style="color:red;"&gt;0&lt;/span&gt; ) &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;void&lt;/span&gt; GetSel( &lt;span style="color:magenta;"&gt;LONG&lt;/span&gt;&amp;amp; nStartChar, &lt;span style="color:magenta;"&gt;LONG&lt;/span&gt;&amp;amp; nEndChar ) &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;void&lt;/span&gt; GetSel( CHARRANGE &amp;amp;cr ) &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;int&lt;/span&gt; SetSel( &lt;span style="color:magenta;"&gt;LONG&lt;/span&gt; nStartChar, &lt;span style="color:magenta;"&gt;LONG&lt;/span&gt; nEndChar );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;int&lt;/span&gt; SetSel( CHARRANGE &amp;amp;cr );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;int&lt;/span&gt; SetSelAll();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;int&lt;/span&gt; SetSelNone();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;DWORD&lt;/span&gt; GetDefaultCharFormat( CHARFORMAT&amp;amp; cf ) &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;DWORD&lt;/span&gt; GetSelectionCharFormat( CHARFORMAT&amp;amp; cf ) &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;DWORD&lt;/span&gt; GetEventMask() &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;LONG&lt;/span&gt; GetLimitText() &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;DWORD&lt;/span&gt; GetParaFormat( PARAFORMAT&amp;amp; pf ) &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;
&lt;br&gt;&lt;span style="color:blue;"&gt;#if&lt;/span&gt; ( _RICHEDIT_VER &amp;gt;= &lt;span style="color:red;"&gt;0x0200&lt;/span&gt; )
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;LONG&lt;/span&gt; GetSelText( &lt;span style="color:magenta;"&gt;LPTSTR&lt;/span&gt; lpstrBuff ) &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&lt;span style="color:blue;"&gt;#else&lt;/span&gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:green;"&gt;// RichEdit 1.0 EM_GETSELTEXT is ANSI only&lt;/span&gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;LONG&lt;/span&gt; GetSelText( &lt;span style="color:magenta;"&gt;LPSTR&lt;/span&gt; lpstrBuff ) &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&lt;span style="color:blue;"&gt;#endif&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;&lt;span style="color:blue;"&gt;#ifndef&lt;/span&gt; _ATL_NO_COM
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; GetSelTextBSTR( &lt;span style="color:magenta;"&gt;BSTR&lt;/span&gt;&amp;amp; bstrText ) &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&lt;span style="color:blue;"&gt;#endif&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;&lt;span style="color:blue;"&gt;#if&lt;/span&gt; &lt;span style="color:blue;"&gt;defined&lt;/span&gt;( _WTL_USE_CSTRING ) || &lt;span style="color:blue;"&gt;defined&lt;/span&gt;( __ATLSTR_H__ )
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;LONG&lt;/span&gt; GetSelText( _CSTRING_NS::&lt;span style="color:magenta;"&gt;CString&lt;/span&gt;&amp;amp; strText ) &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&lt;span style="color:blue;"&gt;#endif&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;WORD&lt;/span&gt; GetSelectionType() &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;COLORREF&lt;/span&gt; SetBackgroundColor( &lt;span style="color:magenta;"&gt;COLORREF&lt;/span&gt; cr );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;COLORREF&lt;/span&gt; SetBackgroundColor();&amp;nbsp; &amp;nbsp; &lt;span style="color:green;"&gt;// sets to system background&lt;/span&gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; SetCharFormat( CHARFORMAT&amp;amp; cf, &lt;span style="color:magenta;"&gt;WORD&lt;/span&gt; wFlags );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; SetDefaultCharFormat( CHARFORMAT&amp;amp; cf );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; SetSelectionCharFormat( CHARFORMAT&amp;amp; cf );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; SetWordCharFormat( CHARFORMAT&amp;amp; cf );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;DWORD&lt;/span&gt; SetEventMask( &lt;span style="color:magenta;"&gt;DWORD&lt;/span&gt; dwEventMask );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; SetParaFormat( PARAFORMAT&amp;amp; pf );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; SetTargetDevice( &lt;span style="color:magenta;"&gt;HDC&lt;/span&gt; hDC, &lt;span style="color:blue;"&gt;int&lt;/span&gt; cxLineWidth );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;int&lt;/span&gt; GetTextLength() &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; SetReadOnly( &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; bReadOnly = &lt;span style="color:magenta;"&gt;TRUE&lt;/span&gt; );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;int&lt;/span&gt; GetFirstVisibleLine() &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; EDITWORDBREAKPROCEX GetWordBreakProcEx() &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; EDITWORDBREAKPROCEX SetWordBreakProcEx( EDITWORDBREAKPROCEX pfnEditWordBreakProcEx );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;int&lt;/span&gt; GetTextRange( TEXTRANGE* pTextRange ) &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;
&lt;br&gt;&lt;span style="color:blue;"&gt;#if&lt;/span&gt; ( _RICHEDIT_VER &amp;gt;= &lt;span style="color:red;"&gt;0x0200&lt;/span&gt; )
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;int&lt;/span&gt; GetTextRange( &lt;span style="color:magenta;"&gt;LONG&lt;/span&gt; nStartChar, &lt;span style="color:magenta;"&gt;LONG&lt;/span&gt; nEndChar, &lt;span style="color:magenta;"&gt;LPTSTR&lt;/span&gt; lpstrText ) &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&lt;span style="color:blue;"&gt;#else&lt;/span&gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;int&lt;/span&gt; GetTextRange( &lt;span style="color:magenta;"&gt;LONG&lt;/span&gt; nStartChar, &lt;span style="color:magenta;"&gt;LONG&lt;/span&gt; nEndChar, &lt;span style="color:magenta;"&gt;LPSTR&lt;/span&gt; lpstrText ) &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&lt;span style="color:blue;"&gt;#endif&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;&lt;span style="color:blue;"&gt;#if&lt;/span&gt; ( _RICHEDIT_VER &amp;gt;= &lt;span style="color:red;"&gt;0x0200&lt;/span&gt; )
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;DWORD&lt;/span&gt; GetDefaultCharFormat( CHARFORMAT2&amp;amp; cf ) &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; SetCharFormat( CHARFORMAT2&amp;amp; cf, &lt;span style="color:magenta;"&gt;WORD&lt;/span&gt; wFlags );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; SetDefaultCharFormat( CHARFORMAT2&amp;amp; cf );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;DWORD&lt;/span&gt; GetSelectionCharFormat( CHARFORMAT2&amp;amp; cf ) &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; SetSelectionCharFormat( CHARFORMAT2&amp;amp; cf );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; SetWordCharFormat( CHARFORMAT2&amp;amp; cf );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;DWORD&lt;/span&gt; GetParaFormat( PARAFORMAT2&amp;amp; pf ) &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; SetParaFormat( PARAFORMAT2&amp;amp; pf );
&lt;br&gt;&amp;nbsp; &amp;nbsp; TEXTMODE GetTextMode() &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; SetTextMode( TEXTMODE enumTextMode );
&lt;br&gt;&amp;nbsp; &amp;nbsp; UNDONAMEID GetUndoName() &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; UNDONAMEID GetRedoName() &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; CanRedo() &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; GetAutoURLDetect() &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; SetAutoURLDetect( &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; bAutoDetect = &lt;span style="color:magenta;"&gt;TRUE&lt;/span&gt; );
&lt;br&gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:green;"&gt;// this method is deprecated, please use SetAutoURLDetect&lt;/span&gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; EnableAutoURLDetect( &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; bEnable = &lt;span style="color:magenta;"&gt;TRUE&lt;/span&gt; );
&lt;br&gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;UINT&lt;/span&gt; SetUndoLimit( &lt;span style="color:magenta;"&gt;UINT&lt;/span&gt; uUndoLimit );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;void&lt;/span&gt; SetPalette( &lt;span style="color:magenta;"&gt;HPALETTE&lt;/span&gt; hPalette );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;int&lt;/span&gt; GetTextEx( GETTEXTEX* pGetTextEx, &lt;span style="color:magenta;"&gt;LPTSTR&lt;/span&gt; lpstrText ) &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;int&lt;/span&gt; GetTextEx( &lt;span style="color:magenta;"&gt;LPTSTR&lt;/span&gt; lpstrText, &lt;span style="color:blue;"&gt;int&lt;/span&gt; nTextLen, &lt;span style="color:magenta;"&gt;DWORD&lt;/span&gt; dwFlags = GT_DEFAULT, &lt;span style="color:magenta;"&gt;UINT&lt;/span&gt; uCodePage = CP_ACP, &lt;span style="color:magenta;"&gt;LPCSTR&lt;/span&gt; lpDefaultChar = &lt;span style="color:magenta;"&gt;NULL&lt;/span&gt;, &lt;span style="color:magenta;"&gt;LPBOOL&lt;/span&gt; lpUsedDefChar = &lt;span style="color:magenta;"&gt;NULL&lt;/span&gt; ) &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;int&lt;/span&gt; GetTextLengthEx( GETTEXTLENGTHEX* pGetTextLengthEx ) &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;int&lt;/span&gt; GetTextLengthEx( &lt;span style="color:magenta;"&gt;DWORD&lt;/span&gt; dwFlags = GTL_DEFAULT, &lt;span style="color:magenta;"&gt;UINT&lt;/span&gt; uCodePage = CP_ACP ) &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&lt;span style="color:blue;"&gt;#endif&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;&lt;span style="color:blue;"&gt;#if&lt;/span&gt; ( _RICHEDIT_VER &amp;gt;= &lt;span style="color:red;"&gt;0x0300&lt;/span&gt; )
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;int&lt;/span&gt; SetTextEx( SETTEXTEX* pSetTextEx, &lt;span style="color:magenta;"&gt;LPCTSTR&lt;/span&gt; lpstrText );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;int&lt;/span&gt; SetTextEx( &lt;span style="color:magenta;"&gt;LPCTSTR&lt;/span&gt; lpstrText, &lt;span style="color:magenta;"&gt;DWORD&lt;/span&gt; dwFlags = ST_DEFAULT, &lt;span style="color:magenta;"&gt;UINT&lt;/span&gt; uCodePage = CP_ACP );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;int&lt;/span&gt; GetEditStyle() &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;int&lt;/span&gt; SetEditStyle( &lt;span style="color:blue;"&gt;int&lt;/span&gt; nStyle, &lt;span style="color:blue;"&gt;int&lt;/span&gt; nMask = &lt;span style="color:red;"&gt;-1&lt;/span&gt; );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; SetFontSize( &lt;span style="color:blue;"&gt;int&lt;/span&gt; nFontSizeDelta );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;void&lt;/span&gt; GetScrollPos( &lt;span style="color:magenta;"&gt;LPPOINT&lt;/span&gt; lpPoint ) &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;void&lt;/span&gt; SetScrollPos( &lt;span style="color:magenta;"&gt;LPPOINT&lt;/span&gt; lpPoint );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; GetZoom( &lt;span style="color:blue;"&gt;int&lt;/span&gt;&amp;amp; nNum, &lt;span style="color:blue;"&gt;int&lt;/span&gt;&amp;amp; nDen ) &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; SetZoom( &lt;span style="color:blue;"&gt;int&lt;/span&gt; nNum, &lt;span style="color:blue;"&gt;int&lt;/span&gt; nDen );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; SetZoomOff();
&lt;br&gt;&lt;span style="color:blue;"&gt;#endif&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;&lt;span style="color:green;"&gt;// Operations&lt;/span&gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;void&lt;/span&gt; LimitText( &lt;span style="color:magenta;"&gt;LONG&lt;/span&gt; nChars = &lt;span style="color:red;"&gt;0&lt;/span&gt; );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;int&lt;/span&gt; LineFromChar( &lt;span style="color:magenta;"&gt;LONG&lt;/span&gt; nIndex ) &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;&lt;span style="color:magenta;"&gt;POINT&lt;/span&gt;&lt;/span&gt; PosFromChar( &lt;span style="color:magenta;"&gt;LONG&lt;/span&gt; nChar ) &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;int&lt;/span&gt; CharFromPos( &lt;span style="color:magenta;"&gt;POINT&lt;/span&gt; pt ) &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;void&lt;/span&gt; EmptyUndoBuffer();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;int&lt;/span&gt; LineIndex( &lt;span style="color:blue;"&gt;int&lt;/span&gt; nLine = &lt;span style="color:red;"&gt;-1&lt;/span&gt; ) &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;int&lt;/span&gt; LineLength( &lt;span style="color:blue;"&gt;int&lt;/span&gt; nLine = &lt;span style="color:red;"&gt;-1&lt;/span&gt; ) &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; LineScroll( &lt;span style="color:blue;"&gt;int&lt;/span&gt; nLines, &lt;span style="color:blue;"&gt;int&lt;/span&gt; nChars = &lt;span style="color:red;"&gt;0&lt;/span&gt; );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;void&lt;/span&gt; ReplaceSel( &lt;span style="color:magenta;"&gt;LPCTSTR&lt;/span&gt; lpszNewText, &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; bCanUndo = &lt;span style="color:magenta;"&gt;FALSE&lt;/span&gt; );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;void&lt;/span&gt; SetRect( &lt;span style="color:magenta;"&gt;LPCRECT&lt;/span&gt; lpRect );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; DisplayBand( &lt;span style="color:magenta;"&gt;LPRECT&lt;/span&gt; pDisplayRect );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;LONG&lt;/span&gt; FindText( &lt;span style="color:magenta;"&gt;DWORD&lt;/span&gt; dwFlags, FINDTEXT&amp;amp; ft ) &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;LONG&lt;/span&gt; FindText( &lt;span style="color:magenta;"&gt;DWORD&lt;/span&gt; dwFlags, FINDTEXTEX&amp;amp; ft ) &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;LONG&lt;/span&gt; FormatRange( FORMATRANGE&amp;amp; fr, &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; bDisplay = &lt;span style="color:magenta;"&gt;TRUE&lt;/span&gt; );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;LONG&lt;/span&gt; FormatRange( FORMATRANGE* pFormatRange, &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; bDisplay = &lt;span style="color:magenta;"&gt;TRUE&lt;/span&gt; );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;void&lt;/span&gt; HideSelection( &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; bHide = &lt;span style="color:magenta;"&gt;TRUE&lt;/span&gt;, &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; bChangeStyle = &lt;span style="color:magenta;"&gt;FALSE&lt;/span&gt; );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;void&lt;/span&gt; PasteSpecial( &lt;span style="color:magenta;"&gt;UINT&lt;/span&gt; uClipFormat, &lt;span style="color:magenta;"&gt;DWORD&lt;/span&gt; dwAspect = &lt;span style="color:red;"&gt;0&lt;/span&gt;, HMETAFILE hMF = &lt;span style="color:red;"&gt;0&lt;/span&gt; );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;void&lt;/span&gt; RequestResize();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;LONG&lt;/span&gt; StreamIn( &lt;span style="color:magenta;"&gt;UINT&lt;/span&gt; uFormat, EDITSTREAM&amp;amp; es );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;LONG&lt;/span&gt; StreamOut( &lt;span style="color:magenta;"&gt;UINT&lt;/span&gt; uFormat, EDITSTREAM&amp;amp; es );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;DWORD&lt;/span&gt; FindWordBreak( &lt;span style="color:blue;"&gt;int&lt;/span&gt; nCode, &lt;span style="color:magenta;"&gt;LONG&lt;/span&gt; nStartChar );
&lt;br&gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:green;"&gt;// Additional operations&lt;/span&gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;void&lt;/span&gt; ScrollCaret();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;int&lt;/span&gt; InsertText( &lt;span style="color:blue;"&gt;long&lt;/span&gt; nInsertAfterChar, &lt;span style="color:magenta;"&gt;LPCTSTR&lt;/span&gt; lpstrText, &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; bCanUndo = &lt;span style="color:magenta;"&gt;FALSE&lt;/span&gt; );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;int&lt;/span&gt; AppendText( &lt;span style="color:magenta;"&gt;LPCTSTR&lt;/span&gt; lpstrText, &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; bCanUndo = &lt;span style="color:magenta;"&gt;FALSE&lt;/span&gt; );
&lt;br&gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:green;"&gt;// Clipboard operations&lt;/span&gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; Undo();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;void&lt;/span&gt; Clear();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;void&lt;/span&gt; Copy();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;void&lt;/span&gt; Cut();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;void&lt;/span&gt; Paste();
&lt;br&gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:green;"&gt;// OLE support&lt;/span&gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; IRichEditOle* GetOleInterface() &lt;span style="color:blue;"&gt;const&lt;/span&gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; SetOleCallback( IRichEditOleCallback* pCallback );
&lt;br&gt;
&lt;br&gt;&lt;span style="color:blue;"&gt;#if&lt;/span&gt; ( _RICHEDIT_VER &amp;gt;= &lt;span style="color:red;"&gt;0x0200&lt;/span&gt; )
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; Redo();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;void&lt;/span&gt; StopGroupTyping();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;void&lt;/span&gt; ShowScrollBar( &lt;span style="color:blue;"&gt;int&lt;/span&gt; nBarType, &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; bVisible = &lt;span style="color:magenta;"&gt;TRUE&lt;/span&gt; );
&lt;br&gt;&lt;span style="color:blue;"&gt;#endif&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;&lt;span style="color:blue;"&gt;#if&lt;/span&gt; ( _RICHEDIT_VER &amp;gt;= &lt;span style="color:red;"&gt;0x0300&lt;/span&gt; )
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; SetTabStops( &lt;span style="color:blue;"&gt;int&lt;/span&gt; nTabStops, &lt;span style="color:magenta;"&gt;LPINT&lt;/span&gt; rgTabStops );
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; SetTabStops();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;BOOL&lt;/span&gt; SetTabStops( &lt;span style="color:blue;"&gt;const&lt;/span&gt; &lt;span style="color:blue;"&gt;int&lt;/span&gt;&amp;amp; cxEachStop );&amp;nbsp; &amp;nbsp; &lt;span style="color:green;"&gt;// takes an 'int'&lt;/span&gt;
&lt;br&gt;&lt;span style="color:blue;"&gt;#endif&lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;
これで大体何ができるか分かった。
あとは、実際に使用しそうで使ったことがないメソッドについて詳しくみていくことにする。
&lt;/p&gt;
&lt;h2&gt;GetLibraryName&lt;/h2&gt;
&lt;p&gt;リッチエディットコントロールを使用するには、最初にリッチエディットコントロールの DLL をロードしておかなければいけないらしい。
&lt;br&gt;リッチエディットコントロールの DLL 名はバージョンによって異なるので（Ver1.0 は RICHED32.DLL で、Ver2.0 以降は RICHED20.DLL）、このメソッドを使うことでその違いを CRichEditCtrl がプリプロセス時点で解決してくれる。
&lt;/p&gt;
&lt;div style="font-family:monospace; padding:10px; border:3px double green; margin:10px;"&gt;
&lt;span style="color:green;"&gt;// IniModifier.cpp&lt;/span&gt;
&lt;br&gt;&lt;span style="color:blue;"&gt;int&lt;/span&gt; &lt;span style="color:magenta;"&gt;WINAPI&lt;/span&gt; _tWinMain( &lt;span style="color:magenta;"&gt;HINSTANCE&lt;/span&gt;, &lt;span style="color:magenta;"&gt;HINSTANCE&lt;/span&gt;, &lt;span style="color:magenta;"&gt;LPTSTR&lt;/span&gt;, &lt;span style="color:blue;"&gt;int&lt;/span&gt; )
&lt;br&gt;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:magenta;"&gt;HMODULE&lt;/span&gt; hRich = ::LoadLibrary( CRichEditCtrl::GetLibraryName() );
&lt;br&gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:green;"&gt;// snip&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; ::FreeLibrary( hRich );
&lt;br&gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:blue;"&gt;return&lt;/span&gt; nRet;
&lt;br&gt;}
&lt;/div&gt;
&lt;h2&gt;SetSelectionCharFormat&lt;/h2&gt;
&lt;p&gt;現在の選択のテキストの文字書式属性を設定する。
&lt;br&gt;なお、選択範囲がない場合は、以降の入力についての設定となる。
&lt;/p&gt;
&lt;div style="font-family:monospace; padding:10px; border:3px double green; margin:10px;"&gt;
&lt;span style="color:green;"&gt;// CRichEditCtrl m_rich;&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;&lt;span style="color:green;"&gt;// テキストを青色太字にして保護にする&lt;/span&gt;
&lt;br&gt;CHARFORMAT cf;
&lt;br&gt;cf.dwMask = CFM_PROTECTED | CFM_COLOR | CFM_BOLD;
&lt;br&gt;cf.dwEffects = CFE_PROTECTED | CFE_BOLD;
&lt;br&gt;cf.crTextColor = &lt;span style="color:magenta;"&gt;RGB&lt;/span&gt;( &lt;span style="color:red;"&gt;0&lt;/span&gt;, &lt;span style="color:red;"&gt;0&lt;/span&gt;, &lt;span style="color:red;"&gt;255&lt;/span&gt; );
&lt;br&gt;m_rich.SetSelectionCharFormat( cf );
&lt;/div&gt;
&lt;h2&gt;SetEventMask&lt;/h2&gt;
&lt;p&gt;親ウィンドウに送る通知メッセージを指定する。&lt;/p&gt;
&lt;dl style="line-height:130%;"&gt;
&lt;dt&gt;ENM_PROTECTED
 &lt;dd&gt;保護領域を編集しようとした時に WM_NOTIFY メッセージで EN_PROTECTED が通知されるようにする。
 &lt;br&gt;0 を返すと変更許可、非0 を返すと変更禁止とする。
 &lt;br&gt;&lt;code&gt;ENPROTECTED* pProtected = &lt;span style="color:blue;"&gt;reinterpret_cast&lt;/span&gt;&amp;lt; ENPROTECTED* &amp;gt;( &lt;span style="color:blue;"&gt;reinterpret_cast&lt;/span&gt;&amp;lt; LPNMHDR &amp;gt;( lParam ) );&lt;/code&gt; としたとき、
 &lt;br&gt;&lt;code&gt;pProtected-&amp;gt;msg&lt;/code&gt; に、この通知発生原因のメッセージ ID が入っている。
 &lt;br&gt;&lt;code&gt;pProtected-&amp;gt;chrg.cpMin&lt;/code&gt; と &lt;code&gt;pProtected-&amp;gt;chrg.cpMax&lt;/code&gt; に、この通知発生元のインデックス（リッチエディットコントロール先頭位置からのオフセット）が入っている。
&lt;dt&gt;ENM_KEYEVENTS
 &lt;dd&gt;キーボードイベントが発生した時に WM_NOTIFY メッセージで EN_MSGFILTER が通知されるようにする。
 &lt;br&gt;0 を返すと通常のイベントを処理する。非0 を返すと以降のイベント処理を無視する。
 &lt;br&gt;&lt;code&gt;MSGFILTER* pFilter = &lt;span style="color:blue;"&gt;reinterpret_cast&lt;/span&gt;&amp;lt; MSGFILTER* &amp;gt;( &lt;span style="color:blue;"&gt;reinterpret_cast&lt;/span&gt;&amp;lt; LPNMHDR &amp;gt;( lParam ) );&lt;/code&gt; としたとき、
 &lt;br&gt;&lt;code&gt;pFilter-&amp;gt;msg&lt;/code&gt; に、この通知発生原因のメッセージ ID が入っている。
&lt;dt&gt;ENM_MOUSEEVENTS
 &lt;dd&gt;マウスイベントが発生した時に WM_NOTIFY メッセージで EN_MSGFILTER が通知されるようにする。
 &lt;br&gt;EN_MSGFILTER の動作については、ENM_KEYEVENTS と同じ。
&lt;/dl&gt;
&lt;div style="font-family:monospace; padding:10px; border:3px double green; margin:10px;"&gt;
m_rich.SetEventMask( ENM_PROTECTED | ENM_KEYEVENTS | ENM_MOUSEEVENTS );
&lt;/div&gt;&lt;img src ="http://blogs.wankuma.com/rapt/aggbug/153287.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>RAPT</dc:creator><title>INI 編集ツール IniModifier を作成してみる (2)</title><link>http://blogs.wankuma.com/rapt/archive/2008/08/16/153188.aspx</link><pubDate>Sat, 16 Aug 2008 01:23:00 GMT</pubDate><guid>http://blogs.wankuma.com/rapt/archive/2008/08/16/153188.aspx</guid><wfw:comment>http://blogs.wankuma.com/rapt/comments/153188.aspx</wfw:comment><comments>http://blogs.wankuma.com/rapt/archive/2008/08/16/153188.aspx#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://blogs.wankuma.com/rapt/comments/commentRss/153188.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/rapt/services/trackbacks/153188.aspx</trackback:ping><description>&lt;h1&gt;INI 編集ツール IniModifier を作成してみる (2)&lt;/h1&gt;
&lt;p&gt;過去の記事へのリンク：
&lt;br&gt;&lt;A href="http://blogs.wankuma.com/rapt/archive/2008/08/16/153180.aspx" title="INI 編集ツール IniModifier を作成してみる (1) へ"&gt;INI 編集ツール IniModifier を作成してみる (1)&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
リソース配置が楽なのでダイアログベースで作ることにする。&lt;br&gt;
とりあえずリソースエディタで適当にコントロールを配置して、UI を決める。&lt;br&gt;
ダイアログの自動リサイズを実装するため、CDialogResize も継承しておく。&lt;br&gt;
&lt;/p&gt;
&lt;div style="font-family:monospace; padding:10px; border:3px double green; margin:10px;"&gt;
&lt;span style="color:blue;"&gt;class&lt;/span&gt; CMainDlg&lt;br&gt;
&amp;nbsp; &amp;nbsp; : &lt;span style="color:blue;"&gt;public&lt;/span&gt; CDialogImpl&amp;lt; CMainDlg &amp;gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; , &lt;span style="color:blue;"&gt;public&lt;/span&gt; CDialogResize&amp;lt; CMainDlg &amp;gt;&lt;br&gt;
{&lt;br&gt;
&lt;/div&gt;
&lt;p&gt;
テキストを編集したり色をつけたりしたいので、リッチエディットコントロールを使ってみようと思う。リッチエディットコントロールを使うのはこれが初めてだが、WTL のヘッダを見ていると結構いろいろできそうなので、せっかくなので調べながら作っていくことにする。&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;リソースエディタのイメージはこんな感じ↓&lt;/p&gt;
&lt;img src="http://rapt.wankuma.com/IniModifier_image01.png" width="545px" height="363px" alt="リソースエディタのイメージ" /&gt;&lt;br&gt;
&lt;p&gt;
リッチエディットコントロールは 2.0 を使うこととする。&lt;br&gt;
CDialogResize は atlframe.h&lt;br&gt;
CRichEditCtrl は atlctrls.h&lt;br&gt;
にそれぞれ定義されているので、stdafx.h は下記のようになった。
&lt;/p&gt;
&lt;div style="font-family:monospace; padding:10px; border:3px double green; margin:10px;"&gt;
&lt;span style="color:green;"&gt;// stdafx.h&lt;/span&gt;
&lt;br&gt;&lt;span style="color:green;"&gt;// Change these values to use different versions&lt;/span&gt;
&lt;br&gt;&lt;span style="color:blue;"&gt;#define&lt;/span&gt; WINVER&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:red;"&gt;0x0500&lt;/span&gt;
&lt;br&gt;&lt;span style="color:blue;"&gt;#define&lt;/span&gt; _WIN32_WINNT&amp;nbsp; &amp;nbsp; &lt;span style="color:red;"&gt;0x0501&lt;/span&gt;
&lt;br&gt;&lt;span style="color:blue;"&gt;#define&lt;/span&gt; _WIN32_IE&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style="color:red;"&gt;0x0501&lt;/span&gt;
&lt;br&gt;&lt;span style="color:blue;"&gt;#define&lt;/span&gt; _RICHEDIT_VER&amp;nbsp; &amp;nbsp;&lt;span style="color:red;"&gt;0x0200&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;&lt;span style="color:green;"&gt;// WTL よりも ATL を優先する場合は、atlapp.h より前に include すること&lt;/span&gt;
&lt;br&gt;&lt;span style="color:blue;"&gt;#include&lt;/span&gt; &lt;span style="color:red;"&gt;&amp;lt;atlstr.h&amp;gt;&lt;/span&gt;
&lt;br&gt;&lt;span style="color:blue;"&gt;#include&lt;/span&gt; &lt;span style="color:red;"&gt;&amp;lt;atltypes.h&amp;gt;&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;&lt;span style="color:blue;"&gt;#include&lt;/span&gt; &lt;span style="color:red;"&gt;&amp;lt;atlbase.h&amp;gt;&lt;/span&gt;
&lt;br&gt;&lt;span style="color:blue;"&gt;#include&lt;/span&gt; &lt;span style="color:red;"&gt;&amp;lt;atlapp.h&amp;gt;&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;&lt;span style="color:blue;"&gt;extern&lt;/span&gt; CAppModule _Module;
&lt;br&gt;
&lt;br&gt;&lt;span style="color:blue;"&gt;#include&lt;/span&gt; &lt;span style="color:red;"&gt;&amp;lt;atlcrack.h&amp;gt;&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;&lt;span style="color:blue;"&gt;#include&lt;/span&gt; &lt;span style="color:red;"&gt;&amp;lt;atlframe.h&amp;gt;&lt;/span&gt;&amp;nbsp; &lt;span style="color:green;"&gt;// CDialogResize&lt;/span&gt;
&lt;br&gt;&lt;span style="color:blue;"&gt;#include&lt;/span&gt; &lt;span style="color:red;"&gt;&amp;lt;atlctrls.h&amp;gt;&lt;/span&gt;&amp;nbsp; &lt;span style="color:green;"&gt;// CRichEditCtrl&lt;/span&gt;
&lt;br&gt;&lt;span style="color:blue;"&gt;#include&lt;/span&gt; &lt;span style="color:red;"&gt;&amp;lt;atldlgs.h&amp;gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp;&lt;span style="color:green;"&gt;// CFileDialog&lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;処理の関係上、文字セットは UNICODE ではなく、マルチバイト文字セット(MBCS) でビルドすることにする。&lt;/p&gt;
&lt;div style="font-family:monospace; padding:10px; border:3px double green; margin:10px;"&gt;
&lt;span style="color:green;"&gt;// stdafx.cpp&lt;/span&gt;
&lt;br&gt;&lt;span style="color:blue;"&gt;#if defined&lt;/span&gt;( _UNICODE ) || &lt;span style="color:blue;"&gt;defined&lt;/span&gt;( UNICODE )
&lt;br&gt;&lt;span style="color:blue;"&gt;#error&lt;/span&gt; This program doesn't assume unicode build.
&lt;br&gt;&lt;span style="color:blue;"&gt;#endif&lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;
# ところで、なぜ &lt;code style="font-size:100%;"&gt;#error&lt;/code&gt; ディレクティブではマルチバイト文字が使えないんだろ。&lt;br&gt;
# ダブルクォーテーションで括ってやってもだめ。L&amp;quot;&amp;quot; としてもだめ。何かうまくいくようにしてくれるといいんだけど。
&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/rapt/aggbug/153188.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>RAPT</dc:creator><title>INI 編集ツール IniModifier を作成してみる (1)</title><link>http://blogs.wankuma.com/rapt/archive/2008/08/16/153180.aspx</link><pubDate>Sat, 16 Aug 2008 00:18:00 GMT</pubDate><guid>http://blogs.wankuma.com/rapt/archive/2008/08/16/153180.aspx</guid><wfw:comment>http://blogs.wankuma.com/rapt/comments/153180.aspx</wfw:comment><comments>http://blogs.wankuma.com/rapt/archive/2008/08/16/153180.aspx#Feedback</comments><slash:comments>209</slash:comments><wfw:commentRss>http://blogs.wankuma.com/rapt/comments/commentRss/153180.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/rapt/services/trackbacks/153180.aspx</trackback:ping><description>&lt;h1&gt;IniModifier&lt;/h1&gt;
&lt;p&gt;&lt;a href="http://www.jrsoftware.org/isinfo.php" title="Inno Setup へ"&gt;Inno Setup&lt;/a&gt; のフロントエンドである ISTool の&lt;a href="http://rapt21.com/innosetup.php" title="ISTool の日本語言語ファイル配布ページへ"&gt;日本語言語ファイル&lt;/a&gt;作成をしたりしているが、INI 形式のファイルをアップデートが非常にめんどくさすぎるので何かツールを作成しようと思う。&lt;/p&gt;
&lt;p&gt;開発環境は以下の通り。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Windows XP sp2
&lt;li&gt;Visual C++ .NET 2003 sp1
&lt;li&gt;WTL 8.0
&lt;/ul&gt;
&lt;p&gt;要件仕様は下記の通りとする。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ファイルのエンコーディングは SJIS/UTF-8 に対応。（できれば EUC も対応。）
&lt;li&gt;セクション名・キー名で差分チェックを行う。
&lt;li&gt;Visual SourceSafe の比較画面のように見比べつつ編集もできるようにする。
&lt;li&gt;セクション：&lt;b style="color:black;"&gt;[太字表示]&lt;/b&gt;
&lt;li&gt;コメント：&lt;b style="color:green;"&gt;緑色表示&lt;/b&gt;
&lt;li&gt;追加されたセクション・キー：&lt;b style="color:blue;"&gt;青色表示&lt;/b&gt;
&lt;li&gt;削除されたセクション・キー：&lt;b style="color:red;"&gt;赤色表示&lt;/b&gt;
&lt;li&gt;削除されたキー：キーの先頭に &lt;code style="font-size:100%;"&gt;&amp;quot;&lt;span style="color:red; font-weight:bold;"&gt;;&amp;lt;DEL&amp;gt;:&lt;/span&gt;&amp;quot;&lt;/code&gt; を追加。
&lt;/ul&gt;
&lt;p&gt;IniModifier の完成イメージはこんな感じ↓&lt;/p&gt;
&lt;img src="http://rapt.wankuma.com/IniModifier_image00.png" width="545px" height="363px" alt="IniModifier の完成イメージ" /&gt;&lt;img src ="http://blogs.wankuma.com/rapt/aggbug/153180.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>RAPT</dc:creator><title>localtime の罠</title><link>http://blogs.wankuma.com/rapt/archive/2007/01/28/59391.aspx</link><pubDate>Sun, 28 Jan 2007 03:27:00 GMT</pubDate><guid>http://blogs.wankuma.com/rapt/archive/2007/01/28/59391.aspx</guid><wfw:comment>http://blogs.wankuma.com/rapt/comments/59391.aspx</wfw:comment><comments>http://blogs.wankuma.com/rapt/archive/2007/01/28/59391.aspx#Feedback</comments><slash:comments>435</slash:comments><wfw:commentRss>http://blogs.wankuma.com/rapt/comments/commentRss/59391.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/rapt/services/trackbacks/59391.aspx</trackback:ping><description>&lt;p&gt;Cランタイムの標準関数 localtime() について。&lt;br&gt;
これは時刻をタイムゾーンに合わせて現地時刻に変換したもの取得するものだが、&lt;font color='#ff00ff'&gt;NULL&lt;/font&gt; を返すことがある。&lt;br&gt;
これを忘れてエラーチェックを忘れるとランタイムエラーでプログラムが強制終了してしまう。&lt;br&gt;&lt;/p&gt;
&lt;p&gt;日時を取得する別の手段として、Windows API で処理することができる。&lt;br&gt;
こちらは、localtime() 関数と違って、年数や月数の調整が不要で変数名も分かりやすいのでオススメなのだ。&lt;br&gt;&lt;/p&gt;
&lt;DIV style="BORDER-RIGHT: blue 1px solid; PADDING-RIGHT: 1em; BORDER-TOP: blue 1px solid; PADDING-LEFT: 1em; PADDING-BOTTOM: 0.5em; BORDER-LEFT: blue 1px solid; PADDING-TOP: 0.5em; BORDER-BOTTOM: blue 1px solid; BACKGROUND-COLOR: white"&gt;
&lt;p&gt;&lt;code&gt;&lt;font color='#0000ff'&gt;void&lt;/font&gt; test1()&lt;br&gt;
{&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;font color='#ff00ff'&gt;TCHAR&lt;/font&gt; szNow[ &lt;font color='#ff0000'&gt;100&lt;/font&gt; ] = { &lt;font color='#ff0000'&gt;0&lt;/font&gt; };&lt;br&gt;
&amp;nbsp; &amp;nbsp; time_t long_time;&lt;br&gt;
&amp;nbsp; &amp;nbsp; time( &amp;amp;long_time );&lt;br&gt;
&amp;nbsp; &amp;nbsp; tm* t = localtime( &amp;amp;long_time );&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;font color='#0000ff'&gt;if&lt;/font&gt; ( t != &lt;font color='#ff00ff'&gt;NULL&lt;/font&gt; ) {&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;font color="#008000"&gt;// Cランタイムを使用&lt;/font&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; wsprintf( szNow, &lt;font color='#ff00ff'&gt;_T&lt;/font&gt;( &lt;font color='#ff0000'&gt;&amp;quot;%04d/%02d/%02d %02d:%02d:%02d&amp;quot;&lt;/font&gt; )&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; , &lt;font color='#ff0000'&gt;1900&lt;/font&gt; + t-&amp;gt;tm_year&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; , &lt;font color='#ff0000'&gt;1&lt;/font&gt; + t-&amp;gt;tm_mon&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; , t-&amp;gt;tm_mday&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; , t-&amp;gt;tm_hour&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; , t-&amp;gt;tm_min&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; , t-&amp;gt;tm_sec );&lt;br&gt;
&amp;nbsp; &amp;nbsp; }&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;font color='#0000ff'&gt;else&lt;/font&gt; {&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;font color="#008000"&gt;// Windows API を使用&lt;/font&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SYSTEMTIME st;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ::GetLocalTime( &amp;amp;st );&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; wsprintf( szNow, &lt;font color='#ff00ff'&gt;_T&lt;/font&gt;( &lt;font color='#ff0000'&gt;&amp;quot;%04d/%02d/%02d %02d:%02d:%02d&amp;quot;&lt;/font&gt; )&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; , st.wYear&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; , st.wMonth&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; , st.wDay&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; , st.wHour&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; , st.wMinute&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; , st.wSecond );&lt;br&gt;
&amp;nbsp; &amp;nbsp; }&lt;br&gt;
&amp;nbsp; &amp;nbsp; ::MessageBox( &lt;font color='#ff00ff'&gt;NULL&lt;/font&gt;, szNow, &lt;font color='#ff00ff'&gt;_T&lt;/font&gt;( &lt;font color='#ff0000'&gt;&amp;quot;現在時刻&amp;quot;&lt;/font&gt; ), MB_OK );&lt;br&gt;
}&lt;br&gt;&lt;/code&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;ところで、例えば１週間前の日時を取得したいときはどうするのだろうか。&lt;br&gt;
今の日時が &lt;font color='#ff0000'&gt;8&lt;/font&gt; 日以降なら問題ない。-&lt;font color='#ff0000'&gt;7&lt;/font&gt; すればいいだけなのだから。&lt;br&gt;
しかしながらこの方法はそのまま採用できない。&lt;br&gt;
実際には、&lt;font color='#ff0000'&gt;1&lt;/font&gt;～&lt;font color='#ff0000'&gt;7&lt;/font&gt; 日の場合も検討に入れねばならず、月の計算やうるう年など複雑な計算を要することもあるからである。&lt;br&gt;&lt;/p&gt;
&lt;p&gt;さて、Cランタイムを使って処理する場合、tm 構造体の中身を編集して、mktime() 関数を呼び出すと&lt;br&gt;
その値を再構成してくれる。その値が &lt;font color='#ff0000'&gt;0&lt;/font&gt; 以下であっても適切に変換してくれるので便利だ。&lt;br&gt;&lt;/p&gt;
&lt;p&gt;ところが、これを Windows API だと、うまい方法が見当たらない。&lt;br&gt;
今の所、一度 FILETIME に変換して &lt;font color='#ff0000'&gt;100&lt;/font&gt; ナノ秒単位で加減して、SYSTEMTIME に再変換する&lt;br&gt;
といった手順で計算しているけど、もっと良い方法はないのだろうか。&lt;br&gt;&lt;/p&gt;
&lt;DIV style="BORDER-RIGHT: blue 1px solid; PADDING-RIGHT: 1em; BORDER-TOP: blue 1px solid; PADDING-LEFT: 1em; PADDING-BOTTOM: 0.5em; BORDER-LEFT: blue 1px solid; PADDING-TOP: 0.5em; BORDER-BOTTOM: blue 1px solid; BACKGROUND-COLOR: white"&gt;
&lt;p&gt;&lt;code&gt;&lt;font color='#0000ff'&gt;void&lt;/font&gt; test2()&lt;br&gt;
{&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;font color='#ff00ff'&gt;TCHAR&lt;/font&gt; szNow[ &lt;font color='#ff0000'&gt;100&lt;/font&gt; ] = { &lt;font color='#ff0000'&gt;0&lt;/font&gt; };&lt;br&gt;
&amp;nbsp; &amp;nbsp; time_t long_time;&lt;br&gt;
&amp;nbsp; &amp;nbsp; time( &amp;amp;long_time );&lt;br&gt;
&amp;nbsp; &amp;nbsp; tm* t = localtime( &amp;amp;long_time );&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;font color='#0000ff'&gt;if&lt;/font&gt; ( t != &lt;font color='#ff00ff'&gt;NULL&lt;/font&gt; ) {&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;font color="#008000"&gt;// Cランタイムを使用&lt;/font&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; t-&amp;gt;tm_mday -= &lt;font color='#ff0000'&gt;7&lt;/font&gt;;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; long_time = mktime( t );&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; t = localtime( &amp;amp;long_time );&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;font color='#0000ff'&gt;if&lt;/font&gt; ( t != &lt;font color='#ff00ff'&gt;NULL&lt;/font&gt; ) {&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; wsprintf( szNow, &lt;font color='#ff00ff'&gt;_T&lt;/font&gt;( &lt;font color='#ff0000'&gt;&amp;quot;%04d/%02d/%02d %02d:%02d:%02d&amp;quot;&lt;/font&gt; )&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; , &lt;font color='#ff0000'&gt;1900&lt;/font&gt; + t-&amp;gt;tm_year&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; , &lt;font color='#ff0000'&gt;1&lt;/font&gt; + t-&amp;gt;tm_mon&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; , t-&amp;gt;tm_mday&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; , t-&amp;gt;tm_hour&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; , t-&amp;gt;tm_min&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; , t-&amp;gt;tm_sec );&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br&gt;
&amp;nbsp; &amp;nbsp; }&lt;br&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;font color='#0000ff'&gt;if&lt;/font&gt; ( t == &lt;font color='#ff00ff'&gt;NULL&lt;/font&gt; ) {&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;font color="#008000"&gt;// Windows API を使用&lt;/font&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SYSTEMTIME st;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ::GetLocalTime( &amp;amp;st );&lt;br&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; FILETIME ft;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;font color='#ff00ff'&gt;ATLVERIFY&lt;/font&gt;( ::SystemTimeToFileTime( &amp;amp;st, &amp;amp;ft ) );&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;font color='#0000ff'&gt;__int64&lt;/font&gt; nTime = &lt;font color='#0000ff'&gt;__int64&lt;/font&gt;( ft.dwHighDateTime ) &amp;lt;&amp;lt; &lt;font color='#ff0000'&gt;32&lt;/font&gt; | ft.dwLowDateTime;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; nTime -= &lt;font color='#ff0000'&gt;10000000ULL&lt;/font&gt; &lt;font color='#008000'&gt;/*100ns*/&lt;/font&gt; * &lt;font color='#ff0000'&gt;60&lt;/font&gt; &lt;font color='#008000'&gt;/*sec*/&lt;/font&gt; * &lt;font color='#ff0000'&gt;60&lt;/font&gt; &lt;font color='#008000'&gt;/*min*/&lt;/font&gt; * &lt;font color='#ff0000'&gt;24&lt;/font&gt; &lt;font color='#008000'&gt;/*hour*/&lt;/font&gt; * &lt;font color='#ff0000'&gt;7&lt;/font&gt; &lt;font color='#008000'&gt;/*day*/&lt;/font&gt;;&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ft.dwHighDateTime = &lt;font color='#ff00ff'&gt;DWORD&lt;/font&gt;( nTime &amp;gt;&amp;gt; &lt;font color='#ff0000'&gt;32&lt;/font&gt; );&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ft.dwLowDateTime = &lt;font color='#ff00ff'&gt;DWORD&lt;/font&gt;( nTime &amp;amp; &lt;font color='#ff0000'&gt;0xFFFFFFFF&lt;/font&gt; );&lt;br&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;font color='#ff00ff'&gt;ATLVERIFY&lt;/font&gt;( ::FileTimeToSystemTime( &amp;amp;ft, &amp;amp;st ) );&lt;br&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; wsprintf( szNow, &lt;font color='#ff00ff'&gt;_T&lt;/font&gt;( &lt;font color='#ff0000'&gt;&amp;quot;%04d/%02d/%02d %02d:%02d:%02d&amp;quot;&lt;/font&gt; )&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; , st.wYear&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; , st.wMonth&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; , st.wDay&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; , st.wHour&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; , st.wMinute&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; , st.wSecond );&lt;br&gt;
&amp;nbsp; &amp;nbsp; }&lt;br&gt;
&amp;nbsp; &amp;nbsp; ::MessageBox( &lt;font color='#ff00ff'&gt;NULL&lt;/font&gt;, szNow, &lt;font color='#ff00ff'&gt;_T&lt;/font&gt;( &lt;font color='#ff0000'&gt;&amp;quot;1週間前の時刻&amp;quot;&lt;/font&gt; ), MB_OK );&lt;br&gt;
}&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;※なお、上記サンプルでは time() 関数で現在時刻を取得しているので、&lt;font color='#ff00ff'&gt;NULL&lt;/font&gt; になることはまずないと思われるが、&lt;br&gt;
時間をファイルに読み書きしている場合に不正な時刻変換を行なおうとしてしまうことがありうる。&lt;br&gt;
実はそれこそが不正終了の一因だったりして(^^;&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/rapt/aggbug/59391.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>RAPT</dc:creator><title>CString::AppendFormat</title><link>http://blogs.wankuma.com/rapt/archive/2006/11/24/46786.aspx</link><pubDate>Fri, 24 Nov 2006 02:19:00 GMT</pubDate><guid>http://blogs.wankuma.com/rapt/archive/2006/11/24/46786.aspx</guid><wfw:comment>http://blogs.wankuma.com/rapt/comments/46786.aspx</wfw:comment><comments>http://blogs.wankuma.com/rapt/archive/2006/11/24/46786.aspx#Feedback</comments><slash:comments>203</slash:comments><wfw:commentRss>http://blogs.wankuma.com/rapt/comments/commentRss/46786.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/rapt/services/trackbacks/46786.aspx</trackback:ping><description>&lt;P&gt;&lt;FONT color=#a52a2a&gt;# まー、今更ですが。&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;自宅にある VC2003 で &lt;STRONG&gt;WTL7.5&lt;/STRONG&gt; final を入れて、新しい WTL の中身と ATL の中身を眺めていた時の話。&lt;/P&gt;
&lt;P&gt;&lt;CODE&gt;ATL::CString::AppendFormat()&lt;/CODE&gt; が増えていて便利ーと思った。&lt;BR&gt;CString 使っていると、整形文字列を追加したいことがよくあるので、そのたびに一時オブジェクトを作って&lt;BR&gt;&lt;CODE&gt;CString::operator+=()&lt;/CODE&gt; していたので。&lt;/P&gt;
&lt;P&gt;しかしなぜかこのメソッドが &lt;STRONG&gt;WTL7.5&lt;/STRONG&gt; になかった。&lt;BR&gt;ATL に比べてこれだけ外す理由が思いつかないのだけど。&lt;/P&gt;
&lt;P&gt;VC++6/WTL7.0 の頃は、&lt;CODE&gt;MFC::CString&lt;/CODE&gt; に対して、&lt;CODE&gt;WTL::CString::Append( int n )&lt;/CODE&gt; があって優位だったのに&amp;#8230;。&lt;/P&gt;
&lt;P&gt;なぜ実装しなかったのかは謎だが、まぁ、WTL はオープンソースなヘッダ群なので早速、&lt;BR&gt;&lt;CODE&gt;WTL::CString::AppendFormat()&lt;/CODE&gt; を作成しました。&lt;BR&gt;実際のところは、&lt;CODE&gt;WTL::CString&lt;/CODE&gt; のメソッドを順番に呼ぶだけなのでそんなに難しくはなく。&lt;/P&gt;
&lt;P&gt;※宣言は省略。定義だけ。なお、変数名は WTL の流儀にあわせてあります。&lt;/P&gt;
&lt;DIV style="BORDER-RIGHT: blue 1px solid; PADDING-RIGHT: 1em; BORDER-TOP: blue 1px solid; PADDING-LEFT: 1em; PADDING-BOTTOM: 0.5em; BORDER-LEFT: blue 1px solid; PADDING-TOP: 0.5em; BORDER-BOTTOM: blue 1px solid; color:inherit; background-color: white"&gt;
&lt;P&gt;&lt;CODE&gt;&lt;FONT color=#006400&gt;// [atlmisc.h]&lt;BR&gt;// UDT RAPT : like ATL::CString::AppendFormat&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;inline&lt;/FONT&gt; &lt;FONT color=#ff1493&gt;BOOL&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;__cdecl&lt;/FONT&gt; &lt;FONT color=#ff1493&gt;CString&lt;/FONT&gt;::AppendFormat( &lt;FONT color=#ff1493&gt;LPCTSTR&lt;/FONT&gt; lpszFormat, ... )&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#ff1493&gt;ATLASSERT&lt;/FONT&gt;( _IsValidString( lpszFormat ) );&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; va_list argList;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; va_start( argList, lpszFormat );&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#ff1493&gt;CString&lt;/FONT&gt; string;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#ff1493&gt;BOOL&lt;/FONT&gt; bRet = string.FormatV( lpszFormat, argList );&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; va_end( argList );&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;operator&lt;/FONT&gt; += ( string );&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;return&lt;/FONT&gt; bRet;&lt;BR&gt;}&lt;BR&gt;&lt;FONT color=#006400&gt;// ENDE&lt;BR&gt;&lt;/FONT&gt;&lt;/CODE&gt;&lt;/P&gt;&lt;/DIV&gt;&lt;img src ="http://blogs.wankuma.com/rapt/aggbug/46786.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>