NcPaint重繪非客戶區

2021-06-04 11:58:00 字數 3297 閱讀 3706

1.需要響應wm_nccalcsize訊息

2.需要響應ncpaint訊息

3.還需要響應wm_size  

void 類名::onsize(uint ntype, int cx, int cy)  

4.響應active  

用於繪製不同情況下的標題。  

void 類名::onactivate(uint nstate, cwnd* pwndother, bool bminimized)  

m_bactive = false;  

}  else  

m_bactive = true;  

setwindowpos(null,0,0,0,0,swp_framechanged|swp_noownerzorder|  

swp_nomove|swp_nosize);  

}   /

1.準備工作。

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

首先要準備相應。

hbitmap bitmap;

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

"skin",

image_bitmap,

0, 0,

lr_defaultsize|lr_loadfromfile);

cbitmap cbmp;

cbmp.attach(bitmap);

其中,skin為檔案路徑。

(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);//畫非客戶區.

(2)顯示之前計算從計算標題欄高度:

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重繪非客戶區

1.去除視窗邊框和標題欄 oninitdialog函式,去除視窗邊框和標題欄 dword dwstyle getstyle dwnewstyle dwstyle setwindowlong m hwnd,gwl style,dwnewstyle dword dwexstyle getexstyle ...

自繪非客戶區

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

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

vc 實現 自繪 窗體 標題欄 非客戶區 1.準備工作。1 得到資料夾中的點陣圖控制代碼 首先要準備相應。hbitmap bitmap bitmap hbitmap loadimage afxgetinstancehandle skin test.bmp image bitmap,0,0,lr de...