'MFC&ActiveX'에 해당되는 글 40건
- 2008/10/08 DirectoryPath (폴더 선택) 선택하기
- 2008/10/08 File Save, Open Dialog
- 2008/08/21 [MFC] 폴더만 탐색 및 xml 데이터 생성
- 2008/08/20 [MFC] XML의 계층구조 데이터를 읽어 들이는 코드 (GetchildNodes, getAttribute, nextNode)
- 2008/07/30 [MFC] CScrollView와 줌인 줌아웃 처리.
- 2008/07/09 [MFC] CxImage 1비트 이미지 만들기...
- 2008/06/25 [MFC, DLL] Image를 그레이 스케일 버퍼로 생성후 그려주는 다이얼로그 소스
- 2008/06/23 [MFC, DLL] Image를 표시해 주는 다이얼로그 소스
- 2008/06/06 C++용 CxImage 6.0 - Library 코드
- 2008/06/04 [C++] 파일 암호화/복호화 처리하기 - [펌]
- 2008/05/20 [MFC] MemDC 코드, 펌자료입니다. ^^
- 2008/05/20 [MFC] GDI+ 초기 설정 코드
- 2008/05/20 [MFC Copy Code] 마우스 이벤트, 드래그시 화면 객체를 상태 좌표로 이동시키기
- 2008/04/01 [MFC] CView 에 CStatic를 자식으로 추가해서 처리할때 Flicker 현상.. 이렇게 막아야 하나. (1)
- 2008/03/26 [MFC] CScrollView 에 CView 를 추가 하면 어떻게 될까요? (2)
void ChoiceDirectoryPath(char* pathFolder)
{
ASSERT( pathFolder );
sprintf( pathFolder, "" );
//CString m_strDirPath;
ITEMIDLIST *pidlBrowse;
char pszPathname[MAX_PATH];
BROWSEINFO BrInfo;
BrInfo.hwndOwner = NULL; //GetSafeHwnd();
BrInfo.pidlRoot = NULL;
memset( &BrInfo, 0, sizeof(BrInfo) );
BrInfo.pszDisplayName = (LPSTR)pszPathname;
BrInfo.lpszTitle = _T("폴더를 선택해 주세요.");
BrInfo.ulFlags = BIF_RETURNONLYFSDIRS;
// 다이얼로그 뛰우기
pidlBrowse = SHBrowseForFolder(&BrInfo);
if(pidlBrowse != NULL)
{
BOOL bSuccess = ::SHGetPathFromIDList(pidlBrowse, (LPSTR)pszPathname);
if( bSuccess )
{
sprintf( pathFolder, "%s", pszPathname );
}
}
}
// 사용할때
char szDirectory[MAX_PATH];
ZeroMemory( szDirectory, sizeof(szDirectory) );
ChoiceDirectoryPath( szDirectory );
if( strlen(szDirectory) <= 0 )
return 0;
void CDlgProgPage::OnBnClickedBtnProgBackgroundload()
{
// 이미지 로드 - 여기에 오픈 다이얼로그를 적용해야징.
// 이미지가 로드 되고 나면 화면을 업데이트 한다.
CFileDialog OpenDlg( TRUE, "Add Files", "*.*", OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_ALLOWMULTISELECT,
"Bitmap Files(*.*)|*.bmp|Jpeg Files(*.*)|*.jpg|PNG Files(*.*)|*.png|AVI Files(*.*)|*.avi|All Files(*.*)|*.*|" );
if( OpenDlg.DoModal() == IDOK )
{
// 이미지 정보를 View로 보낸다.
g_ProgView->SetBackgroundImage(GetImage(OpenDlg.GetPathName()));
// 백그라운드 이미지가 있다면 체크박스 속성을 활성화 한다.
CheckBackgroundImage();
}
}
특정 폴더를 기준으로 하위 폴더를 찾아 내는 코드 입니다.
그리고 그 폴더 내용을 xml 형태로 만들어 주는 코드도 포함되어 있습니다.
xml 데이터로 만들어진 내용은 CEdit 컨트롤에 표시되며, 그 내용을
저장할 수 있습니다.
하위 폴더를 검색하는 코드 표시하기
폴더탐색 및 트리노드 추가 표시하기
트리 노드 전체 탐색 표시하기
트리노드탐색 및 xml 생성 표시하기
CEdit 내용을 파일에 기록 표시하기
관련 소스 :.
[MFC] XML의 계층구조 데이터를 읽어 들이는 코드 (GetchildNodes, getAttribute, nextNode)

MFC에서 xml 데이터를 읽어 들이는 예제입니다.
아래의 내용을 계층구조를 통해서 읽어 들이게 됩니다.
자세한 소스는 소스 코드를 참조 하세요.
- XmlParser.h, cpp
[xml 샘플]
<?xml version="1.0" encoding="EUC-KR"?>
<PATHS>
<PATH NAME="Install Files">
<PATH NAME="Dev">
</PATH>
<PATH NAME="Dev2">
</PATH>
<PATH NAME="Dev3">
<PATH NAME="Dev3_a">
</PATH>
<PATH NAME="Dev3_b">
<PATH NAME="Dev3_b_a">
</PATH>
<PATH NAME="Dev3_b_b"/>
</PATH>
</PATH>
</PATH>
<PATH NAME="temp">
<PATH NAME="temp_a"/>
<PATH NAME="temp_b">
<PATH NAME="temp_b_a">
</PATH>
<PATH NAME="temp_b_b">
<PATH NAME="temp_b_c"/>
</PATH>
</PATH>
</PATH>
</PATHS>
계층 구조를 읽어 들이는 코드 (재귀호출)
1. 초기화 및 도입부
///
MSXML2::IXMLDOMNodePtr nodeList = m_pDoc->selectSingleNode( Token.c_str() );
_bstr_t bsElements("PATHS");
if ( nodeList )
FindName( nodeList->GetchildNodes() );
nodeList.Release();
2. 재귀호출 부분
int tabCount = 0;
HRESULT CXmlParser::FindName( MSXML2::IXMLDOMNodeListPtr& lparam )
{
long elementCount = lparam->Getlength();
for( int i = 0; i < elementCount; i++ )
{
MSXML2::IXMLDOMElementPtr Element = lparam->nextNode();
if( Element == NULL )
break;
_bstr_t bsNodename = Element->GetnodeName();
_bstr_t bsElement("PATH");
if( bsNodename == bsElement )
{
_bstr_t bsname("NAME");
_variant_t varElementName = Element->getAttribute(bsname);
// 해당하는 엘러먼트 Name의 이름 == 폴더 이름을 의미한다.
CString strName;
strName.Format( "%S", varElementName.bstrVal );
// 탭 카운터를 통한 출력
CString strTabMergy;
for( int tc = 0; tc < tabCount; tc++ )
{
strTabMergy += "\t";
}
strTabMergy += strName;
TRACE( "%s\n", (LPSTR)(LPCSTR)strTabMergy);
MSXML2::IXMLDOMNodeListPtr childElementlist = Element->GetchildNodes();
if( childElementlist )
{
tabCount++;
FindName( childElementlist );
}
}
Element.Release();
}
tabCount--;
lparam.Release();
return S_OK;
}
아래의 콘솔 화면 내용입니다.
소스 코드 :
.
[MFC] Ruler 소스.. 메모리 DC 사용한 자연스러운 효과구현..
중점 :
- 줌인 줌아웃 처리를 위한 float 변수를 하나 추가 했습니다.
- ScrollView의 페이지 크기를 저장하는 CSize 변수를 하나 추가 했습니다.
- 방향키 UP, DOWN 을 사용해서 줌인, 줌아웃 처리를 보여 줍니다.
이제 설명을 시작하겠습니다.
Ruler 보완
Ruler의 기존 소스를 보게 되면 마우스로 스크롤 할때 Ruler가 따라 가지 않습니다.
기존 코드를 볼가요?
// 기본 Ruler
CRect rulerRect;
rulerRect.left = scrollPosition.x;
rulerRect.right = rulerRect.left + curArea.Width();
rulerRect.top = scrollPosition.y;
rulerRect.bottom = rulerRect.top + 20;
m_RulerHorz.Draw( pDC, rulerRect.left, rulerRect.top, rulerRect.Width(), rulerRect.Height(), scrollPosition.x );
분명히 scrollPosition.y를 해줬는데도 안됩니다.
이걸 해결 하기 위해서는 휠을 움직여서 화면을 업데이트 한 것이기 때문에
아래의 OnMouseWheel함수를 오버라이드(?) 해서 Invalidate()를 해줘야 됩니다.
BOOL CRulerSampleView::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
{
Invalidate();
return CScrollView::OnMouseWheel(nFlags, zDelta, pt);
}
그리고 Scroll의 Bar를 움직여도 화면이 업데이트 되어야 하기 때문에 아래의 함수들도 같이 처리
void CRulerSampleView::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
Invalidate( true );
CScrollView::OnHScroll(nSBCode, nPos, pScrollBar);
}
void CRulerSampleView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
Invalidate( true );
CScrollView::OnVScroll(nSBCode, nPos, pScrollBar);
}
이렇게 하고 나면 휠 또는 스크롤바를 움직여도 Ruler가 자연스럽게 화면에 보이는걸 알 수 있습니다.
자자..
이제 줌인 줌아웃 처리를 해볼까요..
줌인 줌아웃 처리를 위해서 아래의 코드를 RulerSampleView.h 에 추가 합니다.
CSize m_PageSize;
float m_Zoom;
그리고 RulerSampleView.cpp 에는 아래와 같이 해봅시다.
> 우선 줌 성분 초기화를 생성자 함수에 추가
m_Zoom = 1.f;
> ScrollVew이기 때문에 페이지의 크기를 추가
void CRulerSampleView::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();
m_PageSize = CSize( 1000, 1000 );
SetScrollSizes(MM_TEXT, m_PageSize);
}
> 드로잉 코드에 m_Zoom을 적절하게 수정해 줍니다.
테스트를 위한 위치값을 10개를 생성했습니다. 이건 코드 보시면 알수 있어요..
드로잉 할때 아래와 같이 처리 합니다.
vector< CPoint >::iterator iter;
for( iter = m_TestData.begin(); iter != m_TestData.end(); iter++ )
{
CRect rect;
rect.left = (*iter).x;
rect.top = (*iter).y;
rect.right = rect.left + 50;
rect.bottom = rect.top + 50;
rect.left *= m_Zoom;
rect.top *= m_Zoom;
rect.right *= m_Zoom;
rect.bottom *= m_Zoom;
pDC->FillRect( &rect, &redbrush );
}
위의 붉은 부분을 m_Zoom으로 곱해줍니다.
> 이렇게 하고 나서 이제 이벤트를 추가해줘야 겠죠.
방향키를 통해서 줌인 줌아웃 성분을 증가 감소 합니다.
void CRulerSampleView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
if( nChar == VK_UP )
{
m_Zoom -= 0.1f;
CClientDC dc(this);
m_RulerHorz.CreateDC( &dc, 10000, 20, m_Zoom );
m_PageSize = CSize( 1000*m_Zoom, 1000*m_Zoom );
SetScrollSizes(MM_TEXT, m_PageSize);
Invalidate();
}
if( nChar == VK_DOWN )
{
m_Zoom += 0.1f;
CClientDC dc(this);
m_RulerHorz.CreateDC( &dc, 10000, 20, m_Zoom );
m_PageSize = CSize( 1000*m_Zoom, 1000*m_Zoom );
SetScrollSizes(MM_TEXT, m_PageSize);
Invalidate();
}
CScrollView::OnKeyDown(nChar, nRepCnt, nFlags);
}
위의 코드에서 보듯이 Ruler도 줌 성분이 달라지면, Ruler의 줌 성분을 보정해서 메모리 DC를 생성합니다.
그리고 ScrollView의 페이지도 m_Zoom에 따라서 사이즈를 제조정 해줍니다.
이렇게 하면 아래와 같은 프로그램을 만들 수 있습니다.
관련샘플 :
.
.
흑백의 이미지를 CxImage로 만들때 8비트, 24비트의 이미지로 만들 필요가 없습니다.
이때 1비트의 이미지로 해도 충분한 공간이 나온다는 얘긴데요.
아래의 코드는 1비트의 이미지를 생성하는 코드 입니다.
void GToleranceImage::MakeBuffer2Image()
{
SAFE_DELETE( _pbuffer2Image );
assert( _pbuffer2Image == NULL );
// 넓이와 폭을 사용해서 이미지 버퍼를 생성합니다.
// 이때 1비트의 이미지로 설정합니다.
_pbuffer2Image = new CxImage( _width, _height, 1, CXIMAGE_FORMAT_BMP );
// 이미지의 팔레트를 지정합니다.
// 흑백 이미지를 만들거기 때문에 0번과 1번 팔레트를 설정합니다.
_pbuffer2Image->SetPaletteColor(0, RGB(0, 0, 0));
_pbuffer2Image->SetPaletteColor(1, RGB(255, 255, 255));
// 해당 내용을 추가합니다.
// SetPixelColor로 하지 않고, SetPixelIndex로 하게 됩니다.
for( int y = 0; y < _height; y++ )
{
for( int x = 0; x < _width; x++ )
{
BYTE color = _bufferXY[y][x];
if( color == 255 )
_pbuffer2Image->SetPixelIndex( x, y, 1 );
else
_pbuffer2Image->SetPixelIndex( x, y, 0 );
}
}
_pbuffer2Image->Flip();
}
[MFC, DLL] Image를 그레이 스케일 버퍼로 생성후 그려주는 다이얼로그 소스

그레이 스케일로 표현해주는 코드가 일부 들어가 있는 소스입니다.
MFC DLL 형태로 제작되어 있으며, 바로 이전의 게시물과 거의 동일한 구조입니다.
몇가지 단위 테스트를 위해서 제작된 샘플 프로젝트입니다.
관련 소스 :
.
MFC DLL : 한장의 이미지를 보여 주는 dll 파일입니다.
현재 jpg의 파일만 인코딩이 가능합니다.
(이 부분은 확장자를 사용해서 처리 하시면 됩니다. 아직 그건 추가 하지 않았네요. )
사용시에는 아래의 코드를 이용 하시면 됩니다.
dlg.DoModal();
이외의 생성자 인자로서는 해당 width, height를 입력해줄 수 있으며,
내부 코드에서는 해당 다이얼로그에 맞도록 리셈플링 처리가 되어 있습니다.
실행파일 :
.
프로젝트 파일 :
.

http://www.codeproject.com/KB/graphics/cximage.aspx
CxImage 6.0 Full 코드를 컴파일 해서
png, jpg, bmp, gif 를 지원하도록 처리 해서 생성해 놓은 코드 임.
.
데이터 암호화 방법
| 1.요약 데이터를 암호화하는 방법에는 여러가지가 있는데 가장 간단한 방법이 배타적 논리합(Exclusive OR)를 이용하는 방법이 있습니다. 이 방법은 너무 간단해서 보안에 치명적이죠. 특별한 암호방법을 고안해낼려면 그쪽 분야에 많은 연구와 노력이 필요한데 저를 포함해 대부분 암호화에 대한 지식이 거의 전무할겁니다. 저같은 사람들을 위해 MS에서 암호화를 위한 API를 제공하고 있습니다. 하지만 이것도 사용하기가 너무 복잡하고 여러 단계를 거져야하는 불편함이 있습니다. 그래서 최대한 사용하기 간단하게 Class로 만들어 보았습니다. 2.본문 먼저 암호에 필요한 API함수는 어떤것이 있는지 알아보겠습니다. BOOL WINAPI CryptAcquireContext(HCRYPTPROV *phProv, LPCTSTR Container, LPCTSTR pszProvider, DWORD dwProvType, DWORD dwFlags); BOOL WINAPI CryptCreateHash(HCRYPTPROV hProv, ALG_ID Algid, CRYPTKEY hKey, DWORD dwFlags, HCRYPTHASH *phHash); BOOL WINAPI CryptHashData(HCRYPTHASH hHash, BYTE *pbData, DWORD dwDataLen, DWORD dwFlags); BOOL WINAPI CryptDeriveKey(HCRYPTPROV hProv, ALG_ID Algid, HCRYPTHASH hBaseData, DWORD dwFlags, HCRYPTKEY *phKey); BOOL WINAPI CryptEncrypt(HCRYPTKEY hKey, HCRYPTHASH hHash, BOOL Final, DWORD dwFlags, BYTE *pbData, DWORD *pdwDataLen, DWORD dwBufLen); BOOL WINAPI CryptDecrypt(HCRYPTKEY hKey, HCRYPTHASH hHash, BOOL Final, DWORD dwFlags, BYTE *pbData, DWORD *pdwDataLen); 자세한 사용법은 MSDN을 참고하세요. 이러한 API의 사용법을 설명하지 않겠습니다. 사실 저도 자세히는 모름니다. Class 멤버 함수와 사용법을 소개드리겠습니다. BOOL CCrypt::Create(LPBYTE pHashData, DWORD dwHashDataLen)- 암호화나 해독에 필요한 Key를 생성하는 함수. 쉽게 여기에 Password가 들어간다고 생각하면 됩니다. void CCrypt::Destroy()- Create에서 만들어진 Handle을 제거합니다. BOOL CCrypt::Encrypt(LPBYTE lpBuffer, DWORD& dwBufferLen, BOOL bFanal)- 데이터를 암호화하는 함수 BOOL CCrypt::Decrypt(LPBYTE lpBuffer, DWORD& dwBufferLen, BOOL bFanal)- 암호화된 데이터를 해독하는 함수 3.예제 dwDataLen = strPassword.GetLength(); CopyMemory(lpData, (LPVOID)(LPCTSTR)strPassword, strPassword.GetLength()); // 암호화 CCrypt Crypt; Crypt.Create((LPBYTE)(LPCTSTR)strPassword, strPassword.GetLength()); Crypt.Encrypt(lpData, dwDataLen); Crypt.Destroy(); // 암호화된 데이터 해독 Crypt.Create((LPBYTE)(LPCTSTR)strPassword, strPassword.GetLength()); Crypt.Decrypt(lpData, dwDataLen); lpData[dwDataLen] = '\0'; |
헤더 파일에 추가하세요.
#ifndef _MEMDC_H_
#define _MEMDC_H_
//////////////////////////////////////////////////
// CMemDC - memory DC
//
// Author: Keith Rule
// Email: keithr@europa.com
// Copyright 1996-1999, Keith Rule
//
// You may freely use or modify this code provided this
// Copyright is included in all derived versions.
//
// History - 10/3/97 Fixed scrolling bug.
// Added print support. - KR
//
// 11/3/99 Fixed most common complaint. Added
// background color fill. - KR
//
// 11/3/99 Added support for mapping modes other than
// MM_TEXT as suggested by Lee Sang Hun. - KR
//
// This class implements a memory Device Context which allows
// flicker free drawing.
class CMemDC : public CDC {
protected:
CBitmap m_bitmap; // Offscreen bitmap
CBitmap* m_oldBitmap; // bitmap originally found in CMemDC
CDC* m_pDC; // Saves CDC passed in constructor
CRect m_rect; // Rectangle of drawing area.
BOOL m_bMemDC; // TRUE if CDC really is a Memory DC.
void Construct(CDC* pDC)
{
ASSERT(pDC != NULL);
// Some initialization
m_pDC = pDC;
m_oldBitmap = NULL;
m_bMemDC = !pDC->IsPrinting();
if (m_bMemDC) {
// Create a Memory DC
CreateCompatibleDC(pDC);
pDC->LPtoDP(&m_rect);
m_bitmap.CreateCompatibleBitmap(pDC, m_rect.Width(), m_rect.Height());
m_oldBitmap = SelectObject(&m_bitmap);
SetMapMode(pDC->GetMapMode());
pDC->DPtoLP(&m_rect);
SetWindowOrg(m_rect.left, m_rect.top);
} else {
// Make a copy of the relevent parts of the current DC for printing
m_bPrinting = pDC->m_bPrinting;
m_hDC = pDC->m_hDC;
m_hAttribDC = pDC->m_hAttribDC;
}
// Fill background
FillSolidRect(m_rect, pDC->GetBkColor());
}
// TRK begin
public:
CMemDC(CDC* pDC ) : CDC() { pDC->GetClipBox(&m_rect); Construct(pDC); }
CMemDC(CDC* pDC, const RECT& rect) : CDC() { m_rect = rect ; Construct(pDC); }
// TRK end
virtual ~CMemDC()
{
if (m_bMemDC) {
// Copy the offscreen bitmap onto the screen.
m_pDC->BitBlt(m_rect.left, m_rect.top, m_rect.Width(), m_rect.Height(),
this, m_rect.left, m_rect.top, SRCCOPY);
//Swap back the original bitmap.
SelectObject(m_oldBitmap);
} else {
// All we need to do is replace the DC with an illegal value,
// this keeps us from accidently deleting the handles associated with
// the CDC that was passed to the constructor.
m_hDC = m_hAttribDC = NULL;
}
}
// Allow usage as a pointer
CMemDC* operator->()
{
return this;
}
// Allow usage as a pointer
operator CMemDC*()
{
return this;
}
};
#endif
헤더 선언 및 라이브러리 추가
#include <gdiplus.h>
using namespace Gdiplus;
#pragma comment(lib, "gdiplus.lib")
GDI+ 초기화
// Initialize GDI+.
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
GDI+ 객체 삭제
GdiplusShutdown(gdiplusToken);
[MFC Copy Code] 마우스 이벤트, 드래그시 화면 객체를 상태 좌표로 이동시키기

void CGDITestView::OnLButtonDown(UINT nFlags, CPoint point)
{
SetCapture();
m_oldPoint = point;
CView::OnLButtonDown(nFlags, point);
}
void CGDITestView::OnLButtonUp(UINT nFlags, CPoint point)
{
ReleaseCapture();
CView::OnLButtonUp(nFlags, point);
}
void CGDITestView::OnMouseMove(UINT nFlags, CPoint point)
{
if( GetCapture() == this )
{
m_realPos += (point - m_oldPoint);
m_oldPoint = point;
Invalidate();
}
CView::OnMouseMove(nFlags, point);
}
[MFC] CView 에 CStatic를 자식으로 추가해서 처리할때 Flicker 현상.. 이렇게 막아야 하나.

CStatic에는 해당 컬러 정보를 사용해서 드로잉이 되며, 마우스로 이동, 크기변경 등의 이벤트가
발생하게 되는데요.
이때 드로잉 되는 순서가 CView가 먼저 드로잉 되고, CStatic가 드로잉 되게 되면서
강한 Flicker 현상(번쩍임)이 발생을 하네요..
이것저것 처리를 해봐도 언뜻 보면 드로잉 순서로 인해서 어쩔 수 없을거 같다는 생각이 드네요.
그래서 조금 우회를 시켜서 CStatic의 드로잉 부분을 CView에 직접 그리기로 했습니다.
CStatic는 보이지는 않지만 자기 기능을 대신 하고 있는거구요.
이렇게 하니 Flicker는 해결이 되었네요 ^^..
원래 이렇게 하는걸까요?.. 아님 다른 방법이 있는 걸까요?
몇달 전부터 Scroll View 페이지를 응용한 개발툴을 몇개 작성을 하게 되었네요.
CView 보다 더 복잡하고, 스크롤이 들어 가면서 포지션 정보를 무시할 수 없더군요.
가장 귀찮게 여겨 지는 것은 Client Area 부분의 마우스가 Down, Up Move 등의 행위를 할때
항상 ScrollToPosition()을 달고 다녀야 한다는게 너무나 맘에 안들었습니다.
마우스의 위치 좌표가 왜 스크롤된 위치가 나오지 않고 현재 보이는 화면 영역의 상대 값이 나오는지.
정말 귀찮습니다.
그래서 CScrollView 클래스에 CView를 삽입 하고,
TotalSize 만큼 CView를 확장해서 처리를 하게 되었습니다.
스크롤 정보는 CSCrollView로 보내야 되고,
화면의 마우스 처리는 CView가 담당하게 처리 하였죠.
근데 .. 이렇게 하니 마우스의 좌표가 스크롤된후의 CView의 위치 정보가 보이게 되더군요.
참으로 편합니다. ^^ 그 위치가 스크롤된 화면 위치니까요.
조금더 나아지는 MFC 방법들이 재미나게 느껴 집니다.
요즘은 애매한 컨트롤은 CWnd, CStatic, CView, CDialog 등과 같은 컨트롤을
여러개 겹치면서 다양한 효과를 구현하고 있네요 ^^..
이번에 테스트뷰로 만들고 있는 화면입니다.
이 프로그램의 기능은 휠을 통한 좌우 스크롤 기능과 화면의 픽킹 처리가 CView에서 담당하는게 특징입니다.
배움에 있어서 여러가지 새로운 ms의 기술들과 플렉스 등을 보면서.
MFC의 기술 또한 같이 성장하는거 같습니다.
아.. 이제 자야 겠네요.. @.@.. 몽롱합니다.
TreeSample.zip
RulerSample.exe