컨테이너 프로잭트가 탑제될 프로잭트에 종속되는 형태이다

Container project
[v] Control(ActiveX etc) project
다이얼로그 베이스에서 초기 실행시 다이얼로그 감추기

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;

}
프로그램을 데몬처럼 실행하고 싶을 때는 다음과 같이 하면 됩니다.

명령어 &

여기서 '&'는 백그라운드로 실행하라는 뜻입니다.
그런데, 로그아웃하면 프로그램이 함께 끝나버리죠?

이럴때에는 nohup 이란 명령어를 사용하면 됩니다.

nohup 명령어 &

이렇게 하면 로그아웃을 하더라도 프로그램은 백그라운드로 계속 실행됩니다.


ex) msftp 라는 프로그램을 데몬으로 띄우고 싶을때..

  nohup ./msftp &

  이렇게 하시면 됩니다.