none
MFC 다이얼로그 화면 갱신과 관련하여 문의드립니다... RRS feed

  • 질문

  • 안녕하세요
    제가 "easysize.h" 파일을 사용해서 resizing을 구현하였습니다...
    "easysize.h" 파일은 코드 프로젝트에서 구하였습니다...

    그런데 "easysize.h" 방법은 깜빡임이 심해서 WS_CLIPCHILDREN | WS_CLIPSIBLINGS 플래그를 추가하였습니다,

    그랬더니 깜빡임 증상은 없어졌는데 화면이 갱신이 안되서 resizing 할때 잔상이 남습니다.
    그래서 RedrawWindow()함수를 OnSize() 함수에 추가하였는데 아무런 반응이 없어서

    RedrawWindow(NULL, NULL, RDW_NOCHILDREN | RDW_NOERASE | RDW_INVALIDATE);
    를 추가하였더니 화면 갱신은 되는데 다시 감빡임 현상이 발생하네요...ㅠㅜ

    파일 첨부가 안되서 제가 작성한 소스 하단에 적어놓았습니다.

    많은 조언 부탁드립니다...

     

    =======================================================================================================

    // EasySizeDemoDlg.cpp : implementation file
    //

    #include "stdafx.h"
    #include "EasySizeDemo.h"
    #include "EasySizeDemoDlg.h"

    #ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif

    /////////////////////////////////////////////////////////////////////////////
    // CAboutDlg dialog used for App About

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

    // Dialog Data
     //{{AFX_DATA(CAboutDlg)
     enum { IDD = IDD_ABOUTBOX };
     //}}AFX_DATA

     // ClassWizard generated virtual function overrides
     //{{AFX_VIRTUAL(CAboutDlg)
     protected:
     virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
     //}}AFX_VIRTUAL

    // Implementation
    protected:
     //{{AFX_MSG(CAboutDlg)
     //}}AFX_MSG
     DECLARE_MESSAGE_MAP()
    };

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

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

    BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
     //{{AFX_MSG_MAP(CAboutDlg)
      // No message handlers
      
     //}}AFX_MSG_MAP
    END_MESSAGE_MAP()

    /////////////////////////////////////////////////////////////////////////////
    // CEasySizeDemoDlg dialog

    CEasySizeDemoDlg::CEasySizeDemoDlg(CWnd* pParent /*=NULL*/)
     : CDialog(CEasySizeDemoDlg::IDD, pParent)
    {
     //{{AFX_DATA_INIT(CEasySizeDemoDlg)
      // NOTE: the ClassWizard will add member initialization here
     //}}AFX_DATA_INIT
     // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
     m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    }

    void CEasySizeDemoDlg::DoDataExchange(CDataExchange* pDX)
    {
     CDialog::DoDataExchange(pDX);
     //{{AFX_DATA_MAP(CEasySizeDemoDlg)
     // NOTE: the ClassWizard will add DDX and DDV calls here
     //}}AFX_DATA_MAP
     DDX_Control(pDX, IDC_LOG_LIST, _list);
    }

    BEGIN_MESSAGE_MAP(CEasySizeDemoDlg, CDialog)
     //{{AFX_MSG_MAP(CEasySizeDemoDlg)
     ON_WM_SYSCOMMAND()
     ON_WM_PAINT()
     ON_WM_QUERYDRAGICON()
     ON_WM_SIZE()
     ON_WM_SIZING()
    // ON_WM_ERASEBKGND()
     //}}AFX_MSG_MAP
    END_MESSAGE_MAP()

    BEGIN_EASYSIZE_MAP(CEasySizeDemoDlg)
     EASYSIZE(IDC_LOG_LIST, ES_BORDER, ES_BORDER, ES_BORDER, ES_BORDER, 0)
     EASYSIZE(IDC_EXPORT_BUTTON, ES_BORDER, ES_KEEPSIZE, ES_KEEPSIZE, ES_BORDER, 0)
     EASYSIZE(IDC_PRINT_BUTTON, ES_BORDER, ES_KEEPSIZE, ES_KEEPSIZE, ES_BORDER, 0)
     EASYSIZE(IDCANCEL, ES_KEEPSIZE, ES_KEEPSIZE, ES_BORDER, ES_BORDER, 0)
    END_EASYSIZE_MAP

    /////////////////////////////////////////////////////////////////////////////
    // CEasySizeDemoDlg message handlers

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

     // Add "About..." menu item to system menu.

     // IDM_ABOUTBOX must be in the system command range.
     ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
     ASSERT(IDM_ABOUTBOX < 0xF000);

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

     // Set the icon for this dialog.  The framework does this automatically
     //  when the application's main window is not a dialog
     SetIcon(m_hIcon, TRUE);   // Set big icon
     SetIcon(m_hIcon, FALSE);  // Set small icon
     
     INIT_EASYSIZE;

     _list.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_HEADERDRAGDROP);

     _list.InsertColumn(0, _T("Name"), LVCFMT_LEFT, 100);
     _list.InsertColumn(1, _T("평균"), LVCFMT_LEFT, 100);
     _list.InsertColumn(2, _T("석차"), LVCFMT_LEFT, 100);

     _list.InsertItem(0, _T("AA"));
     _list.InsertItem(1, _T("BB"));
     _list.InsertItem(2, _T("CC"));

     _list.EnableWindow(true);
     
     return TRUE;  // return TRUE  unless you set the focus to a control
    }

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

    // If you add a minimize button to your dialog, you will need the code below
    //  to draw the icon.  For MFC applications using the document/view model,
    //  this is automatically done for you by the framework.

    void CEasySizeDemoDlg::OnPaint()
    {
     if (IsIconic())
     {
      CPaintDC dc(this); // device context for painting

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

      // Center icon in client rectangle
      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;

      // Draw the icon
      dc.DrawIcon(x, y, m_hIcon);
     }
     else
     {
      CDialog::OnPaint();
     }
    }

    // The system calls this to obtain the cursor to display while the user drags
    //  the minimized window.
    HCURSOR CEasySizeDemoDlg::OnQueryDragIcon()
    {
     return (HCURSOR) m_hIcon;
    }

    void CEasySizeDemoDlg::OnSize(UINT nType, int cx, int cy)
    {
     
     UPDATE_EASYSIZE;
    // RedrawWindow(NULL, NULL, RDW_NOCHILDREN | RDW_NOERASE | RDW_INVALIDATE);
    // ::RedrawWindow(m_hWnd, 0, 0, RDW_ERASE | RDW_INVALIDATE);
     RedrawWindow(NULL, NULL, RDW_NOCHILDREN | RDW_NOERASE | RDW_INVALIDATE);
    // RedrawWindow();
     CDialog::OnSize(nType, cx, cy);
    }

    void CEasySizeDemoDlg::OnSizing(UINT fwSide, LPRECT pRect)
    {
     CDialog::OnSizing(fwSide, pRect);
     EASYSIZE_MINSIZE(280,250,fwSide,pRect);
    }

    // BOOL CEasySizeDemoDlg::OnEraseBkgnd(CDC* pDC)
    // {
    //  return FALSE ;
    // }

    2010년 3월 15일 월요일 오후 12:52