OSDN Git Service

4d3b16dd2907d59652aa8d4f905f292a2a2e812d
[nlite/nlite.git] / nlite / nlite_commentview.cpp
1 #include "stdafx.h"
2 #include "nlite_include.h"
3
4
5 namespace nlite{
6
7 //
8 //\83R\83\81\83\93\83g\83r\83\85\81[\83N\83\89\83X\83\81\83\\83b\83h
9 ///////////////////////////////////////////////////////
10
11 CCommentView::CCommentView():
12                 m_commentListWindow(*this)
13         {
14
15                 LOGFONT lf = {0};
16                 lf.lfHeight = 10;
17                 lf.lfCharSet = SHIFTJIS_CHARSET;
18
19
20                 hHeaderFontNew = CreateFontIndirect(&lf);
21
22                 
23                 return;
24
25 }
26
27 CCommentView::~CCommentView(){
28
29
30         DeleteObject(hHeaderFontNew);
31
32         return;
33 }
34
35
36
37
38 VOID CCommentView::OnConnect(){
39         m_commentListWindow.SetRedraw(FALSE);
40         commentlist.OnConnect();
41         
42         SCROLLINFO vScrollInfo = {0};
43         vScrollInfo.cbSize = sizeof(vScrollInfo);
44         vScrollInfo.fMask = SIF_RANGE;
45
46         this->SetScrollInfo(SB_VERT,&vScrollInfo,TRUE);
47
48         viewStartHeight = 0;
49         m_commentListWindow.SetRedraw(TRUE);
50         
51         
52 }
53
54
55 UINT_PTR CCommentView::GetColumnHolSizeSum(){
56
57         INT_PTR nMin = 0;
58         INT_PTR nMax = 0;
59         this->GetScrollRange(SB_HORZ,&nMin,&nMax);
60
61         return nMax;
62 }
63
64 VOID CCommentView::SetProperty(CommentViewProperty &setProperty){
65
66         viewproperty = setProperty;
67         return;
68 }
69
70 CommentViewProperty &CCommentView::GetProperty(){
71
72         return viewproperty;
73
74 }
75
76
77
78
79
80 HWND CCommentView::Create(HWND hWndParent){
81
82         
83
84         HWND rslt = __super::Create(hWndParent,0,commentViewConstant::NLITE_COMMENTVIEW,WS_VISIBLE | WS_CHILD | WS_VSCROLL | WS_HSCROLL | WS_BORDER,0,commentViewConstant::MENU_OR_ID);
85
86         PAINTSTRUCT ps;
87         HDC hdc = m_header.BeginPaint(&ps);
88         SIZE size;
89
90         HFONT hOld = (HFONT)SelectObject(hdc,hHeaderFontNew);
91
92         LPTSTR columns[] = {TEXT("\83R\83\81\94Ô"),TEXT("\83\86\81[\83U\81[\96¼"),TEXT("\83R\83\81\83\93\83g"),TEXT("\8e\9e\8aÔ"),TEXT("\8fî\95ñ")};
93         UINT_PTR holizenSize[] = {0,0,100,0,0};
94
95         for(UINT_PTR index = 0;index < ARRAY_LENGTH(columns) ;++index){
96
97                 GetTextExtentPoint32(hdc , columns[index] , _tcslen(columns[index]) , &size);
98                 UINT_PTR holsize = holizenSize[index] + size.cx + 15;
99                 holizenSize[index] = viewproperty.headerholSize[index] >= 0 ? viewproperty.headerholSize[index] : holsize;
100         }
101
102         SelectObject(hdc,hOld);
103
104         m_header.EndPaint(&ps);
105                         
106                         
107         HEADERSINFO headersinfo = {columns,holizenSize,ARRAY_LENGTH(columns)};
108
109         AddHeader(&headersinfo);
110
111         m_header.SetOrderArray(ARRAY_LENGTH(viewproperty.headerOraderArray),viewproperty.headerOraderArray);
112                 
113                         
114         
115                         
116         return rslt;
117 }
118
119
120
121
122 LRESULT CCommentView::OnHeaderEndTrack(LPNMHDR lParam){
123
124         
125         if(lParam->hwndFrom == m_header.m_hWnd){
126                 
127                 
128                 m_commentListWindow.SetRedraw(FALSE);
129                 SCROLLINFO vScrollInfo = {0};
130                 vScrollInfo.fMask = SIF_PAGE | SIF_POS | SIF_RANGE;
131
132                 this->GetScrollInfo(SB_VERT,&vScrollInfo);
133                 vScrollInfo.nPage = m_commentListWindow.CalcScrollPage();
134                 vScrollInfo.fMask = SIF_PAGE;
135                 this->SetScrollInfo(SB_VERT,&vScrollInfo);
136
137                 BOOL scrollFlag = vScrollInfo.nPos + (int)vScrollInfo.nPage + 1>= vScrollInfo.nMax;
138                 UINT_PTR commentCount = commentlist.Size();
139                 LPNMHEADER  lpNmHdr = (LPNMHEADER )lParam;
140                 
141                 m_header.SetItem(lpNmHdr->iItem,lpNmHdr->pitem);
142
143
144                 
145                 
146                 
147                 
148
149                 if(scrollFlag == TRUE){
150
151                         this->SendMessageW(WM_VSCROLL,MAKELONG(SB_BOTTOM,0),0);
152                 }
153
154                 INT_PTR itemCount = m_header.GetItemCount();
155                 RECT itemSizeRect;
156                 
157                 INT_PTR nMax = 0;
158                 for(INT_PTR itemIndex = 0;itemIndex < itemCount;itemIndex++){
159                         m_header.GetItemRect(itemIndex,&itemSizeRect);
160                         nMax += itemSizeRect.right - itemSizeRect.left;
161
162                 }
163                 INT_PTR nMin = 0;
164                 this->SetScrollRange(SB_HORZ,nMin,nMax,TRUE);
165                 DecisionHorzSize();
166
167
168                 auto begin = commentlist.begin();
169
170                 auto end = commentlist.end();
171
172                 /*
173                 for(;begin != end;++begin){
174
175                         begin->height = m_commentListWindow.CalcItemHeight(*begin);
176                 }
177                 */
178                 m_commentListWindow.SetRedraw(TRUE);
179                 if(TryEnterCriticalSection(&m_commentListWindow.m_sec) == TRUE){
180                         m_commentListWindow.Invalidate();
181                         m_commentListWindow.Unlock();
182                 }
183                         
184         }
185
186         return 0;
187 }
188
189 VOID CCommentView::OnChatReceve(NicoLiveChat_P chat,UINT_PTR commnetCountSum){
190
191         commentlist.OnChatReceve(chat,commnetCountSum,this->m_commentListWindow);
192
193         return;
194 }
195
196
197 VOID CCommentView::SetStreamStatus(StreamStatus &st){
198         
199         streamStatus.SetStreamStatus(st);
200 }
201
202 VOID CCommentView::OnChatReceveSettle(UINT_PTR chatNo,UINT_PTR commentCountSum){
203
204         
205         SCROLLINFO vScrollInfo = {0};
206         
207         //vScrollCcs.Lock();
208
209         vScrollInfo.fMask = SIF_ALL;
210
211         this->GetScrollInfo(SB_VERT,&vScrollInfo);
212         BOOL scrollFlag = vScrollInfo.nPos + (int)vScrollInfo.nPage >= vScrollInfo.nMax;
213         
214
215
216         vScrollInfo.fMask = SIF_RANGE | SIF_PAGE;
217         vScrollInfo.cbSize = sizeof(vScrollInfo);
218         vScrollInfo.nMax = commentCountSum;
219         vScrollInfo.nPage = m_commentListWindow.CalcScrollPage();
220         
221         
222         this->SetScrollInfo(SB_VERT,&vScrollInfo);
223
224         
225
226         
227         if(scrollFlag == TRUE){
228                 this->SendMessageW(WM_VSCROLL,MAKEWORD(SB_BOTTOM,0),0);
229         }
230         if(vScrollInfo.nPos + vScrollInfo.nPage >= vScrollInfo.nMax - vScrollInfo.nPage && TryEnterCriticalSection(&m_commentListWindow.m_sec) == TRUE){
231                 m_commentListWindow.Invalidate();
232                 m_commentListWindow.Unlock();
233         }
234         
235         return;
236 }
237
238 static UCHAR getrgb(){
239
240         UCHAR rgb = 160 + rand() % 92;
241         return rgb;
242 }
243
244
245
246
247
248
249
250
251
252
253
254 LRESULT CCommentView::OnSize(UINT wParam,SIZE lParam){
255         ChangeSize(lParam);
256                         
257         return 0;
258 }
259
260
261 VOID CCommentView::ChangeSize(const SIZE& client){
262         
263         SCROLLINFO hScrollInfo = {0};
264         hScrollInfo.cbSize = sizeof(hScrollInfo);
265         hScrollInfo.fMask = SIF_PAGE;
266         hScrollInfo.nPage = client.cx;
267         
268         this->SetScrollInfo(SB_HORZ,&hScrollInfo);
269         hScrollInfo.fMask = SIF_ALL;
270         this->GetScrollInfo(SB_HORZ,&hScrollInfo);
271
272         
273         HDWP hDwp = BeginDeferWindowPos(2);
274         
275
276         INT_PTR movePos =  -1 * hScrollInfo.nPos;
277         
278         m_header.DeferWindowPos(hDwp,m_header.m_hWnd,movePos,0,0,0,SWP_NOSIZE | SWP_NOZORDER);
279         m_commentListWindow.DeferWindowPos(hDwp,m_commentListWindow.m_hWnd,movePos,commentViewConstant::HEADER_HAIGHT,::GetSystemMetrics(SM_CXFULLSCREEN),client.cy - commentViewConstant::HEADER_HAIGHT,SWP_NOZORDER);         
280
281         EndDeferWindowPos(hDwp);
282         
283         
284         RECT bkRect;
285         RECT headerRectSize;
286         m_header.GetWindowRect(&headerRectSize);
287         bkRect.left = headerRectSize.right - headerRectSize.left - hScrollInfo.nPos;
288         bkRect.top = 0;
289         bkRect.right = client.cx ;
290         bkRect.bottom = client.cy;
291         
292
293         return;
294 }
295
296
297 LRESULT CCommentView::OnEraseBkgnd(HDC wParam){
298
299         return TRUE;
300 }
301
302
303 VOID CCommentView::OnDestroy(){
304         m_header.GetOrderArray(ARRAY_LENGTH(viewproperty.headerOraderArray),viewproperty.headerOraderArray);
305         INT_PTR headerItemcount = m_header.GetItemCount();
306         RECT headerItemRect;
307         for(INT_PTR itemindex = 0;itemindex < headerItemcount;itemindex++){
308                                 
309                 m_header.GetItemRect(itemindex,&headerItemRect);
310                 viewproperty.headerholSize[itemindex] = headerItemRect.right - headerItemRect.left;
311         }
312         commentlist.OnDestroy();
313         m_header.DestroyWindow();
314         m_commentListWindow.DestroyWindow();
315         return;
316
317 }
318
319 LRESULT CCommentView::OnHeaderEndDrag(LPNMHDR lParam){
320
321         if(lParam->hwndFrom == m_header.m_hWnd){
322                 if(TryEnterCriticalSection(&m_commentListWindow.m_sec) == TRUE){
323                 
324                         m_commentListWindow.Invalidate();
325                         m_commentListWindow.Unlock();
326                 }
327
328         }
329
330         return 0;
331 }
332
333
334 VOID CCommentView::OnHScroll(INT_PTR loWParam,SHORT hiWParam,HWND lParam){
335
336                         
337         INT_PTR dy;
338         SCROLLINFO hScrollInfo = {0};
339         hScrollInfo.cbSize = sizeof(hScrollInfo);
340         hScrollInfo.fMask = SIF_ALL;
341         this->GetScrollInfo(SB_HORZ,&hScrollInfo);
342         switch(loWParam){
343
344         case SB_THUMBPOSITION:
345         case SB_THUMBTRACK:
346                 dy = hiWParam - hScrollInfo.nPos;
347                 break;
348
349         case SB_LINELEFT:
350         case SB_PAGELEFT:
351
352                 dy = -1 * hScrollInfo.nPage;
353
354                 break;
355
356         case SB_LINERIGHT:
357         case SB_PAGERIGHT:
358
359                 dy = hScrollInfo.nPage + hScrollInfo.nPos > (UINT_PTR)hScrollInfo.nMax ? 0 :(UINT_PTR) (hScrollInfo.nMax - ( hScrollInfo.nPage + hScrollInfo.nPos)) < hScrollInfo.nPage ? (hScrollInfo.nMax - ( hScrollInfo.nPage + hScrollInfo.nPos)) : hScrollInfo.nPage;
360
361                 break;
362
363         default:
364                 dy = 0;
365                 break;
366
367         }
368         
369         dy = max(-1 * hScrollInfo.nPos, min(dy, hScrollInfo.nMax - hScrollInfo.nPos));
370
371
372         if(dy != 0){
373                 hScrollInfo.nPos += dy;
374                 INT_PTR moveRange = -(hScrollInfo.nPos);
375
376                 HDWP hDwp = BeginDeferWindowPos(2);
377
378                 m_header.DeferWindowPos(hDwp,m_header.m_hWnd,moveRange,0,0,0,SWP_NOSIZE | SWP_NOZORDER);
379                 m_commentListWindow.DeferWindowPos(hDwp,m_commentListWindow.m_hWnd,moveRange,commentViewConstant::HEADER_HAIGHT,0,0,SWP_NOSIZE | SWP_NOZORDER);         
380
381                 EndDeferWindowPos(hDwp);
382                                         
383                                         
384                 this->SetScrollInfo(SB_HORZ,&hScrollInfo);
385         }
386                         
387         return;
388 }
389
390
391 VOID CCommentView::OnVScroll(INT_PTR loWParam,SHORT hiWParam,HWND lParam){
392
393         INT_PTR dy;
394         SCROLLINFO vScrollInfo = {0};
395         vScrollInfo.fMask = SIF_ALL;
396
397         
398         this->GetScrollInfo(SB_VERT,&vScrollInfo);
399
400         switch(loWParam){
401
402
403         case SB_THUMBPOSITION:
404         case SB_THUMBTRACK:
405
406                 dy = hiWParam - vScrollInfo.nPos;
407
408                 break;
409
410         case SB_LINEUP:
411
412                 dy = -1;
413                 break;
414
415         case SB_LINEDOWN:
416
417                 dy = 1;
418
419                 break;
420
421         case SB_PAGEUP:
422
423                 dy = -1 * vScrollInfo.nPage;
424
425                 break;
426
427         case SB_PAGEDOWN:
428
429                 dy = vScrollInfo.nPage;
430
431                 break;
432
433
434         case SB_TOP:
435
436                 dy = -vScrollInfo.nPos;
437
438                 break;
439
440         case SB_BOTTOM:
441
442                 dy = vScrollInfo.nMax;
443
444                 break;
445
446         default:
447
448                 dy = 0;
449
450                 break;
451
452         }
453
454         dy = max(-1 * vScrollInfo.nPos, min(dy, vScrollInfo.nMax - (vScrollInfo.nPos + (INT_PTR)vScrollInfo.nPage)));
455
456
457         if(dy != 0){
458
459                 vScrollInfo.nPos += dy;
460                 viewStartHeight = vScrollInfo.nPos;
461                 this->SetScrollInfo(SB_VERT,&vScrollInfo);
462                 if(TryEnterCriticalSection(&m_commentListWindow.m_sec) == TRUE){
463                         m_commentListWindow.Invalidate();
464                         m_commentListWindow.Unlock();
465                 }
466         }
467
468         
469                 
470         return;
471 }
472
473 LRESULT CCommentView::OnCreate(LPCREATESTRUCT lpcs){
474         m_header.Create(m_hWnd,0,WC_HEADER,WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN   | HDS_BUTTONS | HDS_HOTTRACK |HDS_DRAGDROP | HDS_FULLDRAG  ,0,commentViewConstant::HEADER_ID);
475         m_commentListWindow.Create(m_hWnd,0,commentViewConstant::NLITE_COMMENTLISTWINDOW,WS_CHILD | WS_VISIBLE  | WS_CLIPCHILDREN  , 0,commentViewConstant::LISTBOX_ID);
476         
477         
478         
479         
480         return 0;
481 }
482
483 VOID CCommentView::AddHeader(LPHEADERSINFO infos){
484
485
486         m_header.SetFont(hHeaderFontNew);
487
488         HDITEM item;
489         item.mask = HDI_FORMAT | HDI_TEXT | HDI_WIDTH;
490         item.fmt = HDF_CENTER | HDF_STRING;
491                         
492                         
493         for(UINT_PTR index = 0;index < infos->count ;++index){
494
495                 item.pszText = infos->columns[index];
496
497                 item.cxy =  infos->holizensize[index];
498                 m_header.AddItem(&item);
499         }
500
501         RECT itemRect;
502         INT_PTR nMax = 0;
503         UINT_PTR itemCount = m_header.GetItemCount();
504         for(UINT_PTR u_index = 0;u_index < itemCount;++u_index){
505
506                 m_header.GetItemRect(u_index,&itemRect);
507                 nMax += itemRect.right - itemRect.left;
508
509         }
510         
511         this->SetScrollRange(SB_HORZ,0,nMax,TRUE);
512         
513         DecisionHorzSize();
514         return;
515 }
516
517 VOID CCommentView::DecisionHorzSize(){
518         
519         HDWP hWindowPosInfo = BeginDeferWindowPos(2);
520         RECT bkWindowRect;
521         this->GetClientRect(&bkWindowRect);
522         m_header.DeferWindowPos(hWindowPosInfo,m_header.m_hWnd,0,0,::GetSystemMetrics(SM_CXFULLSCREEN),commentViewConstant::HEADER_HAIGHT,SWP_NOZORDER | SWP_NOMOVE);
523         m_commentListWindow.DeferWindowPos(hWindowPosInfo,m_header.m_hWnd,0,0,::GetSystemMetrics(SM_CXFULLSCREEN),bkWindowRect.bottom - commentViewConstant::HEADER_HAIGHT,SWP_NOZORDER | SWP_NOMOVE);
524
525         EndDeferWindowPos(hWindowPosInfo);
526                         
527         return;
528 }
529
530
531
532
533 //
534 //\83R\83\81\83\93\83g\83r\83\85\81[\83N\83\89\83X\93à\95\94\83\8a\83X\83g\83N\83\89\83X
535 ////////////////////////////////////////////////////////////////////
536
537 CCommentListWindow::CCommentListWindow(CCommentView &in_self):
538         self(in_self)
539         {}
540
541 CCommentListWindow::~CCommentListWindow(){
542 }
543
544
545 VOID CCommentListWindow::OnPaint(HDC in_hdc){
546
547         
548         
549         RECT windowRect;
550
551         RECT clientRect;
552         
553         self.GetClientRect(&clientRect);
554         clientRect.bottom -= commentViewConstant::HEADER_HAIGHT;
555
556         this->GetWindowRect(&windowRect);
557         windowRect.right -= windowRect.left;
558         windowRect.bottom -= windowRect.top;
559         windowRect.left = 0;
560         windowRect.top = 0;
561         RECT listRect = windowRect;
562         listRect.right = self.GetColumnHolSizeSum();
563         CPaintDC pdc(*this);
564         
565         {
566                 CMemoryDC mdc(pdc,windowRect);
567                 mdc.SelectFont(AtlGetDefaultGuiFont());
568                 mdc.FillRect(&clientRect,(HBRUSH)::GetStockObject(GRAY_BRUSH));
569
570                 CCommentList &commentList = self.commentlist;
571
572                 BOOL selectFlag = FALSE;
573                 CCommentList::iterator selectData;
574                 RECT selectRect = {0};
575         
576                 if(commentList.Size() > (UINT_PTR)self.viewStartHeight){
577
578         
579                         
580                         CCommentList::iterator chatData = commentList.begin();
581                         std::advance(chatData,self.viewStartHeight);
582                 
583
584
585                         CBrush baseBkBrush;
586                         baseBkBrush.CreateSolidBrush(self.viewproperty.backColor);
587                         mdc.FillRect(&listRect,baseBkBrush);
588                         baseBkBrush.DeleteObject();
589                         CCommentList::iterator endData = commentList.end();
590                         listRect.bottom = 0;
591
592                         CPen outLinePen;
593                         outLinePen.CreatePen(PS_SOLID,1,ColorList::outLineNomal);
594                         mdc.SelectPen(outLinePen);
595                         mdc.MoveTo(listRect.right,listRect.top);
596                         mdc.LineTo(listRect.right,listRect.bottom);
597
598
599                         for(;chatData != endData && listRect.top < clientRect.bottom;++chatData){
600                                 listRect.bottom +=      CalcItemHeight(*chatData);
601
602                                 
603                                 if(chatData->selectFlag == TRUE){
604                                         selectFlag = TRUE;
605                                         selectData = chatData;
606                                         selectRect = listRect;
607                                 } else {
608                                 
609                                         this->DrawItem(mdc,listRect,*chatData);
610                                 }
611                         
612                         
613                                 listRect.top = listRect.bottom;
614                         }
615
616                         mdc.SelectPen(outLinePen);
617                         mdc.MoveTo(listRect.left,listRect.bottom);
618                         mdc.LineTo(listRect.right,listRect.bottom);
619                         
620                         if(selectFlag == TRUE){
621                                 this->DrawItem(mdc,selectRect,*selectData);
622                         }
623
624                 }
625
626         
627         
628         
629         }
630
631         
632
633         
634         return;
635 }
636
637 VOID CCommentListWindow::OnSize(UINT wParam, _WTYPES_NS::CSize &windowSize){
638
639         
640         SCROLLINFO vScrollInfo = {0};
641         vScrollInfo.fMask = SIF_ALL;
642
643
644         self.GetScrollInfo(SB_VERT,&vScrollInfo);
645         BOOL scrollFlag = (UINT)(vScrollInfo.nPage + vScrollInfo.nPos + 1) >= (UINT)vScrollInfo.nMax;
646         vScrollInfo.nPage = CalcScrollPage();
647         
648         vScrollInfo.fMask = SIF_PAGE;
649         self.SetScrollInfo(SB_VERT,&vScrollInfo);
650
651         
652         
653         if(scrollFlag == TRUE){
654                 self.SendMessageW(WM_VSCROLL,MAKELONG(SB_BOTTOM,0),0);
655         }
656
657         this->Invalidate();
658         
659         return;
660 }
661
662
663 UINT_PTR CCommentListWindow::CalcScrollPage(){
664         
665         RECT clientRect;
666         INT_PTR rslt = 0;
667         LONG height = 0;
668         this->GetClientRect(&clientRect);
669         
670         SCROLLINFO vScrollInfo = {0};
671         if(self.commentlist.empty() != TRUE){
672                 
673                 CCommentList::reverse_iterator rbegin = self.commentlist.rbegein();
674                 CCommentList::reverse_iterator rend = self.commentlist.rend();
675                 for(;rbegin != rend;++rbegin){
676
677                         height += CalcItemHeight(*rbegin);
678                         
679                         if(height > clientRect.bottom)goto overclientrect;
680                         rslt++;
681                 }
682         }
683         
684         vScrollInfo.fMask = SIF_RANGE;
685         self.GetScrollInfo(SB_VERT,&vScrollInfo);
686         rslt = vScrollInfo.nMax + 1;
687
688         
689 overclientrect:
690
691         return rslt;
692 }
693
694 VOID CCommentListWindow::DrawItem(CDC &dc,RECT &rc,CChatData &chatData){
695
696         
697         RECT noViewRect;
698         RECT userNameViewRect;
699         RECT timeViewRect;
700         RECT chatViewRect;
701         RECT infoViewRect;
702
703         time_t chatTime = (time_t)difftime(chatData.date,self.streamStatus.start_time);
704         tm ct = *gmtime(&chatTime);
705         
706         TCHAR noString[sizeof(chatData.no) * 8]; 
707         TCHAR dateString[LENGTH_16];
708         _stprintf(noString,TEXT("%u"),chatData.no);
709
710         _tcsftime(dateString,ARRAY_LENGTH(dateString),ct.tm_hour != 0 ? TEXT("%H:%M:%S") : TEXT("%M:%S"),&ct);
711
712         COLORREF bkColor;
713         COLORREF outLineColor;
714         
715         CPen outLinePen;
716         CPen colLinePen;
717         CBrush bkBrush;
718         colLinePen.CreatePen(PS_SOLID,1,ColorList::colLine);
719         
720         
721         //\91I\91ð\8fó\91Ô\82©\83`\83F\83b\83N
722         if (chatData.selectFlag == TRUE)
723         {
724                 bkColor = ColorList::selectBack;
725                 outLineColor = ColorList::outLineSelect;
726                 
727                 
728         }
729         else  
730         {
731                 
732                 outLineColor = ColorList::outLineNomal;
733
734                 if(chatData.listenerData->originBkFlag == TRUE){
735                         
736                         bkColor = chatData.listenerData->bkColor;
737                         
738                         
739                 } else {
740                         
741                         bkColor = self.viewproperty.backColor;
742                         
743                         
744                         
745                 }
746         }
747
748         outLinePen.CreatePen(PS_SOLID,1,outLineColor);
749         bkBrush.CreateSolidBrush(bkColor);
750         dc.SelectPen(outLinePen);
751         
752         if(chatData.selectFlag == TRUE){
753                 
754                 dc.MoveTo(rc.left,rc.bottom);
755                 dc.LineTo(rc.right,rc.bottom);
756         }
757         dc.FillRect(&rc,bkBrush);
758         dc.SetBkColor(bkColor);
759         dc.MoveTo(rc.left,rc.top);
760         dc.LineTo(rc.right,rc.top);
761         
762         
763         
764         dc.SetTextColor(self.viewproperty.baseStringColor);
765         
766         
767         
768         
769
770         //\95`\89æ\83T\83C\83Y\82ð\8cv\8eZ
771         
772         self.m_header.GetItemRect(CCommentView::NO,&noViewRect);
773         self.m_header.GetItemRect(CCommentView::USERNAME,&userNameViewRect);
774         self.m_header.GetItemRect(CCommentView::COMMENT,&chatViewRect);
775         self.m_header.GetItemRect(CCommentView::TIME,&timeViewRect);
776         self.m_header.GetItemRect(CCommentView::INFO,&infoViewRect);
777
778         noViewRect.left += 2;
779         userNameViewRect.left += 2;
780         timeViewRect.left += 2;
781         chatViewRect.left += 2;
782         infoViewRect.left += 2;
783
784         noViewRect.right -= 2;
785         userNameViewRect.right -= 2;
786         timeViewRect.right -= 2;
787         chatViewRect.right -= 2;
788         infoViewRect.right -= 2;
789         
790         noViewRect.top = rc.top + 2;
791         userNameViewRect.top = rc.top + 2;
792         timeViewRect.top = rc.top + 2;
793         chatViewRect.top = rc.top + 2;
794         infoViewRect.top = rc.top + 2;
795
796         noViewRect.bottom = rc.bottom - 2;
797         userNameViewRect.bottom = rc.bottom - 2;
798         timeViewRect.bottom = rc.bottom - 2;
799         chatViewRect.bottom = rc.bottom - 2;
800         infoViewRect.bottom = rc.bottom - 2;
801         
802         dc.SelectPen(colLinePen);
803
804         dc.MoveTo(noViewRect.right,rc.top);
805         dc.LineTo(noViewRect.right,rc.bottom);
806         dc.MoveTo(userNameViewRect.right,rc.top);
807         dc.LineTo(userNameViewRect.right,rc.bottom);
808         dc.MoveTo(chatViewRect.right,rc.top);
809         dc.LineTo(chatViewRect.right,rc.bottom);
810         dc.MoveTo(timeViewRect.right,rc.top);
811         dc.LineTo(timeViewRect.right,rc.bottom);
812
813         dc.DrawTextW(noString,_tcslen(noString),&noViewRect,DT_WORD_ELLIPSIS);
814         dc.DrawTextW(chatData.listenerData->user_id,chatData.listenerData->user_id.GetLength(),&userNameViewRect,DT_WORD_ELLIPSIS);
815         dc.DrawTextW(chatData.chatBuf,chatData.chatBuf.GetLength(),&chatViewRect,DT_WORDBREAK);
816         dc.DrawTextW(dateString,_tcslen(dateString),&timeViewRect,DT_WORD_ELLIPSIS);
817         
818         return;
819 }
820
821
822 UINT_PTR CCommentListWindow::CalcItemHeight(CChatData &chatData){
823
824         RECT drowSize;
825         self.m_header.GetItemRect(CCommentView::COMMENT,&drowSize);
826         drowSize.left += 2;
827         drowSize.top +=  2;
828         drowSize.right -= 2;
829         drowSize.bottom = 0;
830
831         CPaintDC pdc(*this);
832         pdc.SelectFont(AtlGetDefaultGuiFont());
833         ::DrawTextW(pdc,chatData.chatBuf,chatData.chatBuf.GetLength(),&drowSize, DT_CALCRECT | DT_WORDBREAK);
834         drowSize.top -= 2;
835         drowSize.bottom += 2;
836
837         return drowSize.bottom;
838 }
839
840
841 LRESULT CCommentListWindow::OnCreate(LPCREATESTRUCT lpCreateStruct){
842         
843         return 0;
844 }
845
846 INT_PTR CCommentListWindow::CalcClickLine(INT_PTR height){
847         SCROLLINFO vScrollInfo = {0};
848         vScrollInfo.fMask = SIF_POS;
849
850         self.GetScrollInfo(SB_VERT,&vScrollInfo);
851
852         INT_PTR heightSum = 0;
853         INT_PTR lineNo = vScrollInfo.nPos;
854         CCommentList::iterator chatData = self.commentlist.begin();
855         CCommentList::iterator end = self.commentlist.end();    
856         std::advance(chatData,vScrollInfo.nPos);
857         for(; chatData != end;++chatData){
858                 
859                 heightSum += CalcItemHeight(*chatData);
860
861                 if(heightSum >= height){
862
863                         goto end;
864                 }
865
866                 ++lineNo;
867         }
868         lineNo = -1;
869 end:
870
871
872         return lineNo;
873 }
874
875
876
877 VOID CCommentListWindow::OnLButtonDown(UINT wParam, _WTYPES_NS::CPoint &point){
878
879
880         
881         this->SetFocus();
882         if(self.commentlist.empty() == TRUE)return;
883         auto curselItem = self.commentlist.GetCurSelItem();
884         if(curselItem != self.commentlist.end()){
885                 curselItem->selectFlag = FALSE;
886         }
887         self.commentlist.SetCurSel(CalcClickLine(point.y));
888         if(TryEnterCriticalSection(&this->m_sec) == TRUE){
889                 this->Invalidate();
890                 this->Unlock();
891         }
892         return;
893 }
894
895
896 VOID CCommentListWindow::OnLButtonDbClk(UINT wParam, _WTYPES_NS::CPoint &point){
897
898         
899
900         
901         this->SetFocus();
902         if(self.commentlist.empty() == TRUE)return;
903                 
904         auto chatData = self.commentlist.GetChatAt(CalcClickLine(point.y));
905         COLORREF bkColor;
906         if(chatData.listenerData->originBkFlag == FALSE){
907                 CListenerColorCollector colorCollector;
908                 listenerList.BkColorCollect(colorCollector);
909                 UCHAR red;
910                 UCHAR green;
911                 UCHAR blue;
912                 
913                 srand((unsigned int)time(NULL));
914                 do{
915
916                         red = getrgb();
917                         green = getrgb();
918                         blue = getrgb();
919                         bkColor = RGB(red,green,blue);
920
921                 }while(colorCollector.Find(bkColor));
922                 
923                 chatData.listenerData->originBkFlag = TRUE;
924                 chatData.listenerData->SetBkColor(bkColor);
925         } else {
926
927                 
928                 chatData.listenerData->originBkFlag = FALSE;
929         }
930
931         
932         
933
934         
935
936         if(TryEnterCriticalSection(&this->m_sec) == TRUE){
937                 this->Invalidate(TRUE);
938                 this->Unlock();
939         }
940         
941         
942         
943         
944         return;
945 }
946
947 LRESULT CCommentListWindow::OnEraseBkGnd(HDC lparam){
948
949         return TRUE;
950 }
951
952 LRESULT CCommentListWindow::OnMouseWheel(UINT loWparam,SHORT hiWparam,CPoint &point){
953
954         
955         self.SendMessageW(WM_VSCROLL,MAKELONG(hiWparam < 0 ? SB_PAGEDOWN : SB_PAGEUP ,0),0);
956
957
958         return 0;
959 }
960
961
962
963 }