글자 입력 및 저장(한글 지원)

By | 2014년 6월 17일

Char
SingleDoc.h

// CSingleDoc 명령
BOOL CSingleDoc::OnSaveDocument(LPCTSTR lpszPathName)
{
    // TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
		CFile file;
        CFileException fe;
		CString temp;

		temp = CSingleDoc::m_Munja;

		int length = temp.GetLength();

        if (!file.Open(lpszPathName, CFile::modeCreate |
            CFile::modeReadWrite | CFile::shareExclusive, &fe))
        {
            ReportSaveLoadException(lpszPathName, &fe,
                TRUE, AFX_IDP_INVALID_FILENAME);
            return FALSE;
        }

        // replace calls to Serialize with SaveDIB function
        BOOL bSuccess = FALSE;
        TRY
        {
            BeginWaitCursor();
            TCHAR *strMemo = new TCHAR[temp.GetLength()+1];
    		_tcscpy(strMemo,temp);	//CString을 w_char* 형으로 카피하고
			int nLen = _tcslen(strMemo);	//길이구하기
			TCHAR szTmp[2]; //w_char 의 2개짜리 생성(한글이어ㄹ서)
			WORD wd = 0xFEFF; //0xfeef를 파일의 첫부분에 기록해서 해당 파일이
							//유니코드형식임을 알려줘합니다.
							//Little-Endiann 시스템은 0xfffe  입니다.
			memcpy(szTmp,&wd,2);	//맨 앞에 복사하고
			file.Write(szTmp,2);	//유니코드임을 알려준다.
			file.Write(strMemo, nLen * sizeof(WCHAR));	//그리고 파일에 쓴다.
			bSuccess = TRUE;
            file.Close();
        }
        CATCH (CException, eSave)
        {
            file.Abort(); // will not throw an exception
            EndWaitCursor();
            ReportSaveLoadException(lpszPathName, eSave,
                TRUE, AFX_IDP_FAILED_TO_SAVE_DOC);
            return FALSE;
        }
        END_CATCH

            EndWaitCursor();
        SetModifiedFlag(FALSE);     // back to unmodified

        if (!bSuccess)
        {
            // may be other-style DIB (load supported but not save)
            //  or other problem in SaveDIB
            CString strMsg;
            //strMsg.LoadString(IDS_CANNOT_SAVE_DIB);
			
			strMsg = _T("저장중 에러가 발생했습니다.");
            MessageBox(NULL, strMsg, NULL, MB_ICONINFORMATION | MB_OK);
        }

        return bSuccess;
	//return CDocument::OnSaveDocument(lpszPathName);
}

SingleView.cpp
void CSingleView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
    // TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
	CSingleDoc* pDoc=GetDocument();
	pDoc->m_Munja += TCHAR(nChar);
    pDoc->SetModifiedFlag(TRUE);//저장 플래그 세트 설정
	Invalidate();

     CView::OnChar(nChar, nRepCnt, nFlags);
}

SingleDoc.cpp
class CSingleDoc : public CDocument
{
protected: // serialization에서만 만들어집니다.
    CSingleDoc();
	DECLARE_DYNCREATE(CSingleDoc)

// 특성입니다.
public:

// 작업입니다.
public:
	CString m_Munja;

// 재정의입니다.
public:
	virtual BOOL OnNewDocument();
	virtual void Serialize(CArchive& ar);
#ifdef SHARED_HANDLERS
	virtual void InitializeSearchContent();
	virtual void OnDrawThumbnail(CDC& dc, LPRECT lprcBounds);
#endif // SHARED_HANDLERS

// 구현입니다.
public:
	virtual ~CSingleDoc();
#ifdef _DEBUG
	virtual void AssertValid() const;
	virtual void Dump(CDumpContext& dc) const;
#endif

protected:

// 생성된 메시지 맵 함수
protected:
	DECLARE_MESSAGE_MAP()

#ifdef SHARED_HANDLERS
	// 검색 처리기에 대한 검색 콘텐츠를 설정하는 도우미 함수
	void SetSearchContent(const CString& value);
#endif // SHARED_HANDLERS
public:
	virtual BOOL OnSaveDocument(LPCTSTR lpszPathName);
};

Category: C++