태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.


2009/03/10 13:51

두 개의 Rich Edit 컨트롤의 수직 스크롤바 동기화시키기

두 개의 Rich Edit 컨트롤의 수직 스크롤바를 동기화 시킬 수 있도록 서브클래싱한 Rich Edit 컨트롤 소스입니다.

둘 중에 하나라도 수직스크롤바를 동작시키면 다른 하나도 동시에 동작합니다.

CRichEditCtrlEx.h


#pragma once

#include "afxcmn.h"

 

struct VSCROLL_DATA

{

    UINT nSBCode;

    UINT nPos;

    CScrollBar *pScrollBar;

};

 

class CRichEditCtrlEx :

    public CRichEditCtrl

{

//    DECLARE_DYNAMIC(CRichEditCtrlEx)

 

protected:

    DECLARE_MESSAGE_MAP()

 

public:

    CRichEditCtrlEx(void);

    ~CRichEditCtrlEx(void);

 

    HWND m_pWnd;

    CRichEditCtrlEx *m_pSyncScrollEdit;

    BOOL m_bManualScroll;

 

 

    afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar *pScrollBar);

};


CRichEditCtrlEx.cpp


#include "StdAfx.h"

#include "RichEditCtrlEx.h"

 

#define    WM_MY_VSCROLL    WM_USER + 10

 

CRichEditCtrlEx::CRichEditCtrlEx(void)

{

    m_pWnd = NULL;

    m_pSyncScrollEdit = NULL;

    m_bManualScroll = FALSE;

}

 

CRichEditCtrlEx::~CRichEditCtrlEx(void)

{

}

 

BEGIN_MESSAGE_MAP(CRichEditCtrlEx, CRichEditCtrl)

    ON_WM_VSCROLL()

END_MESSAGE_MAP()

//

//

//void CRichEditCtrlEx::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)

//{

//    // TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.

//

//    CDialog::OnVScroll(nSBCode, nPos, pScrollBar);

//}

 

void CRichEditCtrlEx::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar *pScrollBar)

{

    if(m_pSyncScrollEdit != NULL && m_bManualScroll == FALSE)

    {

        m_pSyncScrollEdit->m_bManualScroll = TRUE;

        m_pSyncScrollEdit->OnVScroll(nSBCode, nPos, pScrollBar);

        m_pSyncScrollEdit->m_bManualScroll = FALSE;

    }

 

    VSCROLL_DATA* vData = (VSCROLL_DATA*)malloc(sizeof(VSCROLL_DATA));

 

    vData->nPos = nPos;

    vData->nSBCode = nSBCode;

    vData->pScrollBar = pScrollBar;

 

    ::SendMessage(m_pWnd, WM_MY_VSCROLL, (WPARAM)this->GetSafeHwnd(), (LPARAM)vData);

 

    free(vData);

 

    CRichEditCtrl::OnVScroll(nSBCode, nPos, pScrollBar);

}


다이얼로그에서


BOOL CCompareSchemaDialog::OnInitDialog()

{

    CDialog::OnInitDialog();

 

    // 스크롤바 동기화

    m_srcScript.m_pWnd = this->GetSafeHwnd();

    m_tarScript.m_pWnd = this->GetSafeHwnd();

    m_srcScript.m_pSyncScrollEdit = &m_tarScript;

    m_tarScript.m_pSyncScrollEdit = &m_srcScript;

 

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

}


Trackback 0 Comment 0