다이얼로그 베이스에서 초기 실행시 다이얼로그 감추기

WM_WINDOWPOSCHANGING 메시지를 사용하시면 됩니다.

클래스 위자드에서 발생시키시면 되는데 아마없을거에요..

그럴땐 가장 오른쪽 Class Info에서

Message filter을 window로 바꿔줍니다..



그리고 생성된 함수에

다음과 같이 코딩하세요..



void CHideDialogDlg::OnWindowPosChanging(WINDOWPOS FAR* lpwndpos)

{

    CDialog::OnWindowPosChanging(lpwndpos);

  

    // TODO: Add your message handler code here

    lpwndpos->flags &= ~SWP_SHOWWINDOW;

}



이렇게 하면 다이얼로그가 보이지 않습니다..물론 깜박거리지도 않습니다..

그런데..나타나게 할수도 없습니다..



따라서 나타나게 하시려면..나타나게 하는 메뉴에..

BOOL 형식으로 변수하나 지정해주시고..



    if(!m_bShowFlag)

        lpwndpos->flags &= ~SWP_SHOWWINDOW;

VC++ 에서 만든 MFC ActiveX 가 그런거 같더군여.. 비베로 만든 ActiveX 는 안그런걸로 알고 있습니다..

암튼.. 해결 방법은

일일히 해당 컨트롤들을 Invalidate 해주는 방법이 있는데 이것도 깔끔하게는 안되더군여..

그래서 정법을 소개합니다.. 이걸로 하니 깔끔하게 잘되더군여..



/////

1.. 먼저  헤더파일에..



public:

virtual BOOL OnSetObjectRects(LPCRECT lpRectPos, LPCRECT lpRectClip);   //오버라이드



private:

void    MyGetClippingCoordinates(LPCRECT pPosRect, LPCRECT pClipRect,

                      LPRECT pIntersectRect, LPPOINT pOffsetPoint);







2. CPP 파일에...



void CxxxCtrl::MyGetClippingCoordinates(LPCRECT pPosRect, LPCRECT pClipRect,

                        LPRECT pIntersectRect, LPPOINT pOffsetPoint)

{

    int clipLeft = 0;

    int clipTop = 0;



    if ((pClipRect == NULL) || IsRectEmpty(pClipRect))

    {

        CopyRect(pIntersectRect, pPosRect);

    }

    else

    {

        IntersectRect(pIntersectRect, pPosRect, pClipRect);

        clipLeft = pClipRect->left;

        clipTop = pClipRect->top;

    }



    pOffsetPoint->x = min(0, pPosRect->left - clipLeft);

    pOffsetPoint->y = min(0, pPosRect->top - clipTop);

}





BOOL CxxxCtrl::OnSetObjectRects(LPCRECT lprcPosRect, LPCRECT lprcClipRect)

{

    ASSERT(lprcPosRect != NULL);



    // Remember the position rectangle for later

    m_rcPos = *lprcPosRect;



    // Calculate complete rectangle including the tracker (if present)

    CRect rectPos = m_rcPos;

    if (m_bUIActive && m_pRectTracker != NULL)

    {

        // Save new clipping rectangle (for DestroyTracker)

        if (lprcClipRect != NULL)

            m_pRectTracker->m_rectClip = *lprcClipRect;



        // Adjust tracker rectangle to new dimensions

        CRect rectTmp = rectPos;

        rectTmp.OffsetRect(-rectTmp.left, -rectTmp.top);

        m_pRectTracker->m_rect = rectTmp;



        // Adjust the "true" rectangle to include handles/hatching

        UINT nHandleSize = m_pRectTracker->m_nHandleSize - 1;

        rectPos.InflateRect(nHandleSize, nHandleSize);

    }



    // Now clip that rectangle as appropriate

    CRect rectClip;



    // CHANGE - call your own copy of _GetClippingCoordinates

    MyGetClippingCoordinates(rectPos, lprcClipRect, rectClip, &m_ptOffset);



    // Move outer window first. then inner window



    if (!m_bInPlaceSiteWndless)

    {

        CWnd* pWndOuter = GetOuterWindow();

        

        //BEGIN CHANGE

        if (pWndOuter != NULL)

        {



               ::MoveWindow(pWndOuter->m_hWnd, rectPos.left, rectPos.top,

                    rectPos.Width(), rectPos.Height(), TRUE);

        }

        //END CHANGE                                

        if (pWndOuter != this)

            MoveWindow(0, 0, rectPos.Width(), rectPos.Height());

    }



    return TRUE;

}
CTestApp, CMainFrame, CTestDoc, CTestView

Afx 로 시작하는 것들은 전역함수들 이니까..
실은 어디에서나 사용 가능하겠죠....

◎ CTestApp에서
CMainFrame* pFrame = (CMainFrame*)AfxGetMainWnd();
CTestDoc* pDoc = (CTestDoc*)((CMainFrame*)AfxGetMainWnd())->GetActiveDocument();
CTestView* pView = (CTestView*)((CMainFrame*)AfxGetMainWnd())->GetActiveView();

◎ CMainFrame에서
CTestApp* pApp = (CTestApp*)AfxGetApp();
CTestDoc* pDoc = (CTestDoc*)GetActiveDocument();
CTestView* pView = (CTestView*)GetActiveView();

◎ CTestDoc에서
CTestApp* pApp = (CTestApp*)AfxGetApp();
CMainFrame* pFrame = (CMainFrame*)AfxGetMainWnd();
CTestView* pView = (CTestView*)((CMainFrame*)AfxGetMainWnd())->GetActiveView();

◎ CTestView에서
CTestApp* pApp = (CTestApp*)AfxGetApp();
CMainFrame* pFrame = (CMainFrame*)AfxGetMainWnd();
                  or (CMainFrame*)GetParent();
CTestDoc* pDoc = (CTestDoc*)((CMainFrame*)AfxGetMainWnd())->GetActiveDocument();
              or (CTestDoc*)GetDocument();


메인 -> doc -> 뷰 -> 기타 잡스러운 헤더 순으로 include!

About DLL part 1 (DLL의 종류)

Program Visual C++ 2005. 8. 25. 11:04 Posted by HisPark
About DLL part 1   (DLL의 종류)

대략 두가지 정도로 구분할수가 있습니다.


  1.일반 DLL

   통상적으로 일반 DLL은 C++ 이외의 프로그램에서도 사용할수 있지만 형태가 C함수 형태를

   가져야 하기 때문에  C++의 클래스나 오버로딩된 함수들은 내부에서만 사용할수 있고

   외부에서 호출하수 없습니다.

    * 연결방식으로는 정적 연결과 공유연결이있습니다.

       정적 연결방식은 배포시 제약이 거의 없지만 공유 연결방식은 MFC DLL을 공유하기때문에
      
       배포시에는 관련 MFC DLL도 포함해서 배포해야합니다.


  2. 확장 DLL

    우선 MFC 프로그램에서만 사용이 가능하고 C++의 클래스도 익스포트가 가능합니다.

    또한 장점으로는 MFC에서 사용하는 각종 리소스를 사용가능하다는것 입니다.

     * 연결방식은 정적연결을 지원하지 않고 공유연결방식만 사용가능합니다.