VC 實現 自繪 窗體 標題欄 非客戶區

2021-04-20 20:28:07 字數 2856 閱讀 5776

vc 實現 自繪 窗體 標題欄 非客戶區

1.準備工作。

(1)得到資料夾中的點陣圖控制代碼:

首先要準備相應。

hbitmap bitmap;

bitmap=(hbitmap)::loadimage(afxgetinstancehandle(),

"skin//test.bmp",

image_bitmap,

0,0,

lr_defaultsize|lr_loadfromfile);

cbitmap cbmp;

cbmp.attach(bitmap);

其中,skin//test.bmp為檔案路徑。

(2)關於非客戶區的訊息:

on_wm_ncpaint()//繪非客戶區時。

on_wm_ncactivate()//非客戶區有焦點和失去焦點時。

on_wm_nccalcsize()//計算窗體尺寸時。

(3)改變標題欄尺寸:

重寫on_wm_nccalcsize()訊息響應函式。

void cmyskindlg::onnccalcsize(bool bcalcvalidrects, nccalcsize_params* lpncsp)

(4)非客戶區的滑鼠動作:

on_wm_nclbuttondown()//滑鼠下。

on_wm_nclbuttonup()//滑鼠上。

on_wm_ncmousemove()//滑鼠懸停。

(5)遮蔽最大最小關閉訊息:

在windowproc中:

lresult cmyskindlg::windowproc(uint message, wparam wparam, lparam lparam)

...2.程式和注釋:

(1)使用者變數和函式.

protected:

cbrush m_brbg;//對話方塊背景顏色,在oninitdialog 中初始化,在onctlcolor中作為返回值.

cstring m_strcaption;//標題.

crect m_rtwnd;//整個窗體rect.

int     m_ncaptionheight;//標題欄高度.

crect m_rtbuttons;//最大,最小,關閉按鈕.

crect m_rticon;//圖示.

crect m_rtbuttmin;//最小.

crect m_rtbuttmax;//最大.

crect m_rtbuttexit;//關閉.

crect m_rtbuttmaxm;

crect m_rtbuttminm;

crect m_rtbuttexitm;

crect m_bmrt;//bitmap所在的rect.

bool    m_bncactive;//窗體活動.

bool fillrtwithbmp(cstring bmpfilename,cdc *pdc,crect rt);//用bitmap添滿整個rt.

bool fillwithbmprtul(cstring bmpfilename,cdc *pdc,cpoint pt);//pt為bitmap的左上.

bool fillwithbmprtur(cstring bmpfilename,cdc *pdc, cpoint pt);//pt為bitmap的右上.

bool fillbutton(cstring bmpbuttonname, cdc *pdc, cpoint pt,int intstate);//

void drawnc(cdc* pdc);//畫非客戶區.

void cmyskindlg::presubclasswindow()

(3)重寫onnccalcsize:

void cmyskindlg::onnccalcsize(bool bcalcvalidrects, nccalcsize_params* lpncsp)

(4)繪非客戶區:

void cmyskindlg::onncpaint()

(5)對非客戶區焦點情況的處理:

bool cmyskindlg::onncactivate(bool bactive)

(6)響應滑鼠在非客戶區的事件:

滑鼠在非客戶區按下:

void cmyskindlg::onnclbuttondown(uint nhittest, cpoint point)

//onnclbuttonup中觸發最大最小關閉:

void cmyskindlg::onnclbuttonup(uint nhittest, cpoint point)

}//滑鼠在非客戶區懸停:

void cmyskindlg::onncmousemove(uint nhittest, cpoint point)

(7)遮蔽單擊程式非客戶系統原有圖示矩形時出現的系統選單或動作:

uint cmyskindlg::onnchittest(cpoint point)

(8)系統選單的顯示和隱藏:

為了使重繪工作順利進行而不影響程式外在表現,要對系統選單顯示和隱藏, 如在onncactivate中有這樣的程式片段:

...if(bactive)

else

...又如,在oncreate中:

...this->modifystyle(ws_sysmenu, 0);//防止在工作列右單擊時出現最大最小關閉.

...(9)對系統最大最小關閉圖示依然出現的處理:

雖然使用者取消了nc區系統的重繪,但是系統仍然對最大最小關閉圖示重繪(主要表現在使用者右單擊工作列圖示時),這裡的處理方法如下:

void cmyskindlg::oninitmenupopup(cmenu* ppopupmenu, uint nindex, bool bsysmenu)

MFC非客戶區自繪標題欄的實現(不斷更新)

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

自繪非客戶區

下面是網上收集來的 實現炫彩自繪視窗非客戶區,貼出來大家參考共享.效果如下圖所示 關鍵 如下 在框架類中新增 public afx msg void onnclbuttondown uint nhittest,cpoint point afx msg void onncmousemove uint ...

MFC自繪標題欄和邊框

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