'MFC Programming'에 해당되는 글 2건

  1. 2010.01.20 학점계산기 버그수정
  2. 2010.01.19 간단한 Capture 프로그램
만드는데 2시간 반..
실행파일하고 DLL관련 삽질 한시간...
대략 3시간 반...
0점 입력 방지.
Enter ESC 버그 수정
항목 삭제 추가
4.5만점만 있음..
4.3은... 추후 할 짓없을 때 ㅜ.ㅜ
// GradeCalDlg.cpp : 구현 파일
//

#include "stdafx.h"
#include "GradeCal2.h"
#include "GradeCal2Dlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// 응용 프로그램 정보에 사용되는 CAboutDlg 대화 상자입니다.

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// 대화 상자 데이터입니다.
	enum { IDD = IDD_ABOUTBOX };

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 지원입니다.

// 구현입니다.
protected:
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()


// CGradeCalDlg 대화 상자




CGradeCalDlg::CGradeCalDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CGradeCalDlg::IDD, pParent)
	, SubjectName(_T(""))
	, SubjectPoint(0)
	, SubjectGrade(_T(""))
	, TotalPoint(0)
	, AverageGrade(0)
	, numberOfSubject(0)
	, TotalPointGrade(0)
	, m_rGrade(0)
	, subIdx0(0)
	, subIdx1(1)
	, subIdx2(2)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CGradeCalDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	DDX_Text(pDX, IDC_EDIT_INPUTNAME, SubjectName);
	DDV_MaxChars(pDX, SubjectName, 50);
	DDX_Text(pDX, IDC_EDIT_INPUTPOINT, SubjectPoint);
	DDV_MinMaxShort(pDX, SubjectPoint, 0, 10);
	DDX_Text(pDX, IDC_EDIT_TOTALGRADE, TotalPoint);
	DDX_Text(pDX, IDC_EDIT_AVERAGE, AverageGrade);
	DDX_Control(pDX, IDC_EDIT_INPUTNAME, m_edSubjectName);
	DDX_Control(pDX, IDC_EDIT_INPUTPOINT, m_edSujectPoint);
	DDX_Text(pDX, IDC_EDIT1, numberOfSubject);
	DDX_Text(pDX, IDC_EDIT2, TotalPointGrade);
	DDX_Radio(pDX, IDC_RADIO1, m_rGrade);
	DDX_Control(pDX, IDC_LIST2, m_List);
}

BEGIN_MESSAGE_MAP(CGradeCalDlg, CDialog)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	//}}AFX_MSG_MAP
	ON_BN_CLICKED(IDC_BUTTON1, &CGradeCalDlg::OnBnClickedButton1)
	ON_BN_CLICKED(IDC_BUTTON2, &CGradeCalDlg::OnBnClickedButton2)
//	ON_EN_CHANGE(IDC_EDIT_AVERAGE, &CGradeCalDlg::OnEnChangeEditAverage)
ON_BN_CLICKED(IDC_BUTTON3, &CGradeCalDlg::OnBnClickedButton3)
ON_BN_CLICKED(IDC_BUTTON4, &CGradeCalDlg::OnBnClickedButton4)
END_MESSAGE_MAP()


// CGradeCalDlg 메시지 처리기

BOOL CGradeCalDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// 시스템 메뉴에 "정보..." 메뉴 항목을 추가합니다.

	// IDM_ABOUTBOX는 시스템 명령 범위에 있어야 합니다.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		BOOL bNameValid;
		CString strAboutMenu;
		bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
		ASSERT(bNameValid);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// 이 대화 상자의 아이콘을 설정합니다. 응용 프로그램의 주 창이 대화 상자가 아닐 경우에는
	//  프레임워크가 이 작업을 자동으로 수행합니다.
	SetIcon(m_hIcon, TRUE);			// 큰 아이콘을 설정합니다.
	SetIcon(m_hIcon, FALSE);		// 작은 아이콘을 설정합니다.

	// TODO: 여기에 추가 초기화 작업을 추가합니다.
	SubjectName=_T("");
	SubjectPoint=0;
	SubjectGrade=_T("");
	TotalPoint=0;
	AverageGrade=0;
	numberOfSubject=0;
	TotalPointGrade=0;
	m_List.InsertColumn(0,_T("과목"),LVCFMT_LEFT,150);
	m_List.InsertColumn(1,_T("점수"),LVCFMT_LEFT,50);
	m_List.InsertColumn(2,_T("학점"),LVCFMT_LEFT,50);
	m_List.ModifyStyle(LVS_TYPEMASK,LVS_REPORT);
	DWORD dwExStyle=m_List.GetExtendedStyle();
	m_List.SetExtendedStyle(dwExStyle|LVS_EX_CHECKBOXES);


	itemIdx=0;
	return TRUE;  // 포커스를 컨트롤에 설정하지 않으면 TRUE를 반환합니다.
}

void CGradeCalDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// 대화 상자에 최소화 단추를 추가할 경우 아이콘을 그리려면
//  아래 코드가 필요합니다. 문서/뷰 모델을 사용하는 MFC 응용 프로그램의 경우에는
//  프레임워크에서 이 작업을 자동으로 수행합니다.

void CGradeCalDlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); // 그리기를 위한 디바이스 컨텍스트

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc()), 0);

		// 클라이언트 사각형에서 아이콘을 가운데에 맞춥니다.
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// 아이콘을 그립니다.
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

// 사용자가 최소화된 창을 끄는 동안에 커서가 표시되도록 시스템에서
//  이 함수를 호출합니다.
HCURSOR CGradeCalDlg::OnQueryDragIcon()
{
	return static_cast(m_hIcon);
}


void CGradeCalDlg::OnBnClickedButton1()
{
	//입력버튼
	//if(SubjectPoint !=0 && SubjectGrade !=_T(""))
	UpdateData();
	if(SubjectPoint ==0.0)
	{
		AfxMessageBox(_T("점수는 0이상"));
		return ;
	}

	float pointGrade=0;
	switch(m_rGrade)
	{
	case 0:
		pointGrade=4.5;
		SubjectGrade="A+";
		break;
	case 1:
		pointGrade=4;
		SubjectGrade="A0";
		break;
	case 2:
		pointGrade=3.5;
		SubjectGrade="B+";
		break;
	case 3:
		pointGrade=3;
		SubjectGrade="B0";
		break;
	case 4:
		pointGrade=2.5;
		SubjectGrade="C+";
		break;
	case 5:
		pointGrade=2.0;
		SubjectGrade="C0";
		break;
	case 6:
		pointGrade=1.5;
		SubjectGrade="D+";
		break;
	case 7:
		pointGrade=1.0;
		SubjectGrade="D0";
		break;
	case 8:
		pointGrade=0;
		SubjectGrade="F";
		break;
	}
	//확인라인
	/*CString strtmp;
	strtmp.Format(_T("%s %d %s"),SubjectName,SubjectPoint,SubjectGrade);
	AfxMessageBox(strtmp);*/
	//결과 표시
	CString supoint;
	supoint.Format(_T("%.1f"),SubjectPoint);
	//ListCtrl 항목 추가
	LVITEM item;
	::ZeroMemory(&item,sizeof(item));
	item.mask=LVIF_TEXT|LVIF_STATE;
	item.pszText=(LPWSTR)SubjectName.GetString();//.FormatMessageV(_T("%s"),SubjectName);
	item.iItem=itemIdx;
	item.state=LVIS_SELECTED;
	m_List.InsertItem(&item);
	m_List.SetItemText(itemIdx,1,supoint.GetBuffer());
	m_List.SetItemText(itemIdx,2,SubjectGrade.GetBuffer());
	itemIdx++;

	numberOfSubject++;
	TotalPoint+=SubjectPoint;
	TotalPointGrade+=SubjectPoint*pointGrade;
	AverageGrade=TotalPointGrade/TotalPoint;
	SubjectName=_T("");
	SubjectPoint=0;
	UpdateData(false);
}

void CGradeCalDlg::OnBnClickedButton2()
{
	//클리어 버튼
	UpdateData(false);
	
}


void CGradeCalDlg::OnBnClickedButton3()
{
	//clear 버튼
	TotalPoint=0;
	AverageGrade=0;
	numberOfSubject=0;
	TotalPointGrade=0;
	itemIdx=0;
	m_List.DeleteAllItems();
	UpdateData(false);
}

void CGradeCalDlg::OnBnClickedButton4()
{
	//row삭제버튼
	int nCount=m_List.GetItemCount();
	float gradeTmp;
	float pointTmp;
	CString tmp;
	for(int i=nCount-1;i>=0;--i)
	{
		if(m_List.GetCheck(i))
		{
			CString point;
			point.Format(_T("%.3s"),m_List.GetItemText(i,1));
			CString grade=m_List.GetItemText(i,2);
			m_List.DeleteItem(i);
			pointTmp=CStringToFloat(point);
			gradeTmp=GradeToPoint2(grade);
			TotalPoint-=pointTmp;
			numberOfSubject--;
			itemIdx--;
			TotalPointGrade-=(pointTmp*gradeTmp);
		}
	}
	AverageGrade=TotalPointGrade/TotalPoint;
	UpdateData(false);
}

float CGradeCalDlg::CStringToFloat(CString p)
{
	float tmp=0;
	if(p.GetLength()==1)
	{
		tmp=p[0]-'0';
	}
	else if(p.GetLength()>1)
	{
		tmp=p[0]-'0';
		tmp=tmp+((p[2]-'0')/10.0);
	}

	return tmp;	
}

float CGradeCalDlg::GradeToPoint2(CString g)
{
	float temp=0;
	for(int i=0;imessage == WM_KEYDOWN)
	{
		if(pMsg->wParam==VK_RETURN || pMsg->wParam==VK_ESCAPE)
		{
			return true;
		}
	}
	return CDialog::PreTranslateMessage(pMsg);
}

'MFC' 카테고리의 다른 글

다이얼로그에서 키입력 이벤트 처리  (0) 2010.04.28
학점계산기 버그수정  (0) 2010.01.20
GDI+ 설정  (0) 2010.01.20
Command routing  (0) 2010.01.20
MainFrame 윈도우 영역 조정  (0) 2010.01.19
영역 처리  (0) 2010.01.19
Posted by hyunny82
왼쪽버튼 2번 누르면 바로 뻑남 -__-
void CCaptureView::OnLButtonDown(UINT nFlags, CPoint point)
{
	//바탕화면 윈도우의 포인터 얻어옴
	CWnd* pWndDesktop=GetDesktopWindow();
	//바탕화면 윈도우 DC
	CWindowDC scrDC(pWndDesktop);
	//뷰윈도우 DC
	CClientDC dc(this);
	
	//바탕화면 폭과 너비 구해옴.
	CRect Rect;
	pWndDesktop->GetWindowRect(&Rect);

	
	int cx=Rect.Width();
	int cy=Rect.Height();
	Image.Create(cx,cy,scrDC.GetDeviceCaps(BITSPIXEL));
	
	//이미지 DC얻어옴
	CDC* pDC=CDC::FromHandle(Image.GetDC());
	//바탕화면 윈도우DC를 출력
	pDC->BitBlt(0,0,cx,cy,&scrDC,0,0,SRCCOPY);
	Image.ReleaseDC();
	Image.BitBlt(dc.m_hDC,0,0);
	CView::OnLButtonDown(nFlags, point);
}
void CCaptureView::OnRButtonDown(UINT nFlags, CPoint point)
{
	//리소스로 다이얼로그 하나 추가후 파일이름 입력받음
	mm.DoModal();
	CString filename=mm.fileName;
	filename+=".jpg";
	Image.Save(filename,Gdiplus::ImageFormatJPEG);
		::ShellExecute(NULL,_T("open"),filename,NULL,NULL,SW_SHOW);
	CView::OnRButtonDown(nFlags, point);
}

'MFC' 카테고리의 다른 글

영역 처리  (0) 2010.01.19
CRgn 윈도우 영역 설정  (0) 2010.01.19
간단한 Capture 프로그램  (0) 2010.01.19
CImage 클래스 이용  (0) 2010.01.19
Bitmap 출력  (0) 2010.01.19
버튼 구현  (0) 2010.01.19
Posted by hyunny82
이전버튼 1 이전버튼

티스토리 툴바