VC++開發垃圾檔案清理軟體之三:程式的介面設計與實現—-對話方塊介面

來源:互聯網
上載者:User

先說下哈,有人說要原始碼,原始碼在博文《VC++開發垃圾檔案清理軟體之四:程式的介面設計與實現----按鈕控制項介面》的最後給出供大家下載。

對應用程式介面的設計包括兩部分,一部分是對話方塊自身的重設計,二是對話方塊控制項的重繪,本程式主要對按鈕控制項進行重繪設計。

1. 繪製對話方塊的背景位元影像

繪製對話方塊背景位元影像本文採用的是處理對話方塊的WM_PAINT訊息,該訊息初始化時候對對話方塊進行繪製,從而繪製背景位元影像。繪製背景位元影像的主要代碼如下:

CRect   rect;    CPaintDC   dc(this);    GetClientRect(&rect); //擷取客戶區    //設定對話方塊背景顏色        dc.FillSolidRect(rect,RGB(14,94,157));   //設定為視窗背景

2. 在指定的地區中輸出位元影像

為了能夠在指定的地區中輸出位元影像,需要使用裝置上下文CDC類的StretchBlt方法。由於我們需要在視窗的非用戶端區域繪製位元影像,因此需要使用CWindowDC類的StretchBlt方法, CWindowDC類派生與CDC類,它提供了在視窗非用戶端區域繪製位元影像的功能。該方法數從源矩形中複製一個位元影像到目標矩形,必要時按目前目標裝置設定的模式進行映像的展開或壓縮。輸出位元影像的主要實現代碼如下:

CRect winRC;    CDC* pDC=GetWindowDC();//擷取視窗裝置上下文    CDC memDC;    memDC.CreateCompatibleDC(pDC);//建立相容記憶體位元影像    BITMAPINFO bmpInfo;    CBitmap bmp;    //定義位元影像對象    GetWindowRect(&winRC);    bmp.LoadBitmap(nID);//載入位元影像    bmp.GetObject(sizeof(BITMAPINFO),&bmpInfo);//擷取位元影像資訊    int nBmpCX = bmpInfo.bmiHeader.biWidth;//擷取位元影像寬度    int nBmpCY = bmpInfo.bmiHeader.biHeight;//擷取位元影像高度    memDC.SelectObject(bmp);//選中位元影像對象    pDC->StretchBlt(x,y,w,h,        &memDC,0,0,nBmpCX,nBmpCY,SRCCOPY);//在視窗中繪製位元影像    bmp.DeleteObject();//釋放位元影像對象ReleaseDC(pDC);//釋放DC    

3. 對話方塊介面設計與繪製的實現:

在對話方塊重繪的設計與實現過程中,一般需要繪製的對話方塊地區主要有標題部分、邊框部分和客戶區部分。具體的地區劃分如所示。

既然要對多個地區進行位元影像顯示輸出,所以我們先封裝一個bmp位元影像顯示輸出函數如下:

void CClearTmpFileDlg::DisplayBmp(int x,int y,int w,int h,int nID){//nID 表示位元影像資源的ID    CRect winRC;    CDC* pDC=GetWindowDC();    CDC memDC;    memDC.CreateCompatibleDC(pDC);    BITMAPINFO bmpInfo;    CBitmap bmp;        GetWindowRect(&winRC);    bmp.LoadBitmap(nID);    bmp.GetObject(sizeof(BITMAPINFO),&bmpInfo);    int nBmpCX = bmpInfo.bmiHeader.biWidth;    int nBmpCY = bmpInfo.bmiHeader.biHeight;    memDC.SelectObject(bmp);    pDC->StretchBlt(x,y,w,h,        &memDC,0,0,nBmpCX,nBmpCY,SRCCOPY);//在視窗中繪製位元影像    bmp.DeleteObject();    ReleaseDC(pDC);}

然後就是對各個地區進行位元影像輸出重繪。由於標題列以及邊框主要都是非用戶端區域繪製,因此應該在WM_NCPAINT 訊息中繪製。當然得先通過添加資源的方式將所用到的bmp位元影像資源匯入到項目中。

在 WM_NCPAINT訊息對於的 方法OnNcPaint()中調用對話方塊繪製方法DrawDialog()。該方法的功能就是繪製對話方塊各個地區的位元影像。主要代碼如下:

void CClearTmpFileDlg::DrawDialog(){//重繪對話方塊標題列、邊框、最小化按鈕、最大化按鈕和關閉按鈕等介面    m_nFrameCY = GetSystemMetrics(SM_CYFIXEDFRAME);//擷取對話方塊邊框的高度    m_nFrameCX = GetSystemMetrics(SM_CXDLGFRAME);//擷取對話邊框的寬度    if(GetStyle()&WS_BORDER)//擷取對話方塊是否有邊框    {        m_nBorderCY = GetSystemMetrics(SM_CYBORDER) + m_nFrameCY;        m_nBorderCX = GetSystemMetrics(SM_CXBORDER) +m_nFrameCX;     }    else    {                m_nBorderCY = m_nFrameCY;        m_nBorderCX = m_nFrameCX;    }    m_nTitleBarCY = GetSystemMetrics(SM_CYCAPTION) + m_nBorderCY;//計算標題列高度    m_nTitleBarCX =m_nBorderCX;    CRect winRect,factRect;    GetWindowRect(&winRect);    factRect.CopyRect(CRect(0,0,winRect.Width(),winRect.Height()));    CWindowDC windowsDC(this);//擷取視窗裝置上下文    //擷取整個MFC視窗的高度和寬度    m_nWinWidth = winRect.Width();//=781    m_nWinHeight = winRect.Height();//=459    //繪製對話方塊左標題列位元影像        DisplayBmp(0,0,100,m_nTitleBarCY,IDB_LEFTTITLE);    //繪製對話方塊標題列左端的logo表徵圖    DisplayBmp(3,0,26,m_nTitleBarCY,IDB_APPICON);    //繪製對話方塊右標題列位元影像        DisplayBmp(m_nWinWidth-100,0,100,m_nTitleBarCY,IDB_RIGHTTITLE);    //繪製對話方塊中標題列位元影像        DisplayBmp(100,0,m_nWinWidth-200,m_nTitleBarCY,IDB_MIDTITLE);    //繪製對話方塊左邊框位元影像    DisplayBmp(0,m_nTitleBarCY,m_nBorderCX,m_nWinHeight-m_nBorderCY,IDB_LEFTBAR);    //繪製對話方塊底邊框位元影像    DisplayBmp(m_nBorderCX,m_nWinHeight-m_nBorderCX,m_nWinWidth-2*m_nBorderCX,m_nBorderCX,IDB_BOTTOMBAR);    //繪製對話方塊左邊框位元影像    DisplayBmp(m_nWinWidth-m_nBorderCX,m_nTitleBarCY,m_nBorderCX,m_nWinHeight-m_nBorderCY,IDB_RIGHTBAR);    //給對話方塊繪製最小化按鈕    DisplayBmp(m_nWinWidth-26*3-5,0,26,26,IDB_MINBTN1);    //給對話方塊繪製最大化按鈕    DisplayBmp(m_nWinWidth-26*2-5,0,26,26,IDB_MAXBTN1);    //給對話方塊繪製關閉按鈕    DisplayBmp(m_nWinWidth-26-5,0,26,26,IDB_CLOSEBTN1);        ReleaseDC(&windowsDC);    //ReleaseDC(&memDC);    DrawTitleBarText();//輸出標題列文本}

上面代碼中最後的繪製對話方塊標題文本的方法DrawTitleBarText(),主要是用來顯示標題列的文本,其主要代碼如下:

CString strTitle ="小蔡垃圾清除程式3.0";CDC* pDC= GetWindowDC();pDC->SetBkMode(TRANSPARENT);pDC->SetTextColor(RGB(255,255,255));pDC->SetTextAlign(TA_CENTER);CRect rect;GetClientRect(&rect);CSize szText = pDC->GetTextExtent(strTitle);CFont* font,*fOldFont;font = new CFont;font->CreateFont(12,0,0,0,FW_BOLD,FALSE,FALSE,0,ANSI_CHARSET,     OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,FF_SWISS,_T("宋體"));fOldFont = pDC->SelectObject(font);pDC->TextOut(100,6.5,strTitle,18);pDC->SelectObject(fOldFont);ReleaseDC(pDC); 

在完成對話方塊相應地區的位元影像後,並沒有完成任務,還需要處理標題列按鈕的熱點效果,以及按鈕的單擊事件。首先得處理滑鼠在非用戶端區域移動時的事件,即WM_NCMOUSEMOVE訊息,在其訊息處理函數中判斷當前的滑鼠點是否位於標題列的按鈕地區,如果是則設定按鈕的熱點效果,並且記錄當前的按鈕狀態,及滑鼠點在哪個按鈕上。同樣的,處理對話方塊非用戶端區域的單擊事件,即WM_NCLBUTTONDOWN訊息,在其訊息處理函數中完成單擊事件操作。這部分的代碼比較簡單,在此不予顯示。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.