티스토리 뷰
1. ListCtrl 의 속성에서 Owner Draw Fixed : TRUE 로 설정
2. Dialog 속성에서 WM_DRAWITEM 메시지 추가
3. 아래 1번줄과 2,3번줄이 실행되면 자동으로 OnDrawItem() 호출되어 ListCtrl 을 다시 그려준다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165 |
m_list외인기관.RedrawItems(nIndex, nIndex); // 변경된 행만 다시 그림, 이것이 없으면 그래프 안 바뀜.
m_list외인기관.InsertItem(_코드, str코드);
m_list외인기관.SetItemText(0, _종목, str종목);
void CLoginDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
int nN=0;
if(nIDCtl == IDC_LIST_BUYSELL) // 조회결과를 받을조때 그리면 되는데, 조회요청 없을때에도 그리는듯.
{
// if(m_nMinVal <= 0) return; // 조회결결과를 받았을때만 CListCtrl 을 채운다. 코드, 종목 안나오는 문제발생
int index = lpDrawItemStruct->itemID;
// 항목 인덱스값이 유효한 경우
if(index >= 0 && index < m_list외인기관.GetItemCount())
{
// 사용자 정의 그리기에 사용할 DC를 얻는다.
CDC *p_dc = CDC::FromHandle(lpDrawItemStruct->hDC);
// 각 항목의 영역 정보를 얻는다.
CRect r = lpDrawItemStruct->rcItem;
// 리스트 컨트롤의 항목이 선택된 경우
if(lpDrawItemStruct->itemState & ODS_SELECTED)
{
// 글자 색을 지정한다.
p_dc->SetTextColor(RGB(30, 30, 250));
// 선택된 항목을 표시하기위하여 다른색으로 항목 영역을 채운다.
p_dc->FillSolidRect(r, RGB(188, 231, 241));
}
else
{
// 리스트 컨트롤의 항목이 선택되지 않은 경우
p_dc->SetTextColor(RGB(0, 0, 128));
p_dc->FillSolidRect(r, RGB(255, 255, 255));
}
// 각 컬럼의 너비 정보를 얻기위한 구조체를 선언한다.
LV_COLUMN column_data;
// 너비 정보를 반환받기위한 속성값을 지정한다.
column_data.mask = LVCF_WIDTH;
CString str;
// 각 컬럼은 앞쪽으로 5만큼의 여백을 갖고 문자를 출력한다.
// 리스트 컨트롤이 가지고있는 헤더 컨트롤의 포인터를 얻어서, 컬럼의 수를 구한다.
///////////////////////----------------------
int pos = 5, header_count = m_list외인기관.GetHeaderCtrl()->GetItemCount();
// 마지막 컬럼은 그래프가 출력되므로 (컬럼수 - 1)만큼 반복문을 돌며
// 데이터를 출력한다.
for(int i = 0; i < header_count ; i++)
{
// 항목의 데이터 값을 얻는다.
str = m_list외인기관.GetItemText(index, i);
switch(i)
{
case _코드: // 코드
case _종목: // 종목명
p_dc->SetTextAlign(TA_LEFT);
// 컬럼 영역의 left 값에 pos 값을 더해가며 해당 위치에 데이터를 출력한다.
p_dc->TextOut(r.left + pos, r.top + 1, str); // 각셀의 앞에서부터 좌측정렬로 출력
// column_data 구조체에 너비 정보를 받는다.
m_list외인기관.GetColumn(i, &column_data);
// 각 컬럼의 너비를 더해가며 해당 컬럼의 위치값을 얻어 저장한다.
pos += column_data.cx;
break;
case _가격: // 현재가
case _등락율: // 등락률
case _거래량: // 거래량
p_dc->SetTextAlign(TA_RIGHT);
// column_data 구조체에 너비 정보를 받는다.throwha
m_list외인기관.GetColumn(i, &column_data);
// 각 컬럼의 너비를 더해가며 해당 컬럼의 위치값을 얻어 저장한다.
pos += column_data.cx;
// 컬럼 영역의 left 값에 pos 값을 더해가며 해당 위치에 데이터를 출력한다.
p_dc->TextOut(r.left + pos - 10, r.top + 1, str); // 셀의 우측 끝에서 우측정렬로 출력
break;
case _외인매수:
case _기관매수:
// column_data 구조체에 너비 정보를 받는다.
m_list외인기관.GetColumn(i, &column_data);
그래프그리기(p_dc, pos, column_data.cx, index, r, nN++); // 등락률, 최고,최저가 선그리기
pos += column_data.cx;
break;
default:
break;
}
}
}
}
else
CDialogEx::OnDrawItem(nIDCtl, lpDrawItemStruct);
}
void CLoginDlg::그래프그리기(CDC* p_dc, int pos, int width, int index, CRect r, int nN)
{
int nMax, nMin, temp;
nMax = nMin = m_n외인기관매수량[index][nN][0];
for(int j=1; j<4; j++)
{
temp = m_n외인기관매수량[index][nN][j];
if(nMax < temp)
nMax = m_n외인기관매수량[index][nN][j];
else if(nMin > temp)
nMin = m_n외인기관매수량[index][nN][j];
}
int n컬럼중심 = pos-5 + width/2; // 외인, 기관 매수량 없을때를 위해 먼저 그려줌.
CPen NewPen(PS_SOLID, 1, RGB(0, 0, 0));
CPen* pOldPen = p_dc->SelectObject(&NewPen);
p_dc->MoveTo(n컬럼중심, r.top);
p_dc->LineTo(n컬럼중심, r.bottom - 1); // 그래프 중앙선 그리기
p_dc->SelectObject(pOldPen);
if (m_b매수종목 && nMax <= 0) // 기관, 외인 매수만 검색할 경우 매수가 없거나 매도세인경우 안그림.
return;
COLORREF clr;
float f비율;
width -= 2; // 폭 양끝에서 1씩 줄임.
int x1, y1, x2, y2, subWidth = (r.bottom - r.top) / 4 - 1;
for(int i=0; i<4; i++)
{
if(m_n외인기관매수량[index][nN][i] == 0)
continue;
else if(m_n외인기관매수량[index][nN][i] > 0) // 매수인 경우
{
if(m_n외인기관매수량[index][nN][i] == nMax)
f비율 = 1;
else
f비율 = float(m_n외인기관매수량[index][nN][i])/nMax;
x2 = int(n컬럼중심 + width/2 * f비율);
}
else // 매도인 경우
{
if(m_n외인기관매수량[index][nN][i] == nMin)
f비율 = 1;
else
f비율 = float(m_n외인기관매수량[index][nN][i])/nMin;
x2 = int(n컬럼중심 - (width+1)/2 * f비율) + 1;
}
x1 = n컬럼중심;
y1 = r.top + 2 + i * subWidth;
y2 = y1 + subWidth;
switch(i)
{
case 0:
clr = RGB(255, 0, 0);
break;
case 1:
clr = RGB(0, 255, 0);
break;
case 2:
clr = RGB(0, 0, 255);
break;
case 3:
clr = RGB(255, 0, 0);
break;
}
p_dc->FillSolidRect(CRect(x1, y1, x2, y2), clr); // RGB(64, 198, 255)
}
p_dc->SelectObject(pOldPen);
} |
cs |