+ -
当前位置:首页 → 问答吧 → 鼠标消息不响应

鼠标消息不响应

时间:2011-12-08

来源:互联网

情景:我有一个主窗口,主窗口上面我贴上一个无模式对话框。主对话框里面有个我写的CBackgroundWnd的变量,用来设置背景。
结果:上面的过程都实现了,不过主对话框上的按钮鼠标单击的时候无法响应,仅点在按钮上面的文字的时候才响应。比如说有个按钮是OK,点在"OK"这两个字符上才能响应,除这两个字符外都无法响应。我的代码如下:
CBackgroundWnd.h
C/C++ code

#pragma once


// CBackgroundWnd

class CBackgroundWnd : public CWnd
{
    DECLARE_DYNAMIC(CBackgroundWnd)

public:
    CBackgroundWnd();
    virtual ~CBackgroundWnd();

    BOOL    Create();
    void    SetBackgroundPic(const WCHAR* sBackgroundPic) { m_sBackgroundPic = sBackgroundPic; }
protected:
    DECLARE_MESSAGE_MAP()

    const WCHAR* m_sBackgroundPic;
public:
    afx_msg int OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT message);
    afx_msg BOOL OnEraseBkgnd(CDC* pDC);
    afx_msg void OnPaint();
    afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
};



CBackgroundWnd.cpp
C/C++ code

#include "stdafx.h"
#include "HomeServerControl.h"
#include "BackgroundWnd.h"


// CBackgroundWnd

IMPLEMENT_DYNAMIC(CBackgroundWnd, CWnd)

CBackgroundWnd::CBackgroundWnd() : m_sBackgroundPic(L"")
{

}

CBackgroundWnd::~CBackgroundWnd()
{
}


BEGIN_MESSAGE_MAP(CBackgroundWnd, CWnd)
    ON_WM_MOUSEACTIVATE()
    ON_WM_ERASEBKGND()
    ON_WM_PAINT()
    ON_WM_CTLCOLOR()
    ON_WM_NCHITTEST()
END_MESSAGE_MAP()



// CBackgroundWnd 消息处理程序
BOOL CBackgroundWnd::Create()
{
    // TODO: 在此添加专用代码和/或调用基类
    //注册窗口类
    CString className;
    try
    {
        className = AfxRegisterWndClass(NULL);
    }
    catch(CResourceException* pEx)
    {
        pEx->Delete();
        return false;
    }

    //创建窗口
    //设置为工具窗口可以使背景窗口不显示在任务栏中
    if(!CreateEx(WS_EX_TOOLWINDOW, className, NULL, WS_POPUP, 0, 0, 1, 1, NULL, NULL))
        return false;

    return true;    
    //    return CWnd::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext);
}

int CBackgroundWnd::OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT message)
{
    // TODO: 在此添加消息处理程序代码和/或调用默认值
    //屏蔽鼠标激活
    //背景窗口位于主窗口下方,不能被激活
//    return MA_NOACTIVATE;
    return MA_NOACTIVATEANDEAT;
    //    return CWnd::OnMouseActivate(pDesktopWnd, nHitTest, message);
}

BOOL CBackgroundWnd::OnEraseBkgnd(CDC* pDC)
{
    // TODO: 在此添加消息处理程序代码和/或调用默认值
/*    if (wcslen(m_sBackgroundPic) == 0)
    {
        return CWnd::OnEraseBkgnd(pDC);
    }

    Image img(m_sBackgroundPic);
    Bitmap bitmap(img.GetWidth(), img.GetHeight());
    Graphics graphics(&bitmap);
    Graphics graphicsDisplay(pDC->m_hDC);

    graphics.DrawImage(&img, 0, 0, img.GetWidth(), img.GetHeight());

    // 把缓冲区内容搬到前台显示
    graphicsDisplay.DrawImage(&bitmap, 0, 0, img.GetWidth(), img.GetHeight());
*/
/*    CRect rect;  
    GetClientRect(&rect);
    //加载背景位图
    CBitmap bitmap;
    bitmap.LoadBitmap(m_nBackgroundID);

    //创建内存DC
    CDC dc;
    dc.CreateCompatibleDC(pDC);

    //选择位图
    CBitmap* pOldBitmap=dc.SelectObject(&bitmap);

    //绘制位图
    pDC->BitBlt(0,0,rect.Width(),rect.Height(),&dc,0,0,SRCCOPY);

    //恢复原有位图
    dc.SelectObject(pOldBitmap);
*/
//    return TRUE;

    return CWnd::OnEraseBkgnd(pDC);
}

void CBackgroundWnd::OnPaint()
{
    CPaintDC dc(this); // device context for painting
    // TODO: 在此处添加消息处理程序代码
    // 不为绘图消息调用 CWnd::OnPaint()

    Image img(m_sBackgroundPic);
    Bitmap bitmap(img.GetWidth(), img.GetHeight());
    Graphics graphics(&bitmap);
    Graphics graphicsDisplay(dc.m_hDC);

    graphics.DrawImage(&img, 0, 0, img.GetWidth(), img.GetHeight());

    // 把缓冲区内容搬到前台显示
    graphicsDisplay.DrawImage(&bitmap, 0, 0, img.GetWidth(), img.GetHeight());
}

HBRUSH CBackgroundWnd::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    HBRUSH hbr = CWnd::OnCtlColor(pDC, pWnd, nCtlColor);

    // TODO:  在此更改 DC 的任何属性
    
    // TODO:  如果默认的不是所需画笔,则返回另一个画笔
    return hbr;
}



主对话框的调用:
C/C++ code

void CSetupInti::DrawBackground()
{
    m_backgroundWnd.SetBackgroundPic(Constant::sInstallerBackground1);

    //设置分层窗口
    LONG style=::GetWindowLong(GetSafeHwnd(),GWL_EXSTYLE);
    style|=WS_EX_LAYERED;
    style=::SetWindowLong(GetSafeHwnd(),GWL_EXSTYLE,style);
    style=::GetWindowLong(GetSafeHwnd(),GWL_EXSTYLE);
    //获得窗口默认背景色
    COLORREF bkColor=::GetSysColor(COLOR_3DFACE);
    
    //设置分层窗口属性
    SetLayeredWindowAttributes(bkColor, 100, LWA_COLORKEY);

    //创建背景窗口
    m_backgroundWnd.Create();
}



end:
请大牛指导,谢谢!

作者: shaozg168   发布时间: 2011-12-08

应该是响应了,只是没有触发重绘。要不你在点击按钮时,弹出一个MessageBox试试。

作者: chinatcp   发布时间: 2011-12-08

是响应了,我说的情况是:假如一个按钮上面没有文字,点击却不响应。谢谢

作者: shaozg168   发布时间: 2011-12-08

是不是背景图挡住了你主窗口,你置顶主窗口看看?或者你加载了背景图后,然后主窗口setfocus

作者: linyongzuo   发布时间: 2011-12-08

上面代码没有看到相应按钮点击的代码嘛,贴出来看看。

作者: chinatcp   发布时间: 2011-12-08


点击按钮的代码如下:
C/C++ code

// continue 按钮
void CSetupInti::OnBnClickedNext()
{
    SetNextValue();
    ShowDlgByState();
}


作者: shaozg168   发布时间: 2011-12-08

是背景完全覆盖了子窗口。

作者: shaozg168   发布时间: 2011-12-08

热门下载

更多