1、先说说你在WM_LBUTTONDOWN时做了什么小动作吧
2、再说说你是不是处理了WM_PAINT消息

解决方案 »

  1.   

    LRESULT CPE_parsingDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
    {
    // TODO: 在此添加专用代码和/或调用基类
    if (!::IsWindow(m_hWnd))
    return CDialogEx::WindowProc(message, wParam, lParam); if(message == WM_MOVE || message == WM_PAINT || message == WM_NCPAINT /*|| message == WM_NCACTIVATE */
    || message == WM_NOTIFY )
    {             _DrawMainDlg();
     M_DrawSystemButton();
    }
      return CDialogEx::WindowProc(message, wParam, lParam);
    }void CPE_parsingDlg::OnPaint()//这里什么都没做,向导默认的
    {
    if (IsIconic())
    {
    CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // 使图标在工作区矩形中居中
    int cxIcon = GetSystemMetrics(SM_CXICON);
    int cyIcon = GetSystemMetrics(SM_CYICON);
    CRect rect;
    GetClientRect(&rect);
    int x = (rect.Width() - cxIcon + 1) / 2;
    int y = (rect.Height() - cyIcon + 1) / 2; // 绘制图标
    dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {

    CDialogEx::OnPaint();

    }


    }void CPE_parsingDlg::OnNcLButtonDown(UINT nHitTest, CPoint point)
    {
    // TODO: 在此添加消息处理程序代码和/或调用默认值 //这里的代码只是响应鼠标点击最小按钮的时候改变按钮的颜色,但不知道为什么如果点击按钮不放的话
    //一开始会变颜色,但过2、3秒又变回原来的颜色了。
    CRect rtWin;
    GetWindowRect(&rtWin); CRect temp;
    temp = m_rtButton[H_MinmumButton];
    temp.OffsetRect(rtWin.TopLeft());
    HDC hdc;
    hdc = ::GetWindowDC(m_hWnd);
    if(temp.PtInRect(point))
    {
        BitBlt(hdc, m_rtButton[2].left, m_rtButton[2].top,18, 18,
    hdc, m_rtButton[2].left, m_rtButton[2].top, DSTINVERT);
    } CDialogEx::OnNcLButtonDown(nHitTest, point);
    }
      

  2.   

    先告诉你当你扩大窗口时windows干了什么:
    windows标记了窗口中原始部分仍然有效,但是比原始部分大的窗口区域无效,即invalidate region是新窗口rect减去源窗口rect,然后发现窗口有无效区域,给窗口发送了WM_PAINT,窗口接收到WM_PAINT进入你的wndproc程序,根据你的判断条件,调用了
    _DrawMainDlg();
    M_DrawSystemButton();
    (先不去管这部分是否会又设置了窗口无效区域)
    然后你调用了原来的wndproc,原来的wndproc处理WM_PAINT时调用了BeginPaint(), 在BeginPaint()中系统会SendMessage发送WM_NCPAINT,又一次进入该窗口的wndproc,你又调用了_DrawMainDlg(); M_DrawSystemButton();画了一遍再交给原来的wndproc处理这个WM_NCPAINT。当WM_NCPAINT返回后,BeginPaint()继续发送WM_ERASEBKGND(), 再次进入你的wndproc,幸亏或不幸这次你没有再重画,直接交给原来的wndproc处理,原来的wndproc调用画刷充填了背景,虽然只影响wm_paint时系统指出的无效部分--啊哦,看来把你新画的边框给清了--很明显你画边框时仍然使用了老的窗口大小所以这部分边框画到client区域了。然后BeginPaint()返回,WM_PAINT消息处理继续调用了OnPaint()画client部分。从上面的过程可以发现问题就出在你的_DrawMainDlg()或M_DrawSystemButton()中,即使这两个函数你一个都没贴。
      

  3.   

    在windows 95/NT 4.0时代,当你点住鼠标拖动一个窗口时,这个窗口并不会跟着而是生成了这个灰色边框跟着鼠标走,在你松开鼠标后窗口才会在新地方重画,后续所有windows都继承了这个特性--尽管不是默认操作(忘了通过什么选项可以设置成这样),因此你点住标题栏,外面出现的那个灰色边框是很正常的现象