GSI

기존의 스크롤뷰가 페이지의 크기가 커지면, 많은 문제점이 생기게 됩니다.
좀 불합리성이 보이네욤..
더블 버퍼링도 좀 부피가 커져서 효율이 떨어 지고. 스크롤의 최대 값도 좀 걸리고.
그래서 싱글 뷰에 직접 컨트롤 박아서 처리해봤어요.

사용자 삽입 이미지
위에서 보는 거 처름 CView 에 View, ScrollBar등을 달아서
움직이도록 처리 해봤습니다.

더 보정할건 많지만. 기초 프로토타입으로는 좋은거 같네요..

앞으로 여기에 마우스로 컨트롤 추가 하고 타임 라인 비슷한 화면을 구성해 볼려고 합니다.
잘 되면 좋겠네요 ^^.

관련코드 :
Posted by gsi
:

XML 처리방법

C++ 2007. 12. 6. 12:53 |

XML 데이터 처리 하는 방법 정리.
파일 읽기, http 정보 읽기, 노드 정보 출력, 노드 검색 정보 출력


1. XML 파일 읽어서 출력하기

MSXML2::IXMLDOMDocument2Ptr pDoc; // XML Document 선언
pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument)); // 인스턴스 생성

HRESULT hr = pDoc->load((_variant_t)".\\test.xml");
if(hr == 0) {
 AfxMessageBox("로딩 에러");
 return;
}
AfxMessageBox(pDoc->xml);

2. http을 통한 XML 파일 읽어서 출력하기

MSXML2::IXMLDOMDocument2Ptr pDoc; // XML Document 선언
pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument)); // 인스턴스 생성

DWORD startTick = GetTickCount();
pDoc->put_async(VARIANT_FALSE);
HRESULT hr = pDoc->load((_variant_t)"http://localhost/TestXml/test2.xml");
if(hr == 0) {
 AfxMessageBox("로딩 에러");
 return;
}
AfxMessageBox(pDoc->xml);

3. XML 데이터의 첫번째 해당 노드값 읽어서 출력하기

MSXML2::IXMLDOMDocument2Ptr pDoc; // XML Document 선언
pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument)); // 인스턴스 생성

HRESULT hr = pDoc->load((_variant_t)".\\test.xml");
if(hr == 0) {
 AfxMessageBox("로딩 에러");
 return;
}

MSXML2::IXMLDOMNodePtr pNode;
pNode = pDoc->selectSingleNode(L"//name");

CString outString;
outString.Format("[검색결과] 노드명:%s, 노드값:%s\r\n", (LPCTSTR)pNode->GetnodeName(), (LPCTSTR)pNode->Gettext());
AfxMessageBox(outString);

4. XML 데이터의 해당 노드값 모두 읽어서 출력하기

MSXML2::IXMLDOMDocument2Ptr pDoc; // XML Document 선언
pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument)); // 인스턴스 생성

HRESULT hr = pDoc->load((_variant_t)".\\test.xml");
if(hr == 0) {
 AfxMessageBox("로딩 에러");
 return;
}

MSXML2::IXMLDOMNodeListPtr pNodeList;
pNodeList = pDoc->selectNodes(L"//name");

CString outTotalString;
for(int i = 0; i < pNodeList->length; i++) {
 CString outString;
 outString.Format("[검색결과] 노드명:%s, 노드값:%s\r\n",
  (LPCTSTR)pNodeList->Getitem(i)->GetnodeName(),
  (LPCTSTR)pNodeList->Getitem(i)->Gettext());
 outTotalString.Append(outString);
}
AfxMessageBox(outTotalString);

나머지 노드값 변경하는 방법,
속성값 읽어 오기 및 변경 방법 등을 정리 해야 함.

테스트 소스 :

Posted by gsi
:

설정방법 :
1. MSXML 4.0을 설치한다.

2. VC++ 디렉토리  설정부분에서 include, lib를 설정해 준다.

3. MFC Dialog로 프로젝트 생성시 "자동화" 를 체크 해준다.
   3.1. 아마도 이런 코드가 더 추가되는거 같다. 다른 코드가 더 있는지는 잘 모르겠다.
// 이 매크로는 COleObjectFactory 생성자에 대한 bMultiInstance 매개 변수에 TRUE를
// 전달하는 점만 제외하면 IMPLEMENT_OLECREATE와 같습니다.
// 자동화 컨트롤러에서 요청한 각 자동화 프록시 개체에 대해 이 응용 프로그램에 대한 별도의 인스턴스가 시작되도록 합니다.
#ifndef IMPLEMENT_OLECREATE2
#define IMPLEMENT_OLECREATE2(class_name, external_name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
 AFX_DATADEF COleObjectFactory class_name::factory(class_name::guid, \
  RUNTIME_CLASS(class_name), TRUE, _T(external_name)); \
 const AFX_DATADEF GUID class_name::guid = \
  { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } };
#endif // IMPLEMENT_OLECREATE2

4. stdafx.h 파일에 아래의 코드를 추가한다.
#import <msxml4.dll>
using namespace MSXML2;

5. 테스트로 OK 버튼에 아래와 같은 내용을 추가 해서 테스트를 진행한다.
void CReadXML2Dlg::OnBnClickedOk()
{
 MSXML2::IXMLDOMDocument2Ptr pDoc; // XML Document 선언
 MSXML2::IXMLDOMProcessingInstructionPtr pPI; // XML ProcessingInstruction 선언
 MSXML2::IXMLDOMElementPtr pRootElement; // XML Element 선언
 MSXML2::IXMLDOMElementPtr pElement;
 MSXML2::IXMLDOMTextPtr pText; // XML Text 선언
 pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument)); // 인스턴스 생성
 pPI=pDoc->createProcessingInstruction(L"xml",L"version=\"1.0\" encoding=\"euc-kr\""); // PI 생성
 pRootElement=pDoc->createElement(L"IRC"); // Root element 생성
 pElement=pDoc->createElement(L"Nick"); // "Nick" element 생성
 pText=pDoc->createTextNode(L"wiluby"); // "wiluby" text element 생성
 pDoc->appendChild(pPI); // ProcessingIsntruction 추가
 pElement->appendChild(pText); // text element를 "Nick" element에 추가
 pRootElement->appendChild(pElement); // "Nick" element를 root element에 추가
 pDoc->appendChild(pRootElement); // Root element를 문서에 추가
 AfxMessageBox(pDoc->xml); // XML 내용을 보자!!
 //
 OnOK();
}

그럼 아래와 같은 내용의 대화 상자가 나오게 된다.

사용자 삽입 이미지

그리고 제 환경이 그러서인지는 모르겠다. 2008을 깔고, .net 3.5를 다 깐 상태라서 MSXML 6.0이라는 폴더가 만들어져 있는 상태이다.

그래서 위의 코드 처름 스마트 포인터 형태의 IXMLDOMProcessingInstructionPtr  이런 변수들을 그냥 사용하면 아래와 같은 내용의 에러가 나오게 된다.

d:\temp\ReadXML2\ReadXML2\ReadXML2Dlg.cpp(205) : error C2872: 'IXMLDOMProcessingInstructionPtr' : 모호한 기호입니다.
        'c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\comdefsp.h(1261) : _com_ptr_t<_IIID> IXMLDOMProcessingInstructionPtr'일 수 있습니다.
        with
        [
            _IIID=_com_IIID<IXMLDOMProcessingInstruction,& _GUID_2933bf89_7b36_11d2_b20e_00c04f983e60>
        ]
        또는       'd:\temp\ReadXML2\ReadXML2\Debug\msxml4.tlh(298) : MSXML2::IXMLDOMProcessingInstructionPtr'일 수 있습니다.

아무래도 네임 스페이스 쪽의 충돌인지 선언이 안되어서 그런지는 잘 모르겠다.
하지만 위의 코드 처름 MSXML2:: 를 붙여 주면 해결이 된다.

이상.
 

Posted by gsi
:

MSXML 설치파일

C++ 2007. 12. 6. 09:18 |

xml을 읽기 위해서 필요한 데이터 파일

설치파일 :


Posted by gsi
:

DataGridView dgv = ...
dgv 라고 객체를 생성 했다고 햇을때.

DataSet에서 값을 가져 오고,
현재 Row를 선택 했을때 SelectedIndex 같은 프로퍼티가 제공되지 않는거 같아요.
그래서 현재 구현한 방법은 아래와 같습니다.

자세한 코드 내용은 저도 잘 모르겠네요.
혹시 아시면 코멘트 부탁 드려요.

DataGridView dgv = sender as DataGridView;
//MessageBox.Show("선택한 Row=" + dgv.SelectedCells[0].RowIndex.ToString());

DataTable dtItem = azitro_testDataSet.Tables[0];
DataRow rwItem = dtItem.Rows[dgv.SelectedCells[0].RowIndex];


이상.
Posted by gsi
: