rt
我在DefWindowProc中回應WM_NCPAINT,在非客戶區貼圖,發現本來的系統選單項被覆寫,滑鼠移上去后才顯示,是什么問題?
uj5u.com熱心網友回復:
請大俠回復呀,搞不定uj5u.com熱心網友回復:
在非客戶區貼圖 帖哪里 ? 標題欄 ?移動 位置
uj5u.com熱心網友回復:
就是在最大化、最小化按鈕哪里用公司logo覆寫上,不用最大化,最小化按鈕,而且公司圖示比較大
uj5u.com熱心網友回復:
“最大化、最小化按鈕” 程式 創建 時 可以不要 的,uj5u.com熱心網友回復:
我沒說清楚,我的意思是要在最大化、最小化按鈕的位置填上公司的logo
uj5u.com熱心網友回復:
那 只能 再 繪制 一下 按鈕//
CRect rc;
rc.right = rcWin.Width();
rc.left = rc.right - sizeButton.cx;
rc.top = rcWin.top+3;
rc.bottom = sizeButton.cy+3;
//
pWinDC->DrawFrameControl(rc,DFC_CAPTION,DFCS_CAPTIONCLOSE);
rc.OffsetRect(-sizeButton.cx-3,0);
pWinDC->DrawFrameControl(rc,DFC_CAPTION,DFCS_CAPTIONMAX);
rc.OffsetRect(-sizeButton.cx,0);
pWinDC->DrawFrameControl(rc,DFC_CAPTION,DFCS_CAPTIONMIN);
uj5u.com熱心網友回復:
,問題描述不太清楚,如圖所示, 回應NCPAINT在黃色區域貼上公司logo后,系統選單項也被蓋上了,該怎么解決?
uj5u.com熱心網友回復:
系統選單項 ??選單條 ?
m_wndMenu.Invalidate
uj5u.com熱心網友回復:
試了半天,發現就是紅色區域不能重繪,切換視圖后選單也不會更新,選單項已經存在,就是必須滑鼠移動到上面才會顯示出來
uj5u.com熱心網友回復:
那就 看看 你的 代碼uj5u.com熱心網友回復:
LRESULT CMainFrame::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
if(message==WM_MOVE||message==WM_NCPAINT||message==WM_NCACTIVATE||message==WM_NOTIFY)
{
CDC *pWinDC=GetWindowDC();
if(pWinDC)
DrawFrame(pWinDC); //自定義重繪函式
ReleaseDC(pWinDC);
return TRUE;
}
else
return CFrameWnd::DefWindowProc(message, wParam, lParam);
}
void CMainFrame::DrawFrame(CDC* pDC)
{
CDC* pDisplayMemDC=new CDC;
pDisplayMemDC->CreateCompatibleDC(pDC);
//分別用于保存視窗位置、按鈕位置、框架位置和標題欄位置的臨時變數
CRect rtWnd,rtButtons,rtTitle, rtIcon;
////獲取視窗位置
GetWindowRect(&rtWnd);
//獲取標題欄位置
rtTitle.top=GetSystemMetrics(SM_CYFRAME);
rtTitle.left=GetSystemMetrics(SM_CXFRAME);
rtTitle.bottom=GetSystemMetrics(SM_CYFRAME)+GetSystemMetrics(SM_CYSIZE);
rtTitle.right=rtWnd.Width()-GetSystemMetrics(SM_CXFRAME);
//準備貼圖
CBitmap *pBitmap=new CBitmap;
BITMAP bm;
//準備重繪關閉按鈕
pBitmap->LoadBitmap(IDB_TKLOGO);
pBitmap->GetBitmap(&bm);
pDisplayMemDC->SelectObject(pBitmap);
//設定關閉按鈕位置
rtButtons.left=rtTitle.right-bm.bmWidth-5;
rtButtons.top=GetSystemMetrics(SM_CYFRAME)+(rtTitle.Height()-bm.bmHeight)/2;
rtButtons.right=rtButtons.left+bm.bmWidth;
rtButtons.bottom=rtButtons.top+bm.bmHeight-2;
//重繪關閉按鈕
pDC->BitBlt(rtButtons.left,rtButtons.top,rtButtons.Width(),rtButtons.Height(),pDisplayMemDC,0,0,SRCCOPY);
pBitmap->DeleteObject();
//準備重繪圖示
rtIcon.left = GetSystemMetrics(SM_CXFRAME);
rtIcon.top = GetSystemMetrics(SM_CYFRAME);
rtIcon.right = rtIcon.left+GetSystemMetrics(SM_CXSIZE);
rtIcon.bottom = rtIcon.top+GetSystemMetrics(SM_CYSIZE);
//::DrawIconEx(pDC->m_hDC, rtIcon.left, rtIcon.top, AfxGetApp()->LoadIcon(IDR_MAINFRAME),
// rtIcon.Width(), rtIcon.Height(), 0, NULL, DI_NORMAL);
//繪制標題
pDC->SetBkMode(TRANSPARENT);
CFont* pOldFont;
CFont ft;
ft.CreatePointFont(120, "宋體");
pOldFont = pDC->SelectObject(&ft);
pDC->DrawText(_T("XXXXX系統"),CRect(rtIcon.left,GetSystemMetrics(SM_CYFRAME)-6,400,GetSystemMetrics(SM_CYSIZE)+20),DT_NOCLIP|DT_SINGLELINE);
pDC->SelectObject(pOldFont);
ReleaseDC(pDisplayMemDC);
delete pDisplayMemDC;
delete pBitmap;
}
就做了這些操作,我有一個疑問,怎么去重繪非客戶區的特定區域,而不是整個非客戶區都重繪?
uj5u.com熱心網友回復:
試試
LRESULT CMainFrame::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
LRESULT ret=CFrameWnd::DefWindowProc(message, wParam, lParam);// 先 default
if(message==WM_MOVE||message==WM_NCPAINT||message==WM_NCACTIVATE||message==WM_NOTIFY)
{
CDC *pWinDC=GetWindowDC();
if(pWinDC) DrawFrame(pWinDC); //自定義重繪函式
ReleaseDC(pWinDC);
return TRUE;
}
// else
return ret;// CFrameWnd::DefWindowProc(message, wParam, lParam);
}
uj5u.com熱心網友回復:

bmp含 3個 按鈕 圖
uj5u.com熱心網友回復:
部分解決問題,但仍存在問題有兩個:
1. 選單項動態改變的時候仍不重繪(比如我有兩個視圖,切換到視圖2的時候選單項也要跟著改變,但這個不改變,仍需滑鼠移動上去才重繪)
2. 點擊選單彈出對話框時標題欄的背景色會被重繪成非預期的顏色
uj5u.com熱心網友回復:
DrawFrame(CDC* pDC) 只 繪制 logo 別的 繪制 取消 !uj5u.com熱心網友回復:
多次嘗試發現可能是代碼的版本問題引起的,源代碼是從VC6.0平臺遷移到VS2010平臺,CMainFram是從CFrameWnd繼承的;而VS2010下的CMainFram是從CFrameWndEx繼承的。在VS2010下新建一個SDI工程,使用上述代碼沒有問題
uj5u.com熱心網友回復:
怎么把選單欄移到標題欄,求指導uj5u.com熱心網友回復:
先關閉系統的標題欄;然后自繪標題欄。轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/62526.html
標籤:界面
上一篇:win7下VS2010 報錯
下一篇:Mini Word 2018 - Documenting and Viewing With Ease, Based On CRichEditCtrl
