自绘窗体问题 1、先说说你在WM_LBUTTONDOWN时做了什么小动作吧2、再说说你是不是处理了WM_PAINT消息 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 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);} 先告诉你当你扩大窗口时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()中,即使这两个函数你一个都没贴。 在windows 95/NT 4.0时代,当你点住鼠标拖动一个窗口时,这个窗口并不会跟着而是生成了这个灰色边框跟着鼠标走,在你松开鼠标后窗口才会在新地方重画,后续所有windows都继承了这个特性--尽管不是默认操作(忘了通过什么选项可以设置成这样),因此你点住标题栏,外面出现的那个灰色边框是很正常的现象 长春, 防空警报响了 问个有点难度的问题,ListCtrl能否添加一个列,该列实际存在,但是不可见? 【关于界面的】请教关于编译代码中的一个消息问题 那位知道股票分析软件是怎样把多个指标窗口放在一个View中的? 怎样以最快的速度判断一个文件是否存在~谢谢,现场结贴 请问哪本VC++6.0的书最容易上手? 为什么同MIDL编译会出现错误? 怎样的到桌面的活动窗口? 编译时遇到的问题(和lib有关) 如何连接到Oracle win10上,安装vc6 sp6不成功。 发现我以前的一本老书,还有用吗?
{
// 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);
}
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()中,即使这两个函数你一个都没贴。