想修改窗體的非客戶區,首先就得明白爲什麼要修改非客戶區,什麼是非客戶區
從窗體或控件來看,非客戶區就是無法放置控件的區域,比如窗體的標題欄,和邊框,菜單欄也是非客戶區,菜單欄不是控件是畫上去的
文本框的邊框,滾動條區域都是非客戶區
爲什麼要修改非客戶區呢??
原因是爲了自繪,讓邊框好看一些,比如要加高窗體標題欄,就需要改非客戶區,自繪非客戶區會響應 WM_NCPAINT消息
在這個消息裏,你可以進行窗體,控件,非客戶區的自繪
好啦,現在轉入正題,要修改非客戶大小,必須處理 WM_NCCALCSIZE
有關於 WM_NCCALCSIZE 消息,可以去www.panshsoft.com 我的網站查詢
下在是代碼,函數已經獲取到 wParam lParam 參數的值,示例,是我網站上,換膚產品中的代碼,是通過子類化調用的
- /********************************************************************
- '**【函 數 名:】OnNcCalcSize
- '**【參 數:】wParam,lParam窗口附加參數
- '**【返 回 值:】
- '**【作 者:】艾俊
- '**【日 期:】
- '**【全局變量:】
- '**【功能描述:】改變窗體非客戶區大小
- '********************************************************************/
- LRESULT CDrawFrmWnd::OnNcCalcSize(WPARAM wParam, LPARAM lParam)
- {
- LONG ret = USE_DEFAULT_WND_PROC;
- RECT Oldrect;
- NCCALCSIZE_PARAMS FAR* lpncsp = NULL;
- if ((BOOL)wParam)
- {
- lpncsp = (NCCALCSIZE_PARAMS FAR*)lParam;
- if(NULL == lpncsp)
- return USE_DEFAULT_WND_PROC;
- memcpy(&Oldrect, &lpncsp -> rgrc[0], sizeof(Oldrect));//保存rgrc[0]的值
- //m_WndOldProc 原窗體口處理過程的指針
- //m_hWnd 需要修改控件或窗體的句柄
- //先讓默認的函數處理一下
- ret = ::CallWindowProc(m_WndOldProc, m_hWnd, WM_NCCALCSIZE, wParam, lParam);
- memcpy(&lpncsp->rgrc[0], &Oldrect , sizeof(Oldrect));
- //設置非客戶區,爲窗體或控件,上,下,左,右,都加上10象素的非客戶區
- //其中 下,右,是用減的,減就是加
- lpncsp->rgrc[0].top += 10;
- lpncsp->rgrc[0].bottom -= 10;
- lpncsp->rgrc[0].left += 10;
- lpncsp->rgrc[0].right -= 10;
- memcpy(&lpncsp->rgrc[1], &lpncsp->rgrc[0], sizeof(lpncsp->rgrc[0]));
- ret = WVR_VALIDRECTS; //
- }
- return ret;//讓CallWindowProc處理
- }
這樣一來,控件或窗體,非客戶區就在原來的基礎上加10象素啦,然後,操作系統就會響應WM_NCPAINT消息,你就可以重繪啦