Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ window正在不断地进行WM_WindowPosChange_C++_Winapi_Atl_Wtl - Fatal编程技术网

C++ window正在不断地进行WM_WindowPosChange

C++ window正在不断地进行WM_WindowPosChange,c++,winapi,atl,wtl,C++,Winapi,Atl,Wtl,我已经创建了一个窗口,并在父窗口中嵌入了一个CAxWindow 当我创建主窗口时,我也创建CAxWindow窗口。现在的问题是,我已经在我的主窗口中添加了WM_WindowPosChangeing消息,并且不断地调用它。最初,它被称为右坐标值,但一段时间后,它被称为wit x=0,y=0,width和height=0 知道为什么会这样吗 若我把断点放在onWindowPosChanged中,我可以看到pwp->x=0,pwp->y=0,pwp->cx=0,pwp->cy=0 这是代码 #incl

我已经创建了一个窗口,并在父窗口中嵌入了一个CAxWindow

当我创建主窗口时,我也创建CAxWindow窗口。现在的问题是,我已经在我的主窗口中添加了WM_WindowPosChangeing消息,并且不断地调用它。最初,它被称为右坐标值,但一段时间后,它被称为wit x=0,y=0,width和height=0

知道为什么会这样吗

若我把断点放在onWindowPosChanged中,我可以看到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;
}
#包括
#包括
#包括
C模块(U模块);
//要创建ATL窗口,首先从CWindowImpl派生。
类CMainWindow:公共CWindowImpl
{
公众:
CMainWindow(const RECT RECT);
虚拟~CMainWindow();
//启用表驱动的WndProc。
开始消息映射(CMainWindow)
消息处理程序(WM\U PAINT、OnPaint)
消息处理程序(WM_MOUSEMOVE、OnMouseMove)
消息处理程序(WM\U设置焦点、OnSetFocus)
消息处理程序(WM\U KILLFOCUS、OnKillFocus)
消息处理程序(WM\U CREATE,OnCreate)
消息处理程序(WM_WindowPosChanged、OnWindowPosChanged)
END_MSG_MAP()
LRESULT OnPaint(UINT uMsg、WPARAM WPARAM、LPARAM LPARAM、BOOL和bHandled);
移动鼠标的结果(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 onWindowPosChanged(UINT uMsg、WPARAM WPARAM、LPARAM LPARAM、BOOL和bHandled);
私人:
CAxWindow m_wndIE;
RECT m_RECT;
};
LRESULT CMainWindow::OnWindowPosChanged(UINT uMsg、WPARAM WPARAM、LPARAM LPARAM、BOOL和bHandled)
{
WINDOWPOS*pwp=(WINDOWPOS*)LPRAM;
如果(pwp)
{
设置窗口位置(NULL,pwp->x,pwp->y,pwp->cx,pwp->cy,SWP|u SHOWWINDOW | SWP|u NOMOVE | SWP|u NOZORDER | SWP|u nocopybit);
}
bHandled=FALSE;
返回0;
}
LRESULT CMainWindow::OnCreate(UINT uMsg、WPARAM WPARAM、LPARAM LPARAM、BOOL&bHandled)
{
创建(m|hWnd,m|Rect,NULL,WS|u CHILD | WS|u CLIPCHILDREN | WS|u CLIPSIBLINGS | WS|u TABSTOP | WS|u BORDER);
m_wndIE.CreateControl(L“{8856F961-340A-11D0-A96B-00C04FD705A2}”,空,空);
bHandled=false;
返回0;
}
//在客户区中绘制一些居中文本。
LRESULT CMainWindow::OnSetFocus(UINT uMsg、WPARAM WPARAM、LPARAM LPARAM、BOOL&bHandled)
{
bHandled=false;
返回0;
}
//在客户区中绘制一些居中文本。
LRESULT CMainWindow::OnKillFocus(UINT uMsg、WPARAM WPARAM、LPARAM LPARAM、BOOL&bHandled)
{
bHandled=false;
返回0;
}
//在客户区中绘制一些居中文本。
LRESULT CMainWindow::OnMouseMove(UINT uMsg、WPARAM WPARAM、LPARAM LPARAM、BOOL&bHandled)
{
//消息框(“OnMouseMove”,“MB_OK”);
bHandled=false;
返回0;
}
//在客户区中绘制一些居中文本。
LRESULT CMainWindow::OnPaint(UINT uMsg、WPARAM WPARAM、LPARAM LPARAM、BOOL&bHandled)
{
//本例使用了大量Win32 API调用。
//请参阅联机帮助(如有必要)。
PAINTSTRUCT-ps;
开始粉刷(&ps);
HDC HDC=GetDC();
矩形r;
GetClientRect&r;
DrawText(hDC,“我的ATL窗口”、-1、&r、DT_单线|
DT|U VCENTER | DT|U CENTER);
EndPaint&ps;
释放DC(hDC);
返回0;
}
//创建并销毁此窗口。
CMainWindow::CMainWindow(const RECT RECT)
{
CopyRect(&m_Rect,&Rect);
////创建我的窗口。
//RECT rc={10,10,200,200};
//创建(空,rc,“我的ATL窗口”);
//显示窗口(SW_显示正常);
}
CMainWindow::~CMainWindow()
{
/*如果(m_hWnd)
破坏窗口()*/
}
//在风中;
int WINAPI WinMain(HINSTANCE hInst、HINSTANCE hPrevInst、,
PSTR szCommand,int iShow)
{
_Module.Init(NULL,hInst);
RECT RECT={200300300};
cmainwindowmw(rect);
mw.Create(NULL,rect,_T(“MyWindow”),
WS_重叠窗口(WS|u可见);
味精;
while(GetMessage(&msg,NULL,0,0))
{
翻译信息(&msg);
发送消息(&msg);
}
_Module.Term();
返回0;
}
这一行

m_wndIE.SetWindowPos(NULL, pwp->x, pwp->y, pwp->cx, pwp->cy, SWP_SHOWWINDOW | SWP_NOMOVE | SWP_NOZORDER |SWP_NOCOPYBITS);
看起来很可疑。WM_WindowPosChange发送给您,允许您的窗口否决可能的移动。转发消息几乎肯定会导致您的孩子IE窗口移出框架


对标志有一个简单的描述。

你能给我们看一下代码吗?它是某个项目的一部分,我不能共享整个代码。让我试着创建一些示例。检查
WINDOWPOS
结构的
flags
成员-其他成员如
x
y
并不总是有效/定义的。@0x499602D2我有添加了代码。@Alien01:67相当于
SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE
,这意味着
x
/
y
/
宽度
/
高度
无效。