TNB Library
TnbMfcListBoxCp.h
[詳解]
1#pragma once
11#include "TnbMfcCommon.h"
12#include "TnbClipboard.h"
13#include "TnbStrAdder.h"
14
15
16
17//TNB Library
18namespace TNB {
19namespace MFC {
20
21
22
50class CListBoxCp : public CListBox
51{
52 DEFSUPER(CListBox);
53public:
54
56 CListBoxCp(void) : m_maxLine(20000)
57 {
58 }
59
65 void SetMaxLine(int maxLine)
66 {
67 m_maxLine = maxLine;
68 }
69
75 int GetMaxLine(void) const
76 {
77 return m_maxLine;
78 }
79
83 void AllSetSel(void)
84 {
85 int iItemCount = _super::GetCount();
86 if ( iItemCount > 0 )
87 {
88 _super::SelItemRange(TRUE, 0, iItemCount - 1);
89 }
90 }
91
98 CString ToString(bool boIsSelectOnly = true)
99 {
100 CStrAdder strText;
101 int iItemCount = _super::GetCount();
102 if ( 0 < iItemCount )
103 {
104 CString s;
105 for ( int i = 0; i < iItemCount; i++ )
106 {
107 if ( ! boIsSelectOnly || _super::GetSel(i) > 0 )
108 {
109 //選択されている
110 GetText(i, s);
111 strText += s;
112 strText += _T("\r\n");
113 }
114 }
115 }
116 return CString(strText);
117 }
118
124 void Copy(bool boIsSelectOnly = true)
125 {
126 CString strText = ToString(boIsSelectOnly);
127 if ( ! strText.IsEmpty() )
128 {
129 CClipboard clip(_super::m_hWnd);
130 clip.SetString(strText);
131 }
132 }
133
141 void PostString(int nIndex, LPCTSTR lpszItem)
142 {
143 if ( ! ::IsWindow(m_hWnd) ) { return; }
144 CString* P = new CString(lpszItem);
145 if ( ! _super::PostMessage(WM_CLB_POSTSTRING, nIndex, reinterpret_cast<LPARAM>(P)) )
146 {
147 delete P;
148 }
149 }
150
160 int InsertString(int nIndex, LPCTSTR lpszItem)
161 {
162 m_CheckMaxLine();
163 return _super::InsertString(nIndex, lpszItem);
164 }
165
173 int AddString(LPCTSTR lpszItem)
174 {
175 m_CheckMaxLine();
176 return _super::AddString(lpszItem);
177 }
178
186 int DeleteString(UINT nIndex)
187 {
188 return _super::DeleteString(nIndex);
189 }
190
198 int DeleteStringEx(UINT nIndex)
199 {
200 _super::SetRedraw(FALSE);
201 int sel = _super::GetTopIndex();
202 int r = _super::DeleteString(nIndex);
203 _super::SetTopIndex(sel);
204 _super::SetRedraw(TRUE);
205 _super::RedrawWindow(NULL, NULL, RDW_INVALIDATE);
206 return r;
207 }
208
216 virtual int GetText(int nIndex, LPTSTR lpszBuffer) const
217 {
218 return _super::GetText(nIndex, lpszBuffer);
219 }
220
226 virtual void GetText(int nIndex, CString& rString) const
227 {
228 _super::GetText(nIndex, rString);
229 }
230
231protected:
232 enum { WM_CLB_POSTSTRING = WM_APP };
233
239 virtual void PreSubclassWindow(void)
240 {
241 #ifdef _DEBUG
242 DWORD dwStyle = _super::GetStyle();
243 ASSERT(dwStyle & LBS_EXTENDEDSEL);
244 #endif
245 _super::PreSubclassWindow();
246 }
247
257 virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
258 {
259 switch ( message )
260 {
261 case WM_CHAR:
262 if ( m_CheckCtrlKey(wParam, lParam) )
263 {
264 return TRUE;
265 }
266 break;
267 case WM_CLB_POSTSTRING:
268 {
269 CString* P = reinterpret_cast<CString*>(lParam);
270 if ( ::IsWindow(m_hWnd) )
271 {
272 int iIndex = ToInt(wParam);
273 if ( m_maxLine >= 0 && _super::GetCount() >= m_maxLine )
274 {
275 _super::SetRedraw(FALSE);
276 _super::DeleteString(0);
277 LRESULT r = _super::InsertString(iIndex, *P);
278 _super::SetTopIndex(ToInt(r));
279 _super::SetRedraw(TRUE);
280 _super::RedrawWindow(NULL, NULL, RDW_INVALIDATE);
281 }
282 else
283 {
284 LRESULT r = _super::InsertString(iIndex, *P);
285 _super::SetTopIndex(ToInt(r));
286 }
287 }
288 delete P;
289 return 0;
290 }
291 break;
292 case WM_VSCROLL:
293 case WM_MOUSEWHEEL:
294 {
295 _super::SetRedraw(FALSE);
296 int top1 = _super::GetTopIndex();
297 LRESULT r = _super::WindowProc(message, wParam, lParam);
298 int top2 = _super::GetTopIndex();
299 _super::SetTopIndex(top1);
300 _super::SetRedraw(TRUE);
301 if ( top1 == top2 )
302 {
303 _super::RedrawWindow(NULL, NULL, RDW_UPDATENOW | RDW_INVALIDATE | RDW_ERASE);
304 }
305 else
306 {
307 _super::SetTopIndex(top2);
308 }
309 CWnd* pWnd = GetParent();
310 if ( pWnd != NULL )
311 {
312 if ( message == WM_VSCROLL )
313 {
314 pWnd->SendMessage(WM_VSCROLL, wParam, reinterpret_cast<LPARAM>(GetSafeHwnd()));
315 }
316 else
317 {
318 WPARAM w = MAKELONG(SB_THUMBPOSITION, GetTopIndex());
319 pWnd->SendMessage(WM_VSCROLL, w, reinterpret_cast<LPARAM>(GetSafeHwnd()));
320 }
321 }
322 return r;
323 }
324 break;
325 }
326 return _super::WindowProc(message, wParam, lParam);
327 }
328
329private:
338 bool m_CheckCtrlKey(WPARAM wParam, LPARAM lParam)
339 {
340 LPARAM lp = lParam & 0x00FFFFFF;
341 if ( lp == 0x002e0001 && wParam == 0x03 )
342 {
343 //Ctrl + C
344 CWaitCursor a;
345 Copy();
346 return true;
347 }
348 if ( lp == 0x001e0001 && wParam == 0x01 )
349 {
350 //Ctrl + A
351 CWaitCursor a;
352 AllSetSel();
353 MFCLIB::SendCommandMessage(this, LBN_SELCHANGE);
354 return true;
355 }
356 return false;
357 }
359 void m_CheckMaxLine(void)
360 {
361 if ( m_maxLine >= 0 && _super::GetCount() >= m_maxLine )
362 {
363 _super::DeleteString(0);
364 }
365 }
366 int m_maxLine;
367};
368
369
370
371}; // MFC
372}; // TNB
Windowsクリップボード関係のヘッダ
MFCコントロール共通のヘッダ
文字列連結関係のヘッダ
ListBoxコントロール.
ウィンドウ管理.
HWND GetSafeHwnd(void) const
[取得] ウィンドウハンドル取得.
クリップボードアクセスクラス
Definition: TnbClipboard.h:49
bool SetString(LPCTSTR lpszText, bool isAdd=false)
[設定] 文字列登録.
Definition: TnbClipboard.h:174
文字列連結専門管理
Definition: TnbStrAdder.h:33
文字列コピー機能付ListBoxコントロール
void SetMaxLine(int maxLine)
[設定] 最大ライン数設定.
void PostString(int nIndex, LPCTSTR lpszItem)
[追加] 文字列追加.
virtual int GetText(int nIndex, LPTSTR lpszBuffer) const
[取得] 文字列取得.
void Copy(bool boIsSelectOnly=true)
[処理] 選択項目コピー.
int GetMaxLine(void) const
[取得] 最大ライン数取得.
int DeleteStringEx(UINT nIndex)
[削除] 文字列削除.
virtual void PreSubclassWindow(void)
[通知] subclassing/unsubclassing functions.
int InsertString(int nIndex, LPCTSTR lpszItem)
[追加] 文字列追加.
virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
[通知] for processing Windows messages.
void AllSetSel(void)
[選択] 全項目選択.
int DeleteString(UINT nIndex)
[削除] 文字列削除.
CString ToString(bool boIsSelectOnly=true)
[処理] 文字列取得.
int AddString(LPCTSTR lpszItem)
[追加] 文字列追加.
virtual void GetText(int nIndex, CString &rString) const
[取得] 文字列取得.
CListBoxCp(void)
コンストラクタ
LRESULT SendCommandMessage(CWnd *pCtrl, UINT cmd)
[処理] WM_COMMAND送信.
Definition: TnbMfcCommon.h:475
int ToInt(LPCSTR lpsz, int iBase=10)
[変換] INT変換(ASCII/SJIS用).
Definition: TnbStrLib.h:367
TNB Library
Definition: TnbDoxyTitle.txt:2