56 bool m_boIsNormalForBlink;
61 COLORREF m_colorNormal;
73 void m_ResearchContent(
void)
77 loop ( i, m_content.GetLength() )
79 if ( m_content.GetAt(i) ==
'\r' )
81 if ( m_content.GetAt(i + 1) ==
'\n' )
83 m_vdwTopPoss.
Add(i + 2);
87 m_vdwTopPoss.
Add(i + 1);
98 void m_Draw(CDC* dc,
bool boIsForBlink =
false)
101 CFont* pOldFont = dc->SelectObject(m_pfont);
103 dc->IntersectClipRect(m_rect);
105 if ( ! boIsForBlink )
107 dc->FillSolidRect(m_rect, m_colorBack);
110 m_pfont->GetLogFont(&tFont);
111 dc->SetBkMode(OPAQUE);
115 r.OffsetRect(m_pointMargin);
116 r.OffsetRect(0, abs(
static_cast<LONG
>(tFont.lfHeight * i)));
119 INDEX j = m_vdwTopPoss[i];
120 while ( j < m_content.GetLength() )
122 EAttr a = m_content.GetAttribute(j);
123 c[0] = m_content.GetAt(j++);
124 if ( c[0] ==
'\n' || c[0] == 0 )
134 dc->SetTextColor(m_colorNormal);
135 dc->SetBkColor(m_colorBack);
139 dc->SetTextColor(m_colorBack);
140 dc->SetBkColor(m_colorNormal);
146 c[1] = m_content.GetAt(j);
147 uChar = (uChar << 8) | (c[1] & 0xFF);
149 dc->DrawText(c, 2, r, 0);
154 dc->DrawText(c, 1, r, 0);
158 VERIFY(dc->GetCharABCWidths(uChar, uChar, &abc));
159 r.OffsetRect(abc.abcA + abc.abcB + abc.abcC, 0);
162 dc->SelectObject(pOldFont);
176 ::Sleep(BLINK_TIMING);
177 m_boIsNormalForBlink = ! m_boIsNormalForBlink;
178 if ( m_syncDraw.
Lock(0) )
182 HDC hdc = ::GetDC(m_hWnd);
189 ::ReleaseDC(m_hWnd, dc);
207 virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
209 if ( message == WM_PAINT )
212 if ( m_syncDraw.
Lock(0) )
219 else if ( message == WM_PRINTCLIENT )
223 CDC* pDc = CDC::FromHandle(
reinterpret_cast<HDC
>(wParam));
224 if ( m_syncDraw.
Lock(0) )
232 else if ( message == WM_SETTEXT )
234 CAttrStr s(
reinterpret_cast<LPCTSTR
>(lParam));
237 else if ( message == WM_DESTROY )
240 return _super::WindowProc(message, wParam, lParam);
242 return _super::WindowProc(message, wParam, lParam);
250 virtual void PreSubclassWindow(
void)
252 _super::GetClientRect(m_rect);
253 _super::PreSubclassWindow();
255 _super::GetWindowText(s);
256 m_content = s.operator LPCTSTR();
259 CWnd* P = GetParent();
262 m_pfont = P->GetFont();
264 m_thread.
Start(_T(
"CAttributeTextCtrl Blink用"));
272 , m_colorBack(::GetSysColor(COLOR_MENU))
273 , m_colorNormal(::GetSysColor(COLOR_MENUTEXT))
274 , m_boIsNormalForBlink(false)
275 , m_pointMargin(0, 0)
304 void SetFont(CFont* pFont, BOOL bRedraw = TRUE)
307 _super::SetFont(pFont, bRedraw);
348 m_content.Insert(iIndex, as);
361 m_content.SetAt(iIndex, c, attr);
#define loop(VAR, CNT)
loop構文.
HWND GetSafeHwnd(void) const
[取得] ウィンドウハンドル取得.
virtual bool Lock(DWORD dwTime=INFINITE) const
[排他] ロック
virtual void Unlock(void) const
[排他] アンロック
bool SetRunner(IRunner *pRunner)
[設定] ランナー、設定
bool Stop(DWORD dwWait=15000)
[設定] スレッド停止 スレッドに対して停止要求します。
bool Start(LPCTSTR lpszName=NULL)
[設定] スレッド開始
virtual size_t GetSize(void) const
[取得] サイズ取得
virtual bool RemoveAll(void)
[削除] 空化
virtual INDEX Add(const TYP &t)
[追加] 要素一つ追加.
~CAttributedTextCtrl(void)
デストラクタ
void SetContent(const CAttrStr &as)
[設定] 内容一括設定
CAttributedStrT< EAttr > CAttrStr
属性付き文字列
void SetAt(int iIndex, TCHAR c, EAttr attr=NORMAL)
[設定] 内容変更
void SetMargin(int x, int y)
[設定] マージン設定
const CAttrStr & GetContent(void) const
[取得] 内容取得
void AddContent(const CAttrStr &as)
[設定] 内容連結
void SetFont(CFont *pFont, BOOL bRedraw=TRUE)
[設定] フォント設定
void InsertContent(int iIndex, const CAttrStr &as)
[設定] 内容挿入
CAttributedTextCtrl(void)
コンストラクタ
int GetCharSize(char c)
[取得] 文字のサイズ(ASCII/SJIS用)
#define EXCLUSIVE(CLS)
簡易排他制御マクロ.
bool IsRunnable(void) const
[確認] 実行可能か否か