終結mfc標題欄重繪

2021-06-07 18:05:13 字數 3418 閱讀 4772

1.如果需要加高標題欄(用於貼圖等),就要呼叫onnccalcsize追加部分空間(非客戶區間):

[cpp]view plain

copy

void cmy2011082302dlg::onnccalcsize(bool bcalcvalidrects, nccalcsize_params far* lpncsp)     

2.新增繪製標題欄函式drawtitlebar():

[cpp]view plain

copy

void cmy2011082302dlg::drawtitlebar(cdc *pdc)  

}  3.按鈕響應,訊息傳送/攔截等(系統訊息函式)

[cpp]view plain

copy

lresult cmy2011082302dlg::defwindowproc(uint message, wparam wparam, lparam lparam)   

return lrst;  

}  void cmy2011082302dlg::onnclbuttondown(uint nhittest, cpoint point)   

}  else

if (!iszoomed())  

default();  

}  void cmy2011082302dlg::onncmousemove(uint nhittest, cpoint point)   

else

rtbutton = m_rtbuttmax;  

rtbutton.offsetrect(-rtwnd.left, -rtwnd.top);  

poldbitmap=(cbitmap*)pdisplaymemdc->selectobject(pbitmap);  

pdc->bitblt(rtbutton.left, rtbutton.top, rtbutton.width(), rtbutton.height(), pdisplaymemdc, 0, 0, srccopy);  

pdisplaymemdc->selectobject(poldbitmap);  

pbitmap->deleteobject();  

//最小化button

if (m_rtbuttmin.ptinrect(point))  

pbitmap->loadbitmap(idb_min_focus);  

else

pbitmap->loadbitmap(idb_min_normal);  

rtbutton = m_rtbuttmin;  

rtbutton.offsetrect(-rtwnd.left, -rtwnd.top);  

poldbitmap=(cbitmap*)pdisplaymemdc->selectobject(pbitmap);  

pdc->bitblt(rtbutton.left, rtbutton.top, rtbutton.width(), rtbutton.height(), pdisplaymemdc, 0, 0, srccopy);  

pdisplaymemdc->selectobject(poldbitmap);  

pbitmap->deleteobject();  

//幫助button

if (m_rtbutthelp.ptinrect(point))  

pbitmap->loadbitmap(idb_help_focus);  

else

pbitmap->loadbitmap(idb_help_normal);  

rtbutton = m_rtbutthelp;  

rtbutton.offsetrect(-rtwnd.left, -rtwnd.top);  

poldbitmap=(cbitmap*)pdisplaymemdc->selectobject(pbitmap);  

pdc->bitblt(rtbutton.left, rtbutton.top, rtbutton.width(), rtbutton.height(), pdisplaymemdc, 0, 0, srccopy);  

pdisplaymemdc->selectobject(poldbitmap);  

pbitmap->deleteobject();  

}  releasedc(pdisplaymemdc);  

releasedc(pdc);  

delete pdisplaymemdc;  

delete pbitmap;  

cdialog::onncmousemove(nhittest, point);  

}  

1.去除視窗標題風格

2.新增響應按鈕(最大化、最小化等)

3.貼圖(可借助眾所周知的bitbuttonnl類 )處理

4.新增可供視窗拖移訊息欺騙:

[cpp]view plain

copy

void cmy2011082302dlg::onlbuttondown(uint nflags, cpoint point)   

方法同1.1

問題:1)  禁用cs.style&=~ws_sysmenu;(為了去除原標題欄按鈕) ,但這導致郵件選單不可用。

2)  不名操作閃爍(個別特殊操作,基本不會)

3)1.1中的第1步如果單/多文件繪製了選單,會出現選單夾中問題。如需選單建議選單重繪或bcg介面庫工程

由於2.1中的問題1和2,再加上去除標題欄所導致的非客戶區自繪按鈕訊息無法響應以及視窗無法拖動等情況,我們必須用onnchittest改變新增加空間(1.1中第1步)為htcaption屬性。

1.去除標題欄 int cmainframe::oncreate(lpcreatestruct lpcreatestruct){} 新增:

[cpp]view plain

copy

modifystyle(ws_caption,ws_dlgframe,swp_framechanged);  

2.同1.1中1.2.3步。1步不可預設哦

3.   onnchittest返回htcaption:

[cpp]view plain

copy

uint cmainframe::onnchittest(cpoint point)   

else

使用Visual C 重繪標題欄

在做拖動小視窗程式時,遇到乙個問題,怎麼樣對標題欄進行繪製,弄了半天才弄出來。和vc中原理差不多,但在.net下需要將api中的hdc通過graphics.fromhdc 轉換為system.drawing.graphics 程式執行結果如下 如下 對視窗的標題欄進行重繪和設定 dllimport ...

MFC自繪標題欄和邊框

mfc視窗有標題欄和邊框的時候,重繪不是很方便,在onncpaint中重繪標題欄如果呼叫基類的onncpaint,自己的後面的重繪都不生效,如果不呼叫基類的onncpaint,win10上的mfc程式出現了win7風格的邊框,而且寬度還不能控制。移除邊框 dword dw getwindowlong...

MFC對話方塊 重繪非客戶端區域(標題欄)

某些情況下需要在對話方塊標題欄上新增按鈕,在此mark下 環境 win7 vs2008 sp1 專案 mfc對話方塊 步驟 1.重寫方法 defwindowproc 1.1 h檔案新增 如下 a.virtual void dodataexchange cdataexchange pdx ddx dd...