2013-10-08 89 views
0

我已經創建了一個窗口並在該父窗口中嵌入了一個CAxWindow。窗口不斷獲取WM_WINDOWPOSCHANGING

當我創建主窗口時,我還創建CAxWindow窗口。 NOW問題是我在主窗口中添加了WM_WINDOWPOSCHANGING消息,並且它不斷被調用。最初,它使用正確的座標值調用,但一段時間後,它被稱爲機智x = 0,y = 0,寬度和高度= 0。

任何想法爲什麼會發生這種情況?

如果我把斷點OnWindowPosChanging,看得出pwp-> x = 0時,pwp-> y = 0的,pwp-> CX = 0,pwp-> CY = 0

這裏是代碼

#include <atlbase.h> 
#include <atlwin.h> 
#include <atlcom.h> 
CComModule _Module; 

// To create an ATL window, begin by deriving from CWindowImpl<>. 
class CMainWindow : public CWindowImpl<CMainWindow, CWindow, 
    CWinTraits<WS_CAPTION | WS_POPUPWINDOW | WS_VISIBLE, 0 > > 
{ 
public: 
    CMainWindow(const RECT rect); 
    virtual ~CMainWindow(); 
    // Enable a table driven WndProc. 
    BEGIN_MSG_MAP(CMainWindow) 
     MESSAGE_HANDLER(WM_PAINT, OnPaint) 
     MESSAGE_HANDLER(WM_MOUSEMOVE,OnMouseMove) 
     MESSAGE_HANDLER(WM_SETFOCUS,OnSetFocus) 
     MESSAGE_HANDLER(WM_KILLFOCUS,OnKillFocus) 
     MESSAGE_HANDLER(WM_CREATE,OnCreate) 
     MESSAGE_HANDLER(WM_WINDOWPOSCHANGING, OnWindowPosChanging) 
    END_MSG_MAP() 
     LRESULT OnPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); 
     LRESULT OnMouseMove(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); 
     LRESULT OnSetFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); 
     LRESULT OnKillFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); 
     LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); 
     LRESULT OnWindowPosChanging(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); 


private: 
    CAxWindow m_wndIE; 
    RECT m_Rect; 
}; 
LRESULT CMainWindow ::OnWindowPosChanging(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) 
{ 
    WINDOWPOS* pwp= (WINDOWPOS*)lParam; 
    if (pwp) 
    { 
     m_wndIE.SetWindowPos(NULL, pwp->x, pwp->y, pwp->cx, pwp->cy, SWP_SHOWWINDOW | SWP_NOMOVE | SWP_NOZORDER |SWP_NOCOPYBITS); 
    } 

    bHandled= FALSE; 
    return 0; 
} 

LRESULT CMainWindow::OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) 
{ 
    m_wndIE.Create(m_hWnd, m_Rect, NULL, WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_TABSTOP |WS_BORDER); 
    m_wndIE.CreateControl(L"{8856F961-340A-11D0-A96B-00C04FD705A2}", NULL, NULL); 


    bHandled = false; 
    return 0; 
} 

// Paint some centered text into the client area. 
LRESULT CMainWindow:: OnSetFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) 
{ 

    bHandled = false; 
    return 0; 
} 
// Paint some centered text into the client area. 
LRESULT CMainWindow:: OnKillFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) 
{ 

    bHandled = false; 
    return 0; 
} 
// Paint some centered text into the client area. 
LRESULT CMainWindow:: OnMouseMove(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) 
{ 
    //MessageBox("OnMouseMove","",MB_OK); 
    bHandled = false; 
    return 0; 
} 

// Paint some centered text into the client area. 
LRESULT CMainWindow:: OnPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) 
{ 
    // This example makes use of a number of Win32 API calls. 
    // See online help (if necessary). 
    PAINTSTRUCT ps; 
    BeginPaint(&ps); 
    HDC hDC = GetDC(); 
    RECT r; 
    GetClientRect(&r); 
    DrawText(hDC, "My ATL Window", -1, &r, DT_SINGLELINE | 
      DT_VCENTER | DT_CENTER); 
    EndPaint(&ps); 
    ReleaseDC(hDC); 
    return 0; 
} 

// Create and destroy this window. 
CMainWindow::CMainWindow(const RECT rect) 
{ 
    CopyRect(&m_Rect,&rect); 
// // Create my window. 
    //RECT rc= {10, 10, 200, 200}; 
// Create(NULL, rc, "My ATL Window"); 
// ShowWindow(SW_SHOWNORMAL); 
} 


CMainWindow::~CMainWindow() 
{ 
    /* if(m_hWnd) 
      DestroyWindow();*/ 
} 
//CMainWindow theWind; 

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, 
       PSTR szCommand, int iShow) 
{ 
    _Module.Init(NULL,hInst); 
    RECT rect={ 200,200,300,300}; 
    CMainWindow mw(rect); 
    mw.Create(NULL,rect,_T("MyWindow"), 
     WS_OVERLAPPEDWINDOW | WS_VISIBLE); 

    MSG msg; 
    while(GetMessage(&msg,NULL,0,0)) 
    { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
    } 


    _Module.Term(); 
return 0; 
} 
+0

你能告訴我們代碼嗎? – 0x499602D2

+0

它是一些項目的一部分,我不能共享整個代碼。讓我嘗試創建一些示例。 – anand

+0

檢查'WINDOWPOS'結構的'flags'成員 - 其他成員如'x'和'y'不總是有效/定義的。 –

回答

1

此行

m_wndIE.SetWindowPos(NULL, pwp->x, pwp->y, pwp->cx, pwp->cy, SWP_SHOWWINDOW | SWP_NOMOVE | SWP_NOZORDER |SWP_NOCOPYBITS); 

看起來非常可疑。 WM_WINDOWPOSCHANGING被髮送給你,以允許你的窗口否決可能的移動。轉發消息幾乎肯定會導致您的孩子的IE窗口移出框架。

MSDN有一個標誌的簡單描述。