OSDN Git Service

50acbd8f24881debba0eabcfaf4e8e8b3be4b04e
[nlite/nlite.git] / nlite / nlite_commentview.cpp
1 #include "stdafx.h"
2 #include "nlite_include.h"
3
4
5 namespace nlite{
6
7
8         static const UINT_PTR SELL_SPACE_LENGTH = 1;
9         //
10         //\83R\83\81\83\93\83g\83r\83\85\81[\93à\82Ì\83R\83\93\83g\83\8d\81[\83\8b\83N\83\89\83X
11         ///////////////////////////////////////////////////////////////////
12
13         BOOL CChatReadEdit::SetWindowText(LPCTSTR str){
14
15                 return __super::SetWindowText(str);
16                 
17         }
18
19         
20
21         HWND CChatReadEdit::GeneralCreate(HWND hParent,DWORD eventMask,UINT id){
22
23
24                 this->Create(hParent,0,RICHEDIT_CLASS,WS_CHILD | WS_VISIBLE  | WS_CLIPCHILDREN | ES_AUTOVSCROLL | ES_MULTILINE   | ES_READONLY,0,id);
25                 
26                 DWORD dwLangOptons = this->SendMessage(EM_GETLANGOPTIONS,0,0);
27                 dwLangOptons &= ~IMF_DUALFONT;
28                 this->SendMessage(EM_SETLANGOPTIONS,0,(LPARAM)dwLangOptons);
29
30                 
31                 CFont defFont = ::AtlGetDefaultGuiFont();
32                 LOGFONT deflogFont;
33                 defFont.GetLogFont(&deflogFont);
34                 CHARFORMAT2 m_defCharFormat;
35                 this->GetDefaultCharFormat(m_defCharFormat);
36                 CDC cDC = this->GetDC();
37                 int picy = cDC.GetDeviceCaps(LOGPIXELSY);
38                 this->ReleaseDC(cDC.m_hDC);
39                 int point = -MulDiv(deflogFont.lfHeight,72,picy);
40                 int twips = point * 20;
41                 m_defCharFormat.yHeight = twips;
42                 _tcscpy(m_defCharFormat.szFaceName,deflogFont.lfFaceName);
43                 this->SetEventMask(eventMask);
44                 
45         this->SetDefaultCharFormat(m_defCharFormat);
46
47
48                 return *this;
49
50         }
51
52         CChatChildCtrls::CChatChildCtrls(CCommentView &hMaster):
53         m_master(hMaster)
54         {
55                 
56                 return;
57         }
58
59         
60
61         VOID CChatChildCtrls::Create(){
62
63                 this->chatDispCtrl.GeneralCreate(m_master.m_commentListWindow,ENM_LINK  | ENM_MOUSEEVENTS,CHAT_DISPCTRL_ID);
64
65         }
66
67         VOID CChatChildCtrls::AdjustRect(RECT &rc){
68
69                 rc.left += SELL_SPACE_LENGTH;
70                 rc.top += SELL_SPACE_LENGTH;
71                 rc.right -= SELL_SPACE_LENGTH;
72                 rc.bottom -= SELL_SPACE_LENGTH;
73
74                 return;
75         }
76
77         VOID CChatChildCtrls::Hide(HDWP hdwp){
78
79                 chatDispCtrl.DeferWindowPos(hdwp,chatDispCtrl,0,0,0,0,SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_HIDEWINDOW);
80
81         }
82         
83         VOID CChatChildCtrls::SetCtrl(HDWP hdwp,const RECT  &rc,CCommentList::reference comment,BOOL mulutiLineFlag){
84
85                 
86                 chatDispCtrl.SetWindowText(comment.chatBuf);
87                 RECT chatRect = rc;
88                 
89                 
90                 AdjustRect(chatRect);
91
92                 COLORREF bkColor;
93
94                 if (comment.viewData.selectFlag == TRUE)
95                 {
96                         bkColor = m_master.viewproperty.selectBackColor;
97
98                 }
99                 else  
100                 {
101
102
103                         if(comment.viewData.backColor != CChatData::ViewData::INIT_COLOR){
104                         
105                                 bkColor = comment.viewData.backColor;
106
107                         }else if(comment.listenerData->originBkFlag == TRUE){
108
109                                 bkColor = comment.listenerData->bkColor;
110
111
112                         } else {
113
114                                 bkColor = m_master.viewproperty.backColor;
115
116
117
118                         }
119                 }
120
121
122                 chatDispCtrl.SetBackgroundColor(bkColor);
123
124                 chatDispCtrl.DeferWindowPos(hdwp,NULL,chatRect.left,chatRect.top,chatRect.right - chatRect.left ,chatRect.bottom - chatRect.top, SWP_NOZORDER | SWP_SHOWWINDOW);
125
126                 return;
127         }
128
129         UINT_PTR CChatChildCtrls::GetCtrlCount(){
130
131                 return 1;
132         }
133
134
135
136         ///
137         ///\83R\83\93\83X\83g\83\89\83N\83^
138         ///
139         CChatChildCtrlsList::CChatChildCtrlsList(CCommentView &hMaster):m_hMaster(hMaster){
140                 
141                 return;
142         }
143
144
145
146         ///
147         ///\83R\83\93\83g\83\8d\81[\83\8b\82ð\95\\8e¦
148         ///
149         VOID CChatChildCtrlsList::ShowCntrls(){
150
151
152                 
153
154                 
155
156                 if(m_hMaster.commentlist.Size() > 0){
157
158
159
160                         RECT headerRect;
161                         RECT tmpRect;
162                         RECT listRect;
163                         m_hMaster.m_commentListWindow.GetClientRect(&listRect);
164                         m_hMaster.m_header.GetItemRect(CCommentView::COMMENT,&headerRect);
165                         headerRect.top = 0;
166                         headerRect.bottom = 0;
167                         
168                         UINT_PTR counter = 0;
169                         INT_PTR heightSum =0;
170
171                         auto ctrlsBegin = m_list.begin();
172                         auto ctrlsEnd = m_list.end();
173                         auto chatDataBegin = m_hMaster.commentlist.GetShortCut();
174                         auto chatDataEnd = m_hMaster.commentlist.end();
175                         auto chatDataTmp = chatDataBegin;
176                         for(;chatDataBegin != chatDataEnd && heightSum < listRect.bottom;++chatDataBegin){
177                                 m_hMaster.m_commentListWindow.CalcItemHeight(*chatDataBegin);
178                                 counter++;
179                                 heightSum += chatDataBegin->viewData.height;
180                         } 
181
182                         
183                 
184                         chatDataBegin = chatDataTmp;
185                         heightSum = 0;
186                         HDWP hdwp = ::BeginDeferWindowPos(CChatChildCtrls::GetCtrlCount() * (counter > m_list.size() ? counter : m_list.size()));
187                         for(;  chatDataBegin != chatDataEnd && counter > 0 ;++ctrlsBegin,++chatDataBegin,--counter){
188                         
189                                 
190                                 tmpRect = headerRect;
191                                 tmpRect.top += heightSum;
192                                 tmpRect.bottom += heightSum + chatDataBegin->viewData.height;
193
194                                 if(ctrlsBegin == ctrlsEnd)ctrlsBegin = Extend();
195
196                                 ctrlsBegin->SetCtrl(hdwp,tmpRect,*chatDataBegin,m_hMaster.viewproperty.commentFoldingFlag);
197
198                                 heightSum = tmpRect.bottom;
199
200                                 
201                         }
202                 
203                         for(;ctrlsBegin != ctrlsEnd;++ctrlsBegin){
204
205                                 ctrlsBegin->Hide(hdwp);
206                         }
207
208                         ::EndDeferWindowPos(hdwp);
209                 }
210                 
211
212
213                 return;
214         }
215
216
217
218         VOID CChatChildCtrlsList::AllHide(){
219
220                 auto begin =m_list.begin();
221                 auto end = m_list.end();
222
223                 HDWP hdwp = ::BeginDeferWindowPos(CChatChildCtrls::GetCtrlCount() * m_list.size());
224                 for(;begin != end;++begin){
225                         begin->Hide(hdwp);
226                 }
227                 ::EndDeferWindowPos(hdwp);
228
229         }
230
231         ///
232         ///\8ag\92£\8f\88\97\9d
233         ///
234         CChatChildCtrlsList::iterator CChatChildCtrlsList::Extend(){
235
236                 
237                 CChatChildCtrls ctrls(m_hMaster);
238                 
239                 m_list.push_back(ctrls);
240                 m_list.back().Create();
241                 auto ite = (--m_list.end());
242         
243                 return ite;
244         }
245
246
247         //
248         //\83R\83\81\83\93\83g\83r\83\85\81[\83N\83\89\83X\83\81\83\\83b\83h
249         ///////////////////////////////////////////////////////
250
251         CCommentView::CCommentView(CNicoLiveStream &stream):
252         m_commentListWindow(*this),
253         stream(stream)
254
255         ,chatChildCtrlsList(*this)
256
257         {
258
259                 LOGFONT lf = {0};
260                 lf.lfHeight = 10;
261                 lf.lfCharSet = SHIFTJIS_CHARSET;
262
263
264                 hHeaderFontNew = CreateFontIndirect(&lf);
265
266
267                 return;
268
269         }
270
271         CCommentView::~CCommentView(){
272
273
274                 DeleteObject(hHeaderFontNew);
275
276                 return;
277         }
278
279
280
281
282         VOID CCommentView::OnConnect(){
283                 m_commentListWindow.SetRedraw(FALSE);
284                 m_commentListWindow.ResetViewSellHeight();
285
286                 chatChildCtrlsList.AllHide();
287
288
289                 commentlist.OnConnect();
290
291                 SCROLLINFO vScrollInfo = {0};
292                 vScrollInfo.cbSize = sizeof(vScrollInfo);
293                 vScrollInfo.fMask = SIF_ALL;
294
295                 this->SetScrollInfo(SB_VERT,&vScrollInfo,FALSE);
296
297                 m_commentListWindow.SetRedraw(TRUE);
298                 m_commentListWindow.Invalidate();
299
300
301
302         }
303
304
305         UINT_PTR CCommentView::GetColumnHolSizeSum(){
306
307                 INT_PTR nMin = 0;
308                 INT_PTR nMax = 0;
309                 this->GetScrollRange(SB_HORZ,&nMin,&nMax);
310
311                 return nMax;
312         }
313
314         VOID CCommentView::SetProperty(CommentViewProperty &setProperty){
315
316                 viewproperty = setProperty;
317                 m_commentListWindow.OnSetProperty();
318                 
319                 return;
320         }
321
322         CommentViewProperty &CCommentView::GetProperty(){
323
324                 return viewproperty;
325
326         }
327
328
329
330
331
332         HWND CCommentView::Create(HWND hWndParent){
333
334
335
336                 HWND rslt = __super::Create(hWndParent,0,commentViewConstant::NLITE_COMMENTVIEW,WS_VISIBLE | WS_CHILD | WS_VSCROLL | WS_HSCROLL | WS_BORDER,0,commentViewConstant::MENU_OR_ID);
337
338                 PAINTSTRUCT ps;
339                 HDC hdc = m_header.BeginPaint(&ps);
340                 SIZE size;
341
342                 HFONT hOld = (HFONT)SelectObject(hdc,hHeaderFontNew);
343
344                 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ñ")};
345                 UINT_PTR holizenSize[] = {0,0,100,0,0};
346
347                 for(UINT_PTR index = 0;index < ARRAY_LENGTH(columns) ;++index){
348
349                         GetTextExtentPoint32(hdc , columns[index] , _tcslen(columns[index]) , &size);
350                         UINT_PTR holsize = holizenSize[index] + size.cx + 15;
351                         holizenSize[index] = viewproperty.headerholSize[index] >= 0 ? viewproperty.headerholSize[index] : holsize;
352                 }
353
354                 SelectObject(hdc,hOld);
355
356                 m_header.EndPaint(&ps);
357
358
359                 HEADERSINFO headersinfo = {columns,holizenSize,ARRAY_LENGTH(columns)};
360
361                 AddHeader(&headersinfo);
362
363                 m_header.SetOrderArray(ARRAY_LENGTH(viewproperty.headerOrderArray),viewproperty.headerOrderArray);
364
365                 
366                 
367
368                 return rslt;
369         }
370
371
372
373
374         LRESULT CCommentView::OnHeaderEndTrack(LPNMHDR lParam){
375
376
377                 if(lParam->hwndFrom == m_header.m_hWnd){
378
379
380                         auto begin = commentlist.begin();
381
382                         auto end = commentlist.end();
383
384                         for(;begin != end;++begin){
385
386                                 begin->viewData.height = 0;
387
388                         }
389
390                         m_commentListWindow.SetRedraw(FALSE);
391                         SCROLLINFO vScrollInfo = {0};
392                         vScrollInfo.fMask = SIF_PAGE | SIF_POS | SIF_RANGE;
393
394                         this->GetScrollInfo(SB_VERT,&vScrollInfo);
395                         vScrollInfo.nPage = m_commentListWindow.CalcScrollPage(vScrollInfo.nMax);
396                         vScrollInfo.fMask = SIF_PAGE;
397                         this->SetScrollInfo(SB_VERT,&vScrollInfo);
398
399                         BOOL scrollFlag = vScrollInfo.nPos + (int)vScrollInfo.nPage + 1>= vScrollInfo.nMax;
400                         UINT_PTR commentCount = commentlist.Size();
401                         LPNMHEADER  lpNmHdr = (LPNMHEADER )lParam;
402
403                         m_header.SetItem(lpNmHdr->iItem,lpNmHdr->pitem);
404
405
406
407
408
409
410
411                         if(scrollFlag == TRUE){
412
413                                 this->m_commentListWindow.SendMessageW(WM_VSCROLL,MAKELONG(SB_BOTTOM,0),0);
414                         }
415
416                         INT_PTR itemCount = m_header.GetItemCount();
417                         RECT itemSizeRect;
418
419                         INT_PTR nMax = 0;
420                         for(INT_PTR itemIndex = 0;itemIndex < itemCount;itemIndex++){
421                                 m_header.GetItemRect(itemIndex,&itemSizeRect);
422                                 nMax += itemSizeRect.right - itemSizeRect.left;
423
424                         }
425                         INT_PTR nMin = 0;
426                         this->SetScrollRange(SB_HORZ,nMin,nMax,TRUE);
427                         DecisionHorzSize();
428
429
430                         
431
432                         m_commentListWindow.SetRedraw(TRUE);
433                         
434                         m_commentListWindow.Invalidate();
435                         this->m_commentListWindow.SendMessage(UM_COMMENTVIEW_SETCTRL,NULL,NULL);
436
437                 }
438
439                 return 0;
440         }
441
442         VOID CCommentView::OnChatReceve(NicoLiveChat_P chat,UINT_PTR commnetCountSum){
443
444
445                 commentlist.OnChatReceve(chat,commnetCountSum,this->m_commentListWindow);
446
447                 return;
448         }
449
450
451         VOID CCommentView::OnChatReceveSettle(UINT_PTR chatNo,UINT_PTR commentCountSum){
452
453
454                 SCROLLINFO vScrollInfo = {0};
455
456
457                 vScrollInfo.fMask = SIF_ALL;
458
459                 this->GetScrollInfo(SB_VERT,&vScrollInfo);
460                 BOOL scrollFlag = vScrollInfo.nPos + (int)vScrollInfo.nPage >= vScrollInfo.nMax;
461
462                 vScrollInfo.cbSize = sizeof(vScrollInfo);
463                 vScrollInfo.nMax = commentCountSum;
464                 vScrollInfo.fMask = SIF_RANGE | SIF_PAGE;
465                 vScrollInfo.nPage = m_commentListWindow.CalcScrollPage(vScrollInfo.nMax);
466
467
468                 this->SetScrollInfo(SB_VERT,&vScrollInfo,FALSE);
469
470
471
472
473                 if(scrollFlag == TRUE){
474                         this->PostMessage(WM_VSCROLL,MAKEWORD(SB_BOTTOM,0),0);
475                 }
476
477
478                 if(vScrollInfo.nPos + static_cast<INT_PTR>(vScrollInfo.nPage) >= vScrollInfo.nMax - static_cast<INT_PTR>(vScrollInfo.nPage)){
479                         m_commentListWindow.Invalidate();
480
481                         this->PostMessage(UM_COMMENTVIEW_SETCTRL,NULL,NULL);
482                 }
483
484                 return;
485         }
486
487         static UCHAR getrgb(){
488
489                 UCHAR rgb = 192 + rand() % 64;
490                 return rgb;
491         }
492
493
494
495
496
497
498
499
500
501
502
503         LRESULT CCommentView::OnSize(UINT wParam,SIZE lParam){
504                 ChangeSize(lParam);
505
506                 return 0;
507         }
508
509
510         VOID CCommentView::ChangeSize(const SIZE& client){
511
512                 SCROLLINFO hScrollInfo = {0};
513                 hScrollInfo.cbSize = sizeof(hScrollInfo);
514                 hScrollInfo.fMask = SIF_PAGE;
515                 hScrollInfo.nPage = client.cx;
516
517                 this->SetScrollInfo(SB_HORZ,&hScrollInfo);
518                 hScrollInfo.fMask = SIF_ALL;
519                 this->GetScrollInfo(SB_HORZ,&hScrollInfo);
520
521
522                 HDWP hDwp = BeginDeferWindowPos(2);
523
524
525                 INT_PTR movePos =  -1 * hScrollInfo.nPos;
526
527                 m_header.DeferWindowPos(hDwp,m_header.m_hWnd,movePos,0,0,0,SWP_NOSIZE | SWP_NOZORDER);
528                 m_commentListWindow.DeferWindowPos(hDwp,m_commentListWindow.m_hWnd,movePos,commentViewConstant::HEADER_HAIGHT,::GetSystemMetrics(SM_CXFULLSCREEN),client.cy - commentViewConstant::HEADER_HAIGHT,SWP_NOZORDER);         
529
530                 EndDeferWindowPos(hDwp);
531
532
533                 RECT bkRect;
534                 RECT headerRectSize;
535                 m_header.GetWindowRect(&headerRectSize);
536                 bkRect.left = headerRectSize.right - headerRectSize.left - hScrollInfo.nPos;
537                 bkRect.top = 0;
538                 bkRect.right = client.cx ;
539                 bkRect.bottom = client.cy;
540
541
542                 return;
543         }
544
545
546         LRESULT CCommentView::OnEraseBkgnd(HDC wParam){
547
548                 return TRUE;
549         }
550
551
552         VOID CCommentView::OnDestroy(){
553                 m_header.GetOrderArray(ARRAY_LENGTH(viewproperty.headerOrderArray),viewproperty.headerOrderArray);
554                 INT_PTR headerItemcount = m_header.GetItemCount();
555                 RECT headerItemRect;
556                 for(INT_PTR itemindex = 0;itemindex < headerItemcount;itemindex++){
557
558                         m_header.GetItemRect(itemindex,&headerItemRect);
559                         viewproperty.headerholSize[itemindex] = headerItemRect.right - headerItemRect.left;
560                 }
561                 commentlist.OnDestroy();
562                 m_header.DestroyWindow();
563                 m_commentListWindow.DestroyWindow();
564                 return;
565
566         }
567
568         LRESULT CCommentView::OnHeaderEndDrag(LPNMHDR lParam){
569
570                 if(lParam->hwndFrom == m_header.m_hWnd){
571                         
572                         LPNMHEADER pNMHeader = (LPNMHEADER) lParam; 
573                         this->m_header.SetItem(pNMHeader->iItem,pNMHeader->pitem);
574                         
575                         m_commentListWindow.Invalidate();
576                         this->m_commentListWindow.SendMessage(UM_COMMENTVIEW_SETCTRL,NULL,NULL);
577                         
578
579                 }
580
581                 return 0;
582         }
583         /*
584         LRESULT CCommentView::OnHeaderItemChanged(LPNMHDR lParam){
585
586                 if(lParam->hwndFrom == m_header.m_hWnd){
587                         
588
589                         m_commentListWindow.Invalidate();
590                         this->m_commentListWindow.SendMessage(UM_COMMENTVIEW_SETCTRL,NULL,NULL);
591                         
592
593                 }
594
595                 return 0;
596         }
597         */
598         VOID CCommentView::OnHScroll(INT_PTR loWParam,SHORT hiWParam,HWND lParam){
599
600
601                 INT_PTR dy;
602                 SCROLLINFO hScrollInfo = {0};
603                 hScrollInfo.cbSize = sizeof(hScrollInfo);
604                 hScrollInfo.fMask = SIF_ALL;
605                 this->GetScrollInfo(SB_HORZ,&hScrollInfo);
606                 switch(loWParam){
607
608                 case SB_THUMBPOSITION:
609                 case SB_THUMBTRACK:
610                         dy = hiWParam - hScrollInfo.nPos;
611                         break;
612
613                 case SB_LINELEFT:
614                 case SB_PAGELEFT:
615
616                         dy = -1 * hScrollInfo.nPage;
617
618                         break;
619
620                 case SB_LINERIGHT:
621                 case SB_PAGERIGHT:
622
623                         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;
624
625                         break;
626
627                 default:
628                         dy = 0;
629                         break;
630
631                 }
632
633                 dy = max(-1 * hScrollInfo.nPos, min(dy, hScrollInfo.nMax - hScrollInfo.nPos));
634
635
636                 if(dy != 0){
637                         hScrollInfo.nPos += dy;
638                         INT_PTR moveRange = -(hScrollInfo.nPos);
639
640                         HDWP hDwp = BeginDeferWindowPos(2);
641
642                         m_header.DeferWindowPos(hDwp,m_header.m_hWnd,moveRange,0,0,0,SWP_NOSIZE | SWP_NOZORDER);
643                         m_commentListWindow.DeferWindowPos(hDwp,m_commentListWindow.m_hWnd,moveRange,commentViewConstant::HEADER_HAIGHT,0,0,SWP_NOSIZE | SWP_NOZORDER);         
644
645                         EndDeferWindowPos(hDwp);
646
647
648                         this->SetScrollInfo(SB_HORZ,&hScrollInfo);
649                 }
650
651                 return;
652         }
653
654
655         VOID CCommentView::OnVScroll(INT_PTR loWParam,SHORT hiWParam,HWND lParam){
656
657                 INT_PTR dy;
658                 SCROLLINFO vScrollInfo = {0};
659                 vScrollInfo.fMask = SIF_ALL;
660
661
662                 this->GetScrollInfo(SB_VERT,&vScrollInfo);
663
664                 switch(loWParam){
665
666
667                 case SB_THUMBPOSITION:
668                 case SB_THUMBTRACK:
669
670                         dy = hiWParam - vScrollInfo.nPos;
671
672                         break;
673
674                 case SB_LINEUP:
675
676                         dy = -1;
677                         break;
678
679                 case SB_LINEDOWN:
680
681                         dy = 1;
682
683                         break;
684
685                 case SB_PAGEUP:
686
687                         dy = -1 * vScrollInfo.nPage;
688
689                         break;
690
691                 case SB_PAGEDOWN:
692
693                         dy = vScrollInfo.nPage;
694
695                         break;
696
697
698                 case SB_TOP:
699
700                         dy = -vScrollInfo.nPos;
701
702                         break;
703
704                 case SB_BOTTOM:
705
706                         dy = vScrollInfo.nMax;
707
708                         break;
709
710                 default:
711
712                         dy = 0;
713
714                         break;
715
716                 }
717
718
719         
720
721                 if(dy != 0){
722
723                         vScrollInfo.nPos += dy;
724                         //              viewStartHeight = vScrollInfo.nPos;
725                         this->SetScrollPos(SB_VERT,vScrollInfo.nPos);
726                         this->commentlist.SetShortCut(this->GetScrollPos(SB_VERT));
727                         //this->SetScrollInfo(SB_VERT,&vScrollInfo);
728                         this->UpdateWindow();
729                         
730                         m_commentListWindow.Invalidate();
731                         this->m_commentListWindow.SendMessage(UM_COMMENTVIEW_SETCTRL,NULL,NULL);        
732                 }
733
734
735
736                 return;
737         }
738
739         LRESULT CCommentView::OnCreate(LPCREATESTRUCT lpcs){
740                 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);
741                 m_commentListWindow.Create(m_hWnd,0,commentViewConstant::NLITE_COMMENTLISTWINDOW,WS_CHILD | WS_VISIBLE  | WS_CLIPCHILDREN  , 0,commentViewConstant::LISTWINDOW);
742
743
744
745                 return 0;
746         }
747
748         VOID CCommentView::AddHeader(LPHEADERSINFO infos){
749
750
751                 m_header.SetFont(hHeaderFontNew);
752
753                 HDITEM item;
754                 item.mask = HDI_FORMAT | HDI_TEXT | HDI_WIDTH;
755                 item.fmt = HDF_CENTER | HDF_STRING;
756
757
758                 for(UINT_PTR index = 0;index < infos->count ;++index){
759
760                         item.pszText = infos->columns[index];
761
762                         item.cxy =  infos->holizensize[index];
763                         m_header.AddItem(&item);
764                 }
765
766                 RECT itemRect;
767                 INT_PTR nMax = 0;
768                 UINT_PTR itemCount = m_header.GetItemCount();
769                 for(UINT_PTR u_index = 0;u_index < itemCount;++u_index){
770
771                         m_header.GetItemRect(u_index,&itemRect);
772                         nMax += itemRect.right - itemRect.left;
773
774                 }
775
776                 this->SetScrollRange(SB_HORZ,0,nMax,TRUE);
777
778                 DecisionHorzSize();
779                 return;
780         }
781
782         VOID CCommentView::DecisionHorzSize(){
783
784                 HDWP hWindowPosInfo = BeginDeferWindowPos(2);
785                 RECT bkWindowRect;
786                 this->GetClientRect(&bkWindowRect);
787                 m_header.DeferWindowPos(hWindowPosInfo,m_header.m_hWnd,0,0,::GetSystemMetrics(SM_CXFULLSCREEN),commentViewConstant::HEADER_HAIGHT,SWP_NOZORDER | SWP_NOMOVE);
788                 m_commentListWindow.DeferWindowPos(hWindowPosInfo,m_header.m_hWnd,0,0,::GetSystemMetrics(SM_CXFULLSCREEN),bkWindowRect.bottom - commentViewConstant::HEADER_HAIGHT,SWP_NOZORDER | SWP_NOMOVE);
789
790                 EndDeferWindowPos(hWindowPosInfo);
791
792                 return;
793         }
794
795
796
797
798         //
799         //\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
800         ////////////////////////////////////////////////////////////////////
801
802         CCommentListWindow::CCommentListWindow(CCommentView &in_self):
803         self(in_self),
804         viewSellHeight(0)
805         {
806                 CFontHandle font = ::AtlGetDefaultGuiFont();
807                 LOGFONT logfont;
808                 font.GetLogFont(&logfont);
809                 logfont.lfUnderline = TRUE;
810                 
811                 linkFont.CreateFontIndirect(&logfont);
812         }
813
814         CCommentListWindow::~CCommentListWindow(){
815         }
816
817         VOID CCommentListWindow::OnSetProperty(){
818
819                 if(IsWindow() == TRUE)this->SetRedraw(FALSE);
820
821                 if(collLinePen.IsNull() == FALSE)collLinePen.DeleteObject();
822                 if(normalSellLinePen.IsNull() == FALSE)normalSellLinePen.DeleteObject();
823                 if(normalBkBrush.IsNull() == FALSE)normalBkBrush.DeleteObject();
824                 if(selectSellLinePen.IsNull() ==FALSE)selectSellLinePen.DeleteObject();
825                 if(selectBkBrush.IsNull() == FALSE)selectBkBrush.DeleteObject();
826
827                 collLinePen.CreatePen(PS_SOLID,1,self.viewproperty.colLineColor);
828                 normalSellLinePen.CreatePen(PS_SOLID,1,self.viewproperty.normalSellLineColor);
829                 normalBkBrush.CreateSolidBrush(self.viewproperty.backColor);
830                 selectSellLinePen.CreatePen(PS_SOLID,1,self.viewproperty.selectSellLineColor);
831                 selectBkBrush.CreateSolidBrush(self.viewproperty.selectBackColor);
832
833
834                 if(IsWindow() == TRUE)this->SetRedraw(TRUE);
835         }
836
837
838         VOID CCommentListWindow::OnPaint(HDC in_hdc){
839
840
841
842                 RECT windowRect;
843                 RECT listRect = {0};
844                 RECT clientRect;
845
846                 self.GetClientRect(&clientRect);
847                 clientRect.bottom -= commentViewConstant::HEADER_HAIGHT;
848
849                 this->GetWindowRect(&windowRect);
850                 windowRect.right -= windowRect.left;
851                 windowRect.bottom -= windowRect.top;
852                 windowRect.left = 0;
853                 windowRect.top = 0;
854
855
856                 CPaintDC pdc(*this);
857
858                 {
859                         CMemoryDC mdc(pdc,windowRect);
860                         mdc.SelectFont(AtlGetDefaultGuiFont());
861
862
863                         CCommentList &commentList = self.commentlist;
864
865                         BOOL selectFlag = FALSE;
866                         CCommentList::iterator selectData;
867                         RECT selectRect = {0};
868         
869
870
871                         if(commentList.Size() > 0){
872
873                                 listRect = windowRect;
874                                 listRect.right = self.GetColumnHolSizeSum();            
875
876                                 CCommentList::iterator chatData = commentList.GetShortCut();
877
878                         
879                                 
880                                 
881                                 mdc.FillRect(&listRect,this->normalBkBrush);
882                                 
883                                 CCommentList::iterator endData = commentList.end();
884                                 listRect.bottom = 0;
885                                 
886                                 RECT headerRects[COMMENTVIEW_HEADERITEMSIZE];
887                                 RECT colLineRects[COMMENTVIEW_HEADERITEMSIZE];
888                                 RECT selectHeaderRects[COMMENTVIEW_HEADERITEMSIZE];
889                                 
890                                 self.m_header.GetItemRect(CCommentView::NO,&headerRects[CCommentView::NO]);
891                                 self.m_header.GetItemRect(CCommentView::USERNAME,&headerRects[CCommentView::USERNAME]);
892                                 self.m_header.GetItemRect(CCommentView::COMMENT,&headerRects[CCommentView::COMMENT]);
893                                 self.m_header.GetItemRect(CCommentView::TIME,&headerRects[CCommentView::TIME]);
894                                 self.m_header.GetItemRect(CCommentView::INFO,&headerRects[CCommentView::INFO]);
895
896                                 memcpy(colLineRects,headerRects,sizeof(headerRects));
897
898                                 
899                                 
900                                 
901                 
902                                 headerRects[CCommentView::NO].left += SELL_SPACE_LENGTH;
903                                 headerRects[CCommentView::USERNAME].left += SELL_SPACE_LENGTH;
904                                 headerRects[CCommentView::COMMENT].left += SELL_SPACE_LENGTH;
905                                 headerRects[CCommentView::TIME].left += SELL_SPACE_LENGTH;
906                                 headerRects[CCommentView::INFO].left += SELL_SPACE_LENGTH;
907
908                                 headerRects[CCommentView::NO].right -= SELL_SPACE_LENGTH;
909                                 headerRects[CCommentView::USERNAME].right -= SELL_SPACE_LENGTH;
910                                 headerRects[CCommentView::COMMENT].right -= SELL_SPACE_LENGTH;
911                                 headerRects[CCommentView::TIME].right -= SELL_SPACE_LENGTH;
912                                 headerRects[CCommentView::INFO].right -= SELL_SPACE_LENGTH;
913
914                                 headerRects[CCommentView::NO].top = SELL_SPACE_LENGTH;
915                                 headerRects[CCommentView::USERNAME].top = SELL_SPACE_LENGTH;
916                                 headerRects[CCommentView::COMMENT].top = SELL_SPACE_LENGTH;
917                                 headerRects[CCommentView::TIME].top = SELL_SPACE_LENGTH;
918                                 headerRects[CCommentView::INFO].top = SELL_SPACE_LENGTH;
919
920                                 headerRects[CCommentView::NO].bottom = SELL_SPACE_LENGTH;
921                                 headerRects[CCommentView::USERNAME].bottom = SELL_SPACE_LENGTH;
922                                 headerRects[CCommentView::COMMENT].bottom = SELL_SPACE_LENGTH;
923                                 headerRects[CCommentView::TIME].bottom = SELL_SPACE_LENGTH;
924                                 headerRects[CCommentView::INFO].bottom = SELL_SPACE_LENGTH;
925
926                                 INT_PTR listRectTop = listRect.top;
927                                 for(;chatData != endData && listRect.top < clientRect.bottom;++chatData){
928                                         CalcItemHeight(*chatData);
929
930 //                                      dumpln(TEXT("height:%d"),chatData->viewData.height);
931                                         listRect.bottom += chatData->viewData.height;
932
933                                         headerRects[CCommentView::NO].top = listRect.top + SELL_SPACE_LENGTH;
934                                         headerRects[CCommentView::USERNAME].top = listRect.top + SELL_SPACE_LENGTH;
935                                         headerRects[CCommentView::COMMENT].top = listRect.top + SELL_SPACE_LENGTH;
936                                         headerRects[CCommentView::TIME].top = listRect.top + SELL_SPACE_LENGTH;
937                                         headerRects[CCommentView::INFO].top = listRect.top + SELL_SPACE_LENGTH;
938
939                                         headerRects[CCommentView::NO].bottom = listRect.bottom - SELL_SPACE_LENGTH;
940                                         headerRects[CCommentView::USERNAME].bottom = listRect.bottom - SELL_SPACE_LENGTH;
941                                         headerRects[CCommentView::COMMENT].bottom = listRect.bottom - SELL_SPACE_LENGTH;
942                                         headerRects[CCommentView::TIME].bottom = listRect.bottom - SELL_SPACE_LENGTH;
943                                         headerRects[CCommentView::INFO].bottom = listRect.bottom - SELL_SPACE_LENGTH;
944
945                                         if(chatData->viewData.selectFlag == TRUE){
946                                                 selectFlag = TRUE;
947                                                 selectData = chatData;
948                                                 selectRect = listRect;
949                                                 memcpy(selectHeaderRects,headerRects,sizeof(headerRects));
950                                         } else {
951
952                                                 
953
954
955                                                 this->DrawItem(mdc,listRect,headerRects,*chatData);
956                                         }
957
958
959                                         listRect.top = listRect.bottom;
960                                 }
961
962                                 viewSellHeight = listRect.bottom;
963
964
965
966                                 if(selectFlag == TRUE){
967                                         this->DrawItem(mdc,selectRect,selectHeaderRects,*selectData);
968                                 }
969
970                                         //\8d\80\96Ú\82Ì\8fc\90ü\82ð\95`\89æ
971                                 mdc.SelectPen(collLinePen);
972                                 mdc.MoveTo(colLineRects[CCommentView::NO].right,listRectTop);
973                                 mdc.LineTo(colLineRects[CCommentView::NO].right,listRect.bottom);
974                                 mdc.MoveTo(colLineRects[CCommentView::USERNAME].right,listRectTop);
975                                 mdc.LineTo(colLineRects[CCommentView::USERNAME].right,listRect.bottom);
976                                 mdc.MoveTo(colLineRects[CCommentView::COMMENT].right,listRectTop);
977                                 mdc.LineTo(colLineRects[CCommentView::COMMENT].right,listRect.bottom);
978                                 mdc.MoveTo(colLineRects[CCommentView::TIME].right,listRectTop);
979                                 mdc.LineTo(colLineRects[CCommentView::TIME].right,listRect.bottom);
980                                 mdc.MoveTo(colLineRects[CCommentView::INFO].right,listRectTop);
981                                 mdc.LineTo(colLineRects[CCommentView::INFO].right,listRect.bottom);
982
983                         }
984                         windowRect.left = listRect.right;
985                         mdc.FillRect(&windowRect,(HBRUSH)::GetStockObject(GRAY_BRUSH));
986
987
988
989
990                 }
991                 
992
993                 
994
995                 return;
996         }
997
998
999         LRESULT CCommentListWindow::OnSetCtrol(UINT uMsg,WPARAM wparam,LPARAM lparam){
1000
1001
1002
1003                 self.chatChildCtrlsList.ShowCntrls();
1004
1005
1006
1007                 return 0;
1008         }
1009
1010         VOID CCommentListWindow::OnSize(UINT wParam, _WTYPES_NS::CSize &windowSize){
1011
1012
1013                 SCROLLINFO vScrollInfo = {0};
1014                 vScrollInfo.fMask = SIF_ALL;
1015
1016
1017                 self.GetScrollInfo(SB_VERT,&vScrollInfo);
1018                 BOOL scrollFlag = (UINT)(vScrollInfo.nPage + vScrollInfo.nPos + 1) >= (UINT)vScrollInfo.nMax;
1019                 vScrollInfo.nPage = CalcScrollPage(vScrollInfo.nMax);
1020
1021                 vScrollInfo.fMask = SIF_PAGE;
1022                 self.SetScrollInfo(SB_VERT,&vScrollInfo);
1023
1024
1025
1026                 if(scrollFlag == TRUE){
1027                         self.SendMessageW(WM_VSCROLL,MAKELONG(SB_BOTTOM,0),0);
1028                 }
1029
1030                 this->Invalidate();
1031                 this->SendMessage(UM_COMMENTVIEW_SETCTRL,NULL,NULL);
1032
1033                 return;
1034         }
1035
1036
1037         UINT_PTR CCommentListWindow::CalcScrollPage(UINT_PTR nMax){
1038
1039                 RECT clientRect;
1040                 INT_PTR rslt = 0;
1041                 LONG height = 0;
1042                 this->GetClientRect(&clientRect);
1043
1044                 SCROLLINFO vScrollInfo = {0};
1045                 if(self.commentlist.empty() != TRUE){
1046
1047                         CCommentList::reverse_iterator rbegin = self.commentlist.rbegein();
1048                         CCommentList::reverse_iterator rend = self.commentlist.rend();
1049                         for(;rbegin != rend;++rbegin){
1050                                 CalcItemHeight(*rbegin);
1051                                 height += rbegin->viewData.height;
1052                                 rslt++;
1053                                 if(height > clientRect.bottom)goto overclientrect;
1054
1055                         }
1056                 }
1057                 /*
1058                 vScrollInfo.fMask = SIF_RANGE;
1059                 self.GetScrollInfo(SB_VERT,&vScrollInfo);
1060                 */
1061                 rslt = nMax+ 1;
1062
1063
1064 overclientrect:
1065
1066                 return rslt;
1067         }
1068
1069         VOID CCommentListWindow::DrawItem(CDC &dc,const RECT &rc,const RECT *headerRect,CChatData &chatData){
1070
1071
1072                 RECT noViewRect = headerRect[CCommentView::NO];                                                                         //\83R\83\81\94Ô\95\\8e¦\97Ì\88æ
1073                 RECT userNameViewRect = headerRect[CCommentView::USERNAME];                                                     //\83\86\81[\83U\96¼\95\\8e¦\97Ì\88æ
1074                 RECT chatViewRect = headerRect[CCommentView::COMMENT];                                                          //\83R\83\81\83\93\83g\95\\8e¦\97Ì\88æ
1075                 RECT timeViewRect = headerRect[CCommentView::TIME];                                                                     //\8e\9e\8aÔ\95\\8e¦\97Ì\88æ  
1076                 RECT infoViewRect  = headerRect[CCommentView::INFO];                                                                    //\83R\83\81\83\93\83g\8fî\95ñ\95\\8e¦\97Ì\88æ
1077
1078
1079                 //
1080                 //\83R\83\81\83\93\83g\8e\9e\8aÔ\95\\8e¦\97p\95\8e\9a\97ñ\8dì\90¬
1081                 //
1082                 time_t chatTime = (time_t)difftime(chatData.date,self.stream.GetStartTime());
1083
1084
1085                 BOOL beforeStartFlag = chatTime < 0 ? TRUE : FALSE;
1086                 TCHAR noString[sizeof(chatData.no) * 8]; 
1087                 TCHAR dateString[LENGTH_16];
1088                 if(chatData.no != 0)_stprintf(noString,TEXT("%u"),chatData.no);
1089                 else _tcscpy(noString,TEXT(""));
1090                 CNLiteString timeFormat;
1091
1092
1093                 if(beforeStartFlag == TRUE){
1094
1095                         timeFormat = TEXT("-");
1096                         chatTime = -chatTime;
1097                 }
1098                 tm ct = *gmtime(&chatTime);
1099                 if(ct.tm_hour != 0 ){
1100
1101                         timeFormat += TEXT("%H:%M:%S");
1102
1103                 } else {
1104
1105                         timeFormat += TEXT("%M:%S");
1106                 }
1107
1108                 _tcsftime(dateString,ARRAY_LENGTH(dateString),timeFormat,&ct);
1109
1110
1111                 COLORREF bkColor;                                                                                                       //\94w\8ci\90F
1112                 CPen originSellLinePen;                                                                                                 //\98g\90ü\95`\89æ\97p\83y\83\93
1113                 CBrush originBkBrush;                                                                                                           //\94w\8ci\95`\89æ\97p\83u\83\89\83V
1114                 
1115                 //\91I\91ð\8fó\91Ô\82©\83`\83F\83b\83N
1116                 if (chatData.viewData.selectFlag == TRUE)
1117                 {
1118                         bkColor = self.viewproperty.selectBackColor;
1119                         
1120                         dc.SelectBrush(this->selectBkBrush);
1121                         dc.SelectPen(this->selectSellLinePen);
1122                 }
1123                 else  
1124                 {
1125
1126                         if(chatData.viewData.sellLineColor == CChatData::ViewData::INIT_COLOR){
1127                                 dc.SelectPen(this->normalSellLinePen);
1128
1129                         } else {
1130
1131                                 originSellLinePen.CreatePen(PS_SOLID,1,chatData.viewData.sellLineColor);
1132                                 dc.SelectPen(originSellLinePen);
1133                         }
1134
1135                         
1136
1137                         if(chatData.viewData.backColor != CChatData::ViewData::INIT_COLOR || chatData.listenerData->originBkFlag == TRUE){
1138                         
1139                                 if(chatData.viewData.backColor != CChatData::ViewData::INIT_COLOR){
1140                                         bkColor = chatData.viewData.backColor;
1141                                         originBkBrush.CreateSolidBrush(chatData.viewData.backColor);
1142                                 
1143                                 }else if(chatData.listenerData->originBkFlag == TRUE){
1144
1145                                         bkColor = chatData.listenerData->bkColor;
1146                                         originBkBrush.CreateSolidBrush(chatData.listenerData->bkColor);
1147                                         
1148                                 }
1149
1150                                 dc.SelectBrush(originBkBrush);
1151                         } else {
1152
1153                                 bkColor = self.viewproperty.backColor;
1154                                 dc.SelectBrush(this->normalBkBrush);
1155                                 dc.SelectBrush(this->normalBkBrush);
1156
1157
1158                         }
1159                 }
1160                 
1161                 //\94w\8ci\82Æ\98g\90ü\82ð\95`\89æ
1162                 
1163                 
1164                 dc.Rectangle(rc.left,rc.top  - 1,rc.right ,rc.bottom + 1);
1165                 dc.SetBkColor(bkColor);
1166                 
1167
1168                 //\95`\89æ\83T\83C\83Y\82ð\8cv\8eZ
1169
1170
1171                 
1172                 
1173                 
1174                 dc.SelectFont(linkFont);
1175                 dc.SetTextColor(self.viewproperty.linkStringColor);
1176                 //\83e\83L\83X\83g\95`\89æ
1177                 dc.DrawTextW(noString,_tcslen(noString),&noViewRect,DT_WORD_ELLIPSIS);
1178                 dc.DrawTextW(chatData.listenerData->user_id,chatData.listenerData->user_id.Length(),&userNameViewRect,DT_WORD_ELLIPSIS);
1179
1180                 dc.SelectFont(::AtlGetDefaultGuiFont());
1181                 dc.SetTextColor(chatData.viewData.stringColor == CChatData::ViewData::INIT_COLOR ? chatData.viewData.stringColor :self.viewproperty.baseStringColor);
1182                 dc.DrawTextW(dateString,_tcslen(dateString),&timeViewRect,DT_WORD_ELLIPSIS);
1183
1184                 return;
1185         }
1186
1187         VOID CCommentListWindow::ResetViewSellHeight(){
1188
1189                 viewSellHeight = 0;
1190
1191                 return;
1192         }
1193
1194
1195         VOID CCommentListWindow::ShowCurSel(){
1196
1197                 auto end = self.commentlist.end();
1198                 INT_PTR cursel = self.commentlist.GetCurSelNo();
1199                 if(cursel == -1)goto end;
1200
1201                 SCROLLINFO vScrollInfo;
1202                 vScrollInfo.cbSize = sizeof(vScrollInfo);
1203                 vScrollInfo.fMask = SIF_ALL;
1204                 self.GetScrollInfo(SB_VERT,&vScrollInfo);
1205                 
1206                 if(!(cursel >= vScrollInfo.nPos + static_cast<INT_PTR>(vScrollInfo.nPage) / 2 && cursel <= vScrollInfo.nPos + static_cast<INT_PTR>(vScrollInfo.nPage) / 2)){
1207                         self.SetScrollPos(SB_VERT,cursel - (vScrollInfo.nPage / 2));
1208                         self.commentlist.SetShortCut(self.GetScrollPos(SB_VERT));
1209                 }
1210
1211                 this->Invalidate();
1212
1213                 this->SendMessage(UM_COMMENTVIEW_SETCTRL,NULL,NULL);
1214 end:
1215
1216                 return;
1217         }
1218
1219
1220
1221         VOID CCommentListWindow::CalcItemHeight(CChatData &chatData){
1222                 
1223                 if(chatData.viewData.height == 0){
1224                 //      dumpln(TEXT("viewdataupdate"));
1225                         RECT drowSize;
1226                         self.m_header.GetItemRect(CCommentView::COMMENT,&drowSize);
1227                 
1228                         drowSize.bottom = 0;
1229
1230                         CChatReadEdit cedit;
1231                 
1232                         cedit.GeneralCreate(*this,ENM_REQUESTRESIZE,CALCEDIT_ID);
1233                         cedit.SetWindowText(TEXT(""));
1234                         cedit.SetWindowPos(NULL,0,0,drowSize.right - drowSize.left,drowSize.bottom - drowSize.top,SWP_NOZORDER | SWP_NOMOVE | SWP_NOREDRAW);
1235                         cedit.SetWindowText(chatData.chatBuf);
1236                         cedit.GetClientRect(&drowSize);
1237                         cedit.DestroyWindow();
1238                         if(drowSize.bottom - drowSize.top > 70)drowSize.bottom = drowSize.top + 70;
1239                         chatData.viewData.height = drowSize.bottom - drowSize.top;
1240                 }
1241
1242                 return ;
1243         }
1244
1245
1246
1247         LRESULT CCommentListWindow::OnCreate(LPCREATESTRUCT lpCreateStruct){
1248                 
1249                 return 0;
1250         }
1251
1252         CCommentList::iterator CCommentListWindow::CalcClickLine(INT_PTR height){
1253
1254                 INT_PTR heightSum = 0;
1255
1256                 CCommentList::iterator chatData = self.commentlist.GetShortCut();
1257                 CCommentList::iterator end  = self.commentlist.end();
1258
1259
1260                 
1261                 for(; chatData != end ;(++chatData)){
1262                         CalcItemHeight(*chatData);
1263                         heightSum += chatData->viewData.height;
1264
1265                         
1266                         if(heightSum >= height)break;
1267                 }
1268                 
1269
1270
1271
1272                 return chatData;
1273         }
1274
1275
1276         BOOL CCommentListWindow::IsOnNoOrUserName(UINT_PTR index,const POINT &point){
1277
1278                 RECT rc = {0};
1279                 
1280                 self.m_header.GetItemRect(index,&rc);
1281                 BOOL rslt = FALSE;
1282
1283                 //dumpln(TEXT("index:%d"),index);
1284                 //dumpln(TEXT("rc.left:%d"),rc.left);
1285                 //dumpln(TEXT("rc.right:%d"),rc.right);
1286                 //dumpln(TEXT("point.x:%d"),point.x);
1287                 if((point.x >= rc.left && point.x <= rc.right) && (point.y < static_cast<INT_PTR>(viewSellHeight))){
1288
1289                         INT_PTR heightsum = 0;
1290                         auto clickData = self.commentlist.GetShortCut();
1291                         auto endData = self.commentlist.end();
1292                         for(;clickData != endData;++clickData){
1293
1294                                 heightsum += clickData->viewData.height;
1295
1296                                 if(heightsum > point.y){
1297                                         
1298                                         CDC cdc = this->GetDC();
1299                                         
1300                                         rc.top = heightsum -= clickData->viewData.height;
1301                                         RECT calcRect = {0};
1302                                         //rc.bottom = rc.bottom;
1303                                         cdc.SelectFont(linkFont);
1304                                         //::GetTextExtentPoint32(cdc,clickData->chatBuf,clickData->chatBuf.Length(),&stringSize);
1305
1306                                         if(index == CCommentView::USERNAME){
1307                                                 LPCTSTR viewStr = clickData->listenerData->userName.Length() == 0 ? clickData->listenerData->user_id : clickData->listenerData->userName;
1308                                                 cdc.DrawTextW(viewStr ,_tcslen(viewStr),&calcRect,DT_CALCRECT);
1309                                         
1310                                         } else if(index == CCommentView::NO){
1311                                                 TCHAR viewStr[sizeof(UINT_PTR) * 8];
1312                                                 _stprintf(viewStr,TEXT("%d"),clickData->no);
1313                                                 cdc.DrawTextW(viewStr,_tcslen(viewStr),&calcRect,DT_CALCRECT);
1314
1315                                         }
1316                                         rc.bottom = rc.top +  calcRect.bottom - calcRect.top;
1317                                         rc.right = rc.right > rc.left + calcRect.right - calcRect.left ? rc.left + calcRect.right - calcRect.left : rc.right;
1318                                         
1319                                         //dumpln(TEXT("stringSize.cy:%d"),stringSize.cy);
1320                                         //dumpln(TEXT("stringSize.cx:%d"),stringSize.cx);
1321                                         dumpln(TEXT("rc.left:%d"),rc.left);
1322                                         dumpln(TEXT("rc.right :%d"),rc.right);
1323                                         rslt = (point.y >= rc.top && point.y <= rc.bottom && point.x >= rc.left && point.x <= rc.right);
1324                                         
1325                                         break;
1326
1327                                 }
1328                         }
1329                         
1330                 }
1331
1332                 return rslt;
1333
1334         }
1335
1336
1337         VOID CCommentListWindow::OnLButtonDown(UINT wParam, _WTYPES_NS::CPoint &point){
1338
1339
1340
1341
1342                 this->SetFocus();
1343                 if(point.x > (INT_PTR)self.GetColumnHolSizeSum()) goto end;
1344
1345                 
1346                 if(self.commentlist.empty() == TRUE)goto end;
1347                 
1348                 self.commentlist.SetCurSel(CalcClickLine(point.y));
1349                 
1350
1351
1352                 
1353
1354 end:
1355                 this->Invalidate();
1356                 this->SendMessage(UM_COMMENTVIEW_SETCTRL,NULL,NULL);
1357
1358                 return;
1359         }
1360
1361
1362         VOID CCommentListWindow::OnLButtonDblClk(UINT wParam, _WTYPES_NS::CPoint &point){
1363
1364
1365
1366                 if(!(point.x > (INT_PTR)self.GetColumnHolSizeSum() || self.commentlist.empty() == TRUE)){
1367                 
1368                         auto end  = self.commentlist.end();
1369                         auto lineIte = CalcClickLine(point.y);
1370                         if( lineIte == end)goto  endlabel;
1371                 
1372                 
1373                         COLORREF bkColor;
1374                         if(lineIte->listenerData->originBkFlag == FALSE){
1375                                 CListenerColorCollector colorCollector;
1376                                 listenerList.BkColorCollect(colorCollector);
1377                                 UCHAR red;
1378                                 UCHAR green;
1379                                 UCHAR blue;
1380
1381                                 srand((unsigned int)time(NULL));
1382                                 do{
1383
1384                                         red = getrgb();
1385                                         green = getrgb();
1386                                         blue = getrgb();
1387                                         bkColor = PALETTERGB(red,green,blue);
1388
1389                                 }while(colorCollector.Find(bkColor));
1390
1391                                 lineIte->listenerData->originBkFlag = TRUE;
1392                                 lineIte->listenerData->SetBkColor(bkColor);
1393                         } else {
1394
1395
1396                                 lineIte->listenerData->originBkFlag = FALSE;
1397                         }
1398                 }
1399
1400
1401
1402
1403
1404 endlabel:
1405
1406
1407                 this->Invalidate(TRUE);
1408
1409                 this->SendMessage(UM_COMMENTVIEW_SETCTRL,NULL,NULL);
1410                 return;
1411         }
1412
1413         LRESULT CCommentListWindow::OnEraseBkGnd(HDC lparam){
1414
1415                 return TRUE;
1416         }
1417
1418         VOID CCommentListWindow::OnKeyDown(TCHAR vKey,UINT loLParam,UINT hiLParam){
1419
1420                 INT_PTR dy = 0;
1421                 switch(vKey){
1422
1423                 case VK_DOWN:
1424                 case VK_RETURN:
1425                         dy = 1;
1426
1427                         break;
1428                 case VK_UP:
1429
1430                         dy = -1;
1431                         break;
1432                 default:
1433                         break;
1434
1435
1436                 }
1437
1438                 
1439                 
1440
1441                 auto cursel = self.commentlist.GetCurSel();
1442                 if((dy < 0 && cursel == self.commentlist.begin())  || dy >= static_cast<INT_PTR>(self.commentlist.Size()))goto end;
1443
1444                 
1445                 std::advance(cursel,dy);
1446                 self.commentlist.SetCurSel(cursel);
1447
1448                 this->ShowCurSel();
1449 end:
1450
1451                                         
1452                 return;
1453         }
1454
1455         LRESULT CCommentListWindow::OnSetCursor(HWND wparam,UINT loLparam,UINT hiLparam){
1456
1457                 POINT mousePoint = {0};
1458         
1459                 GetCursorPos(&mousePoint);
1460                 ::ScreenToClient(*this,&mousePoint);
1461                 
1462                 if(static_cast<INT>(loLparam) == 1 &&( IsOnNoOrUserName(CCommentView::NO,mousePoint) || IsOnNoOrUserName(CCommentView::USERNAME,mousePoint))){
1463                         
1464                         ::SetCursor(::LoadCursorW(NULL,IDC_HAND));
1465
1466                 } else {
1467
1468                         DefWindowProc ();
1469
1470                 }
1471                 
1472
1473                 
1474         
1475
1476                 return FALSE;
1477         }
1478
1479         LRESULT CCommentListWindow::OnMouseWheel(UINT loWparam,SHORT hiWparam,CPoint &point){
1480
1481
1482                 self.SendMessageW(WM_VSCROLL,MAKELONG(hiWparam < 0 ? SB_PAGEDOWN : SB_PAGEUP ,0),0);
1483
1484
1485                 return 0;
1486         }
1487
1488
1489         LRESULT CCommentListWindow::OnChatControlNortify(LPNMHDR lParam){
1490
1491                 LRESULT rslt = 0;
1492
1493                 switch(lParam->code){
1494
1495                 case EN_LINK:
1496
1497
1498                         break;
1499
1500                 case EN_MSGFILTER:
1501                         {
1502                                 auto pmf = (MSGFILTER *)lParam;
1503                                 if (pmf->msg == WM_LBUTTONDOWN || pmf->msg== WM_LBUTTONDBLCLK || pmf->msg == WM_MOUSEWHEEL){
1504
1505                                         RECT  windowrect;
1506                                         ::GetWindowRect(pmf->nmhdr.hwndFrom,&windowrect);
1507                                         _WTYPES_NS::CPoint point(windowrect.left +  LOWORD(pmf->lParam),windowrect.top + HIWORD(pmf->lParam));
1508                                         ::ScreenToClient(*this,&point);
1509
1510                                         switch(pmf->msg){
1511
1512                                         case WM_LBUTTONDOWN:
1513                                                 OnLButtonDown(pmf->wParam,point);
1514                                                 break;
1515
1516                                         case WM_LBUTTONDBLCLK:
1517                                                 OnLButtonDblClk(pmf->wParam,point);
1518                                                 break;
1519
1520                                         case WM_MOUSEWHEEL:
1521                                                 OnMouseWheel(LOWORD(pmf->wParam),HIWORD(pmf->wParam),point);
1522                                                 break;
1523
1524                                         default:
1525
1526                                                 break;
1527                                         }
1528                                         
1529                                 } 
1530
1531                                         
1532
1533                                 
1534             }
1535                         break;
1536
1537
1538                 default:
1539
1540                         break;
1541
1542                 }
1543
1544
1545                 return rslt;
1546         }
1547
1548         LRESULT CCommentListWindow::OnCalcSellSize(LPNMHDR lParam){
1549
1550                 auto pReqResize = reinterpret_cast <REQRESIZE *>(lParam);
1551                 ::SetWindowPos(pReqResize->nmhdr.hwndFrom,NULL,0,0,pReqResize->rc.right - pReqResize->rc.left,pReqResize->rc.bottom - pReqResize->rc.top,SWP_NOZORDER | SWP_NOMOVE | SWP_HIDEWINDOW);
1552                 return 0;
1553         }
1554
1555 }