窗口绘制问题

ojc520520 2014-10-17 06:51:03
绘制了标题了,但为什么当打开CFileDialog弹出文件对话框的时候标题栏会闪出原来被覆盖的标题栏;怎么才可以让被覆盖的标题栏不闪出来;

本了是这样的

但打开文件对话框后编程这样的了,但是一闪而过


代码都在这里了,其它都是向导默认生成的;
LRESULT Ctest2Dlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
if (message==WM_MOVE||message==WM_PAINT||message==WM_NCPAINT||message==WM_NCACTIVATE ||message == WM_NOTIFY)
{
CDC* pWinDC = GetWindowDC();
if (pWinDC)
DrawTitleBar(pWinDC);
ReleaseDC(pWinDC);
}
return CDialogEx::WindowProc(message, wParam, lParam);
}


void Ctest2Dlg::DrawTitleBar(CDC *pDC)
{

CRect reWin;
GetWindowRect(reWin);
CBitmap bit;
bit.LoadBitmap(IDB_BITMAP1);
CBrush brush(RGB(77, 77, 77));
pDC->SelectObject(brush);
pDC->PatBlt(0,0, reWin.Width(), GetSystemMetrics(SM_CYCAPTION)+10, PATCOPY);
//CDC memdc;
//memdc.CreateCompatibleDC(pDC);
//memdc.SelectObject(bit);
//pDC->StretchBlt(0,0,reWin.Width(), GetSystemMetrics(SM_CYCAPTION)+6,&memdc, 0,0,48,3,MERGECOPY);

}

void Ctest2Dlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
CFileDialog OpenFileDlg(TRUE,NULL,NULL,0);
if(OpenFileDlg.DoModal() == IDOK)
{
//........
}
return;
}
...全文
113 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
schlafenhamster 2014-10-18
  • 打赏
  • 举报
回复
或者:LRESULT CMyFileOpenDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) { // TODO: Add your specialized code here and/or call the base class if (message==WM_NCPAINT||message==WM_NCACTIVATE) { DrawCaption(); return 1; } return CDialog::WindowProc(message, wParam, lParam); } void CMyFileOpenDlg::DrawCaption() { CDC* pWinDC = GetWindowDC(); CRect reWin; GetWindowRect(reWin); reWin.OffsetRect(-reWin.left,-reWin.top); //reWin.bottom=reWin.top+23; CBitmap bit; bit.LoadBitmap(IDB_BITMAP1); CBrush brush; brush.CreatePatternBrush(&bit); pWinDC->SelectObject(brush); pWinDC->PatBlt(3,3,reWin.Width()-6,GetSystemMetrics(SM_CYCAPTION),PATCOPY); pWinDC->SetBkMode(TRANSPARENT); pWinDC->TextOut(6,6,"SelfDraw Caption",16); ReleaseDC(pWinDC); }
schlafenhamster 2014-10-18
  • 打赏
  • 举报
回复
void CMyDlg::OnNcPaint() { // TODO: Add your message handler code here CDC* pWinDC = GetWindowDC(); CRect reWin; GetWindowRect(reWin); reWin.OffsetRect(-reWin.left,-reWin.top); //reWin.bottom=reWin.top+23; CBitmap bit; bit.LoadBitmap(IDB_BITMAP1); CBrush brush; brush.CreatePatternBrush(&bit); pWinDC->SelectObject(brush); pWinDC->PatBlt(3,3,reWin.Width()-6,GetSystemMetrics(SM_CYCAPTION),PATCOPY); pWinDC->SetBkMode(TRANSPARENT); pWinDC->TextOut(6,6,"SelfDraw Caption",16); ReleaseDC(pWinDC); // Do not call CDialog::OnNcPaint() for painting messages } void CMyDlg::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized) { CDialog::OnActivate(nState, pWndOther, bMinimized); // TODO: Add your message handler code here OnNcPaint(); }
ojc520520 2014-10-18
  • 打赏
  • 举报
回复
引用 5 楼 schlafenhamster 的回复:
void CMyDlg::OnNcPaint() { // TODO: Add your message handler code here CDC* pWinDC = GetWindowDC(); CRect reWin; GetWindowRect(reWin); reWin.OffsetRect(-reWin.left,-reWin.top); //reWin.bottom=reWin.top+23; CBitmap bit; bit.LoadBitmap(IDB_BITMAP1); CBrush brush; brush.CreatePatternBrush(&bit); pWinDC->SelectObject(brush); pWinDC->PatBlt(3,3,reWin.Width()-6,GetSystemMetrics(SM_CYCAPTION),PATCOPY); pWinDC->SetBkMode(TRANSPARENT); pWinDC->TextOut(6,6,"SelfDraw Caption",16); ReleaseDC(pWinDC); // Do not call CDialog::OnNcPaint() for painting messages } void CMyDlg::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized) { CDialog::OnActivate(nState, pWndOther, bMinimized); // TODO: Add your message handler code here OnNcPaint(); }
谢谢
ojc520520 2014-10-17
  • 打赏
  • 举报
回复
引用 3 楼 CometNet 的回复:
你这样绘制不乱才怪.不同的消息需要不同的处理,返回不同的值. 既然你自己绘制了,就得返回某些值,让系统不再处理相同消息才行. 比如WM_NCPAINT,你画一次,画完了调用WindowProc让系统再画一次? 应该直接返回0才对. WM_NCACTIVATE 应该返回TRUE 另外:WM_NCPAINT中最好调用 GetDCEx 获取 DC
case WM_NCPAINT:
{
    HDC hdc;
    hdc = GetDCEx(hwnd, (HRGN)wParam, DCX_WINDOW|DCX_INTERSECTRGN);
    // Paint into this DC
    ReleaseDC(hwnd, hdc);
    return 0;
}
具体查一下MSDN吧,每个消息都有详细说明,绝对不能这样乱用.
论坛今天老登入超时! 偶像出现了;一直有看你的博客; 能帮我解决上面问题吗,就打开文件对话框标题栏不会闪。
邓学彬 2014-10-17
  • 打赏
  • 举报
回复
你这样绘制不乱才怪.不同的消息需要不同的处理,返回不同的值. 既然你自己绘制了,就得返回某些值,让系统不再处理相同消息才行. 比如WM_NCPAINT,你画一次,画完了调用WindowProc让系统再画一次? 应该直接返回0才对. WM_NCACTIVATE 应该返回TRUE 另外:WM_NCPAINT中最好调用 GetDCEx 获取 DC
case WM_NCPAINT:
{
    HDC hdc;
    hdc = GetDCEx(hwnd, (HRGN)wParam, DCX_WINDOW|DCX_INTERSECTRGN);
    // Paint into this DC
    ReleaseDC(hwnd, hdc);
    return 0;
}
具体查一下MSDN吧,每个消息都有详细说明,绝对不能这样乱用.
ojc520520 2014-10-17
  • 打赏
  • 举报
回复
引用 1 楼 redui 的回复:
你这绘制时机完全混乱,通常都是在PAINT类型的消息里面绘制,干嘛还要在MOVE之类的非绘制消息中绘制?何况不同消息里获取DC的方式也是不同的
我看网上的代码都是这样的,那我把WndProc中的其它消息都删除了,只剩下WM_PAINT情况还是会出现;
redui 2014-10-17
  • 打赏
  • 举报
回复
你这绘制时机完全混乱,通常都是在PAINT类型的消息里面绘制,干嘛还要在MOVE之类的非绘制消息中绘制?何况不同消息里获取DC的方式也是不同的

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧