VC創(chuàng)建圓角dialog的實現(xiàn)方法
本文實例講述了VC創(chuàng)建圓角dialog的實現(xiàn)方法。分享給大家供大家參考,具體如下:
我們有時候需要圓角的對話框,要實現(xiàn)這樣的效果,一般包括兩步工作,第一步:將原有對話框的直角裁剪掉,第二步:為對話框畫上圓角或者為對話框貼上一個圓角的圖片。
第一步:我們在OnCreate函數(shù)中來實現(xiàn),代碼量也不多。
int CTestDialog::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDialog::OnCreate(lpCreateStruct) == -1)
return -1;
HRGN hRgn;
RECT rect;
::GetWindowRect(hwnd, &rect);
hRgn = CreateRoundRectRgn(0, 0, rect.right - rect.left + 1, rect.bottom - rect.top + 1, 5,5);
::SetWindowRgn(hwnd, hRgn, TRUE);
}
如果對話框還支持Resize的話,那么需要在OnSize函數(shù)中拷貝一份上面的代碼。
第二步:因為圓角部分的重繪屬于對話框的非客戶區(qū),所以我們需要響應(yīng)WM_NCPAINT消息,在消息響應(yīng)函數(shù)中實現(xiàn)貼圓角圖片的功能或者畫上圓角線。
Void CTestDialog::OnNcPaint()
{
CWindowDC dc(this);
CRect rcWindow;
CRect rcClient;
this->GetClientRect(rcClient);
this->ClientToScreen(rcClient);
this->GetWindowRect(rcWindow);
CPoint point = rcWindow.TopLeft();
rcClient.OffsetRect(-point);
rcWindow.OffsetRect(-point);
int windowWidth = rcWindow.Width();
int windowHeight = rcWindow.Height();
HDC hMemDC = ::CreateCompatibleDC(dc.m_hDC);
HBITMAP hBmp = ::CreateCompatibleBitmap(dc.m_hDC, windowWidth, windowHeight);
::SelectObject(hMemDC, hBmp);
Graphics graphics(hMemDC);
graphics.Clear(Color(255, 255, 255, 255));
graphics.SetSmoothingMode(SmoothingModeHighQuality);
//TODO:使用GDI+的DrawImage函數(shù)來貼上圓角圖片,或者使用RoundRect函數(shù)來為對話框畫上圓角線
#if 0 /*使用DrawImage來繪制圓角圖片*/
ImageAttributes ia;
ia.SetWrapMode( WrapModeTileFlipXY );
graphic.DrawImage(pImg_LTFrame,……….);
#endif
#if 0 /*使用RoundRect來繪制圓角線*/
RoundRect(hMemDC, rcWindow.left, rcWindow.top, rcWindow.right,rc.bottom, 5, 5 );
#endif
dc.IntersectClipRect(rcWindow);
dc.ExcludeClipRect(rcClient);
::BitBlt(dc.m_hDC, 0, 0, windowWidth, windowHeight, hMemDC, 0, 0, SRCCOPY);
::DeleteDC(hMemDC);
::DeleteObject(hBmp);
}
為了達(dá)到自己想要的效果,可能還要響應(yīng)WM_NCACTIVE和WM_NOTIFY兩個消息,在這兩個消息響應(yīng)函數(shù)中實現(xiàn)和OnNCPaint函數(shù)一樣的功能。
還有一個重要的消息WM_NCCALCSIZE,在這個消息響應(yīng)函數(shù)中,主要是重新計算對話框的非客戶區(qū)的大小,這個函數(shù)中的LPNCCALCSIZE_PARAMS類型參數(shù)lpncsp的lpncsp->rgrc[0]設(shè)置的是客戶區(qū)的大小,客戶區(qū)的高度減小時,非客戶區(qū)的高度就增加了,因為對話框的總高度是固定的。在創(chuàng)建圓角矩形后,可能會出現(xiàn)客戶區(qū)區(qū)域大了或者小了,這時,就需要響應(yīng)該消息,在這個消息響應(yīng)函數(shù)中對非客戶區(qū)的大小進(jìn)行調(diào)整。
希望本文所述對大家VC程序設(shè)計有所幫助。
上一篇:C 語言插入排序算法及實例代碼
欄 目:C語言
本文標(biāo)題:VC創(chuàng)建圓角dialog的實現(xiàn)方法
本文地址:http://www.jygsgssxh.com/a1/Cyuyan/2136.html
您可能感興趣的文章
- 01-10C++ 創(chuàng)建桌面快捷方式 開始菜單的實現(xiàn)代碼
- 01-10C++用new創(chuàng)建對象和不用new創(chuàng)建對象的區(qū)別解析
- 01-10c語言鏈表基本操作(帶有創(chuàng)建鏈表 刪除 打印 插入)
- 01-10wince程序防止創(chuàng)建多個實例實現(xiàn)互斥作用
- 01-10一個win32窗口創(chuàng)建示例
- 01-10c++雙向鏈表操作示例(創(chuàng)建雙向鏈、雙向鏈表中查找數(shù)據(jù)、插入數(shù)
- 01-10VC++創(chuàng)建msi文件的方法
- 01-10VC實現(xiàn)動態(tài)菜單的創(chuàng)建方法
- 01-10MFC創(chuàng)建模態(tài)對話框和非模態(tài)對話框的方法
- 01-10C++實現(xiàn)哈夫曼樹簡單創(chuàng)建與遍歷的方法


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達(dá)式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機(jī)閱讀
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 01-11ajax實現(xiàn)頁面的局部加載
- 01-10C#中split用法實例總結(jié)
- 04-02jquery與jsp,用jquery
- 01-10delphi制作wav文件的方法
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改


