mfc_Paint_3 - 8BitsCoding/RobotMentor GitHub Wiki
μμμ μ νν μ μκ² ν΄λ³΄μ.
리μ€νΈ λ°μ€λ₯Ό μΆκ°νμ¬ μμμ μ ννκ² ν΄λ³΄μ.
리μ€νΈ λ°μ€μ μ΅μ μ MultiColumn : True, OwnerDraw : Fixedλ‘ λλ€.
리μ€νΈ λ°μ€λ μ΄μ μ ꡬνν΄ λ THListBoxλ₯Ό μ¬μ©νλ€.
// Dlg.h
#include "TH_ListBox.h"
#ifdef _DEBUG
#pragma comment(lib, "DSH_TH_LixBox.lib");
#else
#pragma comment(lib, "RST_TH_LixBox.lib");
#endif
class MyColorList : public TH_ListBox
{
public:
void DrawUserItem(CDC * ap_dc, RECT * ap_rect, int a_index, void * ap_data, unsigned char a_select_flag, unsigned char a_focus_flag)
{
COLORREF color = GetItemData(a_index);
CRect r(ap_rect->left + 2, ap_rect->top + 2, ap_rect->right - 2, ap_rect->botom - 2);
ap_dc->FillSolidRect(r, color);
}
}
// Dlg.h
private:
MyColorList m_color_list;
// OnInitDialog
m_color_list.SubclassDlgItem(IDC_COLOR_LIST, this);
μμμ μ ννλ©΄ κ·Έ μμμ λ°μνκ² λ³κ²½
// Dlg.h
private:
char m_draw_type = 1;
char m_is_clicked = 0;
CPoint m_prev_point;
CImage m_image, m_temp_image;
CPen m_my_pen;
DrawWnd::DrawWnd() : m_my_pen(PS_SOLID, 1, RGB(0, 0, 0))
{
}
// DrawWnd::OnDestroy
m_my_pen.DeleteObject();
// SetPenStyle(COLORREF a_color)
m_my_pen.DeleteObject();
m_my_pen.CreatePen(PS_SOLID, 1, a_color);
κ·Έλ¦Όμ© ν¬μ μ€λΉνλ€.
// OnLbnSelchangeColorList
int index = m_color_list.GetCurSel();
if(LB_ERR != index) {
m_draw_wnd.SetPenStype(m_color_list.GetItemData(index));
}
// DrawWnd::MOUSE_MOVE
if(m_is_clicked == 1) {
CClientDC dc(this);
if(m_draw_type == PEN_MODE) {
HDC h_image_dc = m_image.GetDC();
CDC * p_image_dc = CDC::FromHandle(h_image_dc);
CPen * p_old_pen = p_image_dc->SelectObject(&m_my_pen);
p_image_dc.MoveTo(m_prev_point); // μμ μ
p_image_dc.LineTo(point); // λ μ
p_image_dc->SelectObject(p_old_pen);
m_prev_point = point;
m_image.ReleaseDC();
m_image.Draw(dc, 0, 0);
} else if(m_draw_type == LINE_MODE) {
CDC * p_temp_dc = CDC::FromHandle(m_temp_image.GetDC());
m_image.Draw(*p_temp_dc, 0, 0);
CPen * p_old_pen = p_temp_dc->SelectObject(&m_my_pen);
p_temp_dc->MoveTo(m_prev_point); // μμ μ
p_temp_dc->LineTo(point); // λ μ
p_temp_dc->SelectObject(p_old_pen);
m_temp_image.ReleaseDC();
m_temp_image.Draw(dc, 0, 0);
} else if(m_draw_type == RECT_MODE) {
CDC * p_temp_dc = CDC::FromHandle(m_temp_image.GetDC());
m_image.Draw(*p_temp_dc, 0, 0);
CPen * p_old_pen = p_temp_dc->SelectObject(&m_my_pen);
CGdiObject *p_old_brush = p_temp_dc->SelectStockObject(NULL_BRUSH);
p_temp_dc->Rectangle(m_prev_point.x, m_prev_point.y, point.x, point.y);
p_temp_dc->SelectObject(p_old_brush);
p_temp_dc->SelectObject(p_old_pen);
m_temp_image.ReleaseDC();
m_temp_image.Draw(dc, 0, 0);
} else {
}
}
else {
}
p_image_dc->SelectObject(&m_my_pen);
μ ν΅νμ¬ νμ μ°κ²°νλ€.
// OnLButtonUp
if(m_is_clicked) {
CDC * p_image_dc = CDC::FromHandle(m_image.GetDC());
if(m_draw_type == LINE_MODE) {
CPen * p_old_pen = p_image_dc->SelectObject(&m_my_pen);
p_image_dc->MoveTo(m_prev_point);
p_image_dc->LineTo(point);
p_image_dc->SelectObject(p_old_pen);
} else if (m_draw_type == RECT_MODE) {
CPen * p_old_pen = p_image_dc->SelectObject(&m_my_pen);
CGdiObject * p_old_brush = p_image_dc->SelectStockObject(NULL_BRUSH);
p_image_dc->Rectangle(m_prev_point.x, m_prev_point.y, point.x, point.y);
m_image_dc->SelectObject(p_old_brush);
p_image_dc->SelectObject(p_old_pen);
}
m_image.ReleaseDC();
m_is_clicked = 0;
ReleaseCapture();
}
μ½λλ₯Ό μ’ λ κ°λ¨ν ν΄λ³΄μ.
// Dlg.h
private:
char m_draw_type = 1;
char m_is_clicked = 0;
CPoint m_prev_point;
CImage m_image, m_temp_image;
CPen m_my_pen;
CDC m_image_dc, m_temp_dc;
CDCλ₯Ό μΆκ°νλ€.
// OnCreate
CRect r;
GetClientRect(r);
m_image.Create(r.Width(), r.Height(), 32);
m_temp_image.Create(r.Witdh(), r.Height(), 32);
m_image_dc.Attach(m_image.GetDC());
m_image_dc.FillSolidRect(r, RGB(255, 255, 255));
m_temp_dc.Attach(m_image.GetDC());
// OnDestroy
m_image_dc.Detach();
m_temp_dc.Detach();
m_image.ReleaseDC();
m_temp_image.ReleaseDC();
m_my_pen.DeleteObject();
// SetPenStyle
m_my_pen.DeleteObject();
m_my_pen.CreatePen(PS_SOLID, 1, a_color);
m_image_dc.SelectObject(&m_my_pen);
m_temp_dc.SelectObject(&m_my_pen);
// DrawWnd::MOUSE_MOVE
if(m_is_clicked == 1) {
CClientDC dc(this);
if(m_draw_type == PEN_MODE) {
m_image_dc.MoveTo(m_prev_point);
m_image_dc.LineTo(point);
m_prev_point = point;
m_image.Draw(dc, 0, 0);
} else if(m_draw_type == LINE_MODE) {
m_image.Draw(m_temp_dc, 0, 0);
m_temp_dc.MoveTo(m_prev_point);
m_temp_dc.LineTo(point);
m_temp_image.Draw(dc, 0, 0);
} else if(m_draw_type == RECT_MODE) {
m_image.Draw(m_temp_dc, 0, 0);
CGdiObject * p_old_brush = m_temp_dc.SelectStockObject(NULL_BRUSH);
m_temp_dc.Rectangle(m_prev_point.x, m_prev_point.y, point.x, point.y);
m_temp_dc.SelectObject(p_old_brush);
m_temp_image.Draw(dc, 0, 0);
} else {
}
}
else {
}
// OnLButtonUp
if(m_is_clicked) {
CDC * p_image_dc = CDC::FromHandle(m_image.GetDC());
if(m_draw_type == LINE_MODE) {
m_image_dc.MoveTo(m_prev_point);
m_image_dc.LineTo(point);
} else if (m_draw_type == RECT_MODE) {
m_image_dc.Rectangle(m_prev_point.x, m_prev_point.y, point.x, point.y);
m_image_dc.SelectObject(p_old_brush);
}
m_is_clicked = 0;
ReleaseCapture();
}