青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 67  文章 - 171  trackbacks - 0
<2008年8月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
31123456

常用鏈接

留言簿(10)

隨筆分類

隨筆檔案

連接資料

最新隨筆

搜索

  •  

最新隨筆

最新評論

用VC++實現異形窗口.大連鐵道學院(116028)李文輝隨著Microsoft憑借Windows在操作系統上取得的巨大成績,Windows用戶界面也日益成為業界標準。統一的界面給廣大用戶對應用軟件的學習與使用帶來了很大方便。但每天都面對同一副面孔,日久天長難免會產生一些厭倦,開發一些“離經叛道”,一改Windows應用程序千篇一律的“標準”界面,一定會給你帶來一種清新的感覺。標準Windows應用程序窗口一般為帶有標題欄的淺灰色矩形外觀,因而“異形”對話框/窗口也主要是顏色與外形上動手腳。改變背景顏色
改變對話框(窗口)的背景顏色是最簡單的改變Windows應用程序外觀的方法,根據Windows創建與管理機理,一般有兩種方法。一種是處理WM_CTLCOLOR消息,首先創建所選背景顏色的刷子,然后調用SetBkColor()或SetDialogBkColor()以所創建的刷子來繪制窗口或對話框的背景。需要重畫窗口或對話(或對話的子控件)時,Windows向對話發送消息WM_CTLCOLOR,應用程序處理WM_CTLCOLOR消息并返回一個用來繪畫對話背景的刷子句柄。另外一種是響應Windows的WM_ERASEBKGND消息,Windows向窗口發送一個WM_ERASEBKGND消息通知該窗口擦除背景,可以使用VC++的ClassWizard重載該消息的缺省處理程序來擦除背景(實際是用刷子畫),并返回TRUE以防止Windows擦除窗口。2.改變窗口外形通過使用新的SDK函數SetWindowRgn(),可以將繪畫和鼠標消息限定在窗口的一個指定的區域,因此實際上是使窗口成為指定的不規則形狀(區域形狀)。“區域”是Windows GDI中一種強有力的機制,區域是設備上的一塊空間,可以是任意形狀,復雜的區域可以由各個小區域組合而成。Windows內含的區域創建函數有CreateRectRgn()、CreatePolyRgn()、CreatePolygonRgn()、CreateRoundRectRgn()和CreateEllipticRgn(),再通過CombineRgn()來組合區域,即可得到復雜形狀的區域,獲得復雜形狀的窗口外形。通過上面的方法雖然可以得到“異形”窗口,但感覺顏色單調,外形也不夠“COOL”,能否獲得更酷的“異形”對話框/窗口呢?回答是肯定的。下面就介紹利用位圖和蒙板創建“異形”對話框/窗口的方法。3.利用位圖創建異形對話框窗口利用位圖創建異形對話框原理是根據象素的顏色來進行“扣像”處理,對所有非指定顏色象素區域進行區域組合。利用這一技術,實際上就是實現對話框/窗口的位圖背景,并且對指定的顏色區域進行透明處理。下面就以透明位圖為背景的對話框為例來說明:首先用繪圖軟件如PhotoShop繪制編輯一幅擬做對話框背景用的圖片,用BMP格式保存,假設存為Back.Bmp。需要說明的是,雖然Visual C++集成開發環境的資源編輯器只能編輯不超過16色的位圖,但完全我們可以以真彩色方式存儲,不必理會Visual C++的警告。下一步是用Visual C++的AppWizard創建一個基于對話框的應用程序假定命名為Trans。用資源編輯器引入背景圖片Back.Bmp,如果是高彩色,不必理會出現的警告信息,點擊OK確認即可。為了明確,修改默認的資源ID標識IDB_BITMAP1為IDB_BACKBMP。然后修改對話框的Style為Popup,Border為None,如圖1
。圖1向CTransDlg類添加區域處理功能模塊void CTransDlg::SetupRegion(CDC *pDC /*對話框窗口DC*/, UINT BackBitmapID /*背景位圖資源ID*/, UINT MaskBitmapID /*區域處理位圖資源ID*/, COLORREF TransColor = 0x00000000 /*透明顏色值,默認為黑色*/)。到目前為止,我們暫時認為MaskBitmapID等同于BackBitmapID。其核心工作是根據MaskBitmapID指示位圖的象素顏色進行區域組合。完整的代碼如下:void CTransDlg::SetupRegion(CDC *pDC /*對話框窗口DC*/, UINT BackBitmapID /*背景位圖資源ID*/,UINT MaskBitmapID /*區域處理位圖資源ID*/,COLORREF TransColor /*透明顏色值*/){CDC memDC;CBitmap cBitmap;CBitmap* pOldMemBmp = NULL;COLORREF cl;CRect cRect;UINT x, y;CRgn wndRgn, rgnTemp;//取得窗口大小GetWindowRect(&cRect);//背景位圖資源IDm_BackBitmapID = BackBitmapID//裝載位圖cBitmap.LoadBitmap(MaskBitmapID);memDC.CreateCompatibleDC(pDC);pOldMemBmp = memDC.SelectObject(&cBitmap);//首先創建默認的完整區域為完整的窗口區域wndRgn.CreateRectRgn(0, 0, cRect.Width(), cRect.Height());//下面的兩層循環為檢查背景位圖象素顏色,進行透明區域處理;//當象素顏色為指定的透明值時,即將該點從區域中剪裁掉。//其中用到的幾個成員變量m_MaskLeftOff、m_MaskTopOff、//m_MaskRightOff、m_MaskBottomOff、m_FrameWidth//和m_CaptionHeight,其作用后面再作說明,此時可全部當作0來處理。for(x= m_FrameWidth+m_MaskLeftOff;x<=cRect.Width() - m_FrameWidth-m_MaskRightOff; x++){for(y = m_CaptionHeight+m_MaskTopOff; 


 


 


y<=cRect.Height() - m_FrameWidth-m_MaskBottomOff; y++){//取得坐標處象素的顏色值cl = memDC.GetPixel(x - m_FrameWidth-m_MaskLeftOff,y - m_CaptionHeight-m_MaskTopOff);if(col == TransColor){//象素顏色為指定的透明色,創建透明“微區域”rgnTemp.CreateRectRgn(x, y, x+1, y+1);//“扣像”,從完整的區域中“扣除”透明的“微區域”wndRgn.CombineRgn(&wndRgn, &rgnTemp, RGN_XOR);//刪除剛創建的透明“微區域”,釋放系統資源rgnTemp.DeleteObject(); }}}if (pOldMemBmp) memDC.SelectObject(pOldMemBmp);//用設定窗口為指定的區域SetWindowRgn((HRGN)wndRgn, TRUE);}重置系統默認的背景擦除操作,即添加WM_ERASEBKGND消息處理過程,這一步可以借助ClassWizard來簡化操作。BOOL CTransDlg::OnEraseBkgnd(CDC* pDC) {// TODO: Add your message handler code here and/or call defaultCRect rect;CDC memDC;CBitmap cBitmap;CBitmap* pOldMemBmp = NULL;GetWindowRect(&rect);//裝載背景位圖cBitmap.LoadBitmap(m_BackBitmapID);memDC.CreateCompatibleDC(pDC);pOldMemBmp = memDC.SelectObject(&cBitmap);//將背景位圖復制到窗口客戶區pDC->BitBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0, 0, SRC/DownloadFiles\a\2001-10-12\COPY);if (pOldMemBmp) memDC.SelectObject( pOldMemBmp );//刪除系統卻省的OnEraseBkgnd功能//return CDialog::OnEraseBkgnd(pDC);return TRUE;}接下來是在WM_PAINT的消息處理函數OnPaint()中添加代碼。由于當背景位圖比較大時,進行區域處理比較耗時,所以只在啟動時進行一次處理。一種方法是OnInitDialog()處理,但這樣會在從啟動程序到窗口出現有相當的延遲,易引起程序尚未啟動的誤解。再一種方法就是在OnPaint()處理,但為了避免重復處理,可以加上一個判斷標志。以下是OnPaint()的代碼,正體為AppWizard生成,粗體為自己添加內容。void CTransDlg::OnPaint() {if (IsIconic()){……}else{if(m_nFirstRun){ //首次運行標志//修改鼠標光標為等待方式BeginWaitCursor();//設置背景區域SetupRegion(GetWindowDC(),
計算機教程用VC++實現異形窗口.來自www.itwen.comIT WEN計算機教程網

IDB_BACKBMP,
IDB_BACKBMP,
0x00FFFFFF /*白色*/);//恢復鼠標光標為正常模式EndWaitCursor();m_nFirstRun = 0;}CDialog::OnPaint();}}剩下的工作就是根據背景位圖的大小來設置對話框窗口的大小和位置,這可以在OnInitDialog()中通過調用MoveWindow()來實現。再添加一些變量的聲名和初始化,即可編譯運行。圖2為運行結果示例:圖24.進一步的討論前面實現了單一模式的異形對話框,但有些情況下又需要不同的樣式,如有標題欄、邊框等,或者只作局部的處理,這就是前面兩個成員變量m_FrameWidth和m_CaptionHeight作用,通過在OnInitDialog()判斷窗口樣式,使m_FrameWidth和m_CaptionHeight取不同的值。這部分的代碼為:BOOL CTransBmpDlg::OnInitDialog(){……// TODO: Add extra initialization herem_nFirstRun = 1;//數據設置,窗口左上角坐標:m_Left=0,m_Top=0
//背景位圖寬高:m_Width=535,m_Height=105SetSize(0, 0, 535, 105);//蒙板處理區域與窗口邊框的距離m_MaskLeftOff=m_MaskTopOff=m_MaskRightOff=m_MaskBottomOff=0;//窗口邊框與標題欄象素值m_FrameWidth = m_CaptionHeight = 0;//取得窗口樣式LONG style = ::GetWindowLong(this->m_hWnd, GWL_STYLE);//如保留窗口風格樣式,則根據不同的窗口邊框類型


  

 


//選取不同的m_FrameWidth和m_CaptionHeight值,
//也可以根據處理位置的需要進行付值if((style & WS_BORDER) == WS_BORDER)m_FrameWidth = ::GetSystemMetrics(SM_CXBORDER);if((style & WS_THICKFRAME) == WS_THICKFRAME)m_FrameWidth = ::GetSystemMetrics(SM_CXFIXEDFRAME);if((style & DS_MODALFRAME) == DS_MODALFRAME)m_FrameWidth = ::GetSystemMetrics(SM_CXFIXEDFRAME);if((style & WS_CAPTION) == WS_CAPTION){m_FrameWidth = ::GetSystemMetrics(SM_CXFIXEDFRAME);m_CaptionHeight = ::GetSystemMetrics(SM_CYSMCAPTION);}m_CaptionHeight += m_FrameWidth * 2;//重置窗口的位置和大小MoveWindow(m_Left, m_Top,
m_Width + m_FrameWidth * 2,
m_Height + m_CaptionHeight, TRUE);……return TRUE; // return TRUE unless you set the focus to a control}另外,為進一步增加靈活性,使窗口樣式不僅僅受背景位圖顏色的控制。通過指定SetupRegion()的MaskBitmapID 為一個我們稱之為“蒙板”的雙色位圖(多色彩也可以,但一般沒有必要),即可實現需要的操作。圖4為在同一背景位圖上,通過圖3的蒙板位圖實現的效果,并且增加了對話框窗體的邊框和標題欄屬性。圖3圖4利用這種蒙板技術,可以創建出任意形狀的窗口,而與背景位圖無關。需要注意的是,對于對話框中的控件如按鈕等,如處在或部分處在通明區域中,則通明區域中部分一并被剪裁掉,是否剪裁和剪裁位置與大小,利用蒙板可以很方便地進行控制。需要特別指出的是,SetWindowRgn()所指定的區域是針對整個窗口的,而Bitblt()/ StretchBlt()的輸出區域是針對于客戶區,兩者在定位上是不同的,編程中應加以注意并靈活應用,這也是前面之所以設置邊框大小等變量的原因。5.結束語這種異形窗口的創建不僅適應于對話框,而且適應于所有的基于CWnd類的派生窗口。采用這一方法,你可以創建出任何只要你能夠畫出的窗體,實現只要可以畫出,就可以做出的目標。本文代碼在Visual C++ 5.0、6.0下調試通過,運行正常,操作系統為Windows98SE。

posted on 2008-08-04 11:00 cpsprogramer 閱讀(3925) 評論(0)  編輯 收藏 引用 所屬分類: VC++
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲国产一区二区在线| 欧美激情精品久久久久| 久久综合九色欧美综合狠狠| 亚洲综合色自拍一区| 一本一道久久综合狠狠老精东影业| 最新中文字幕一区二区三区| 亚洲精品在线观看免费| 一区二区欧美国产| 久久人人97超碰精品888| 香蕉国产精品偷在线观看不卡| 欧美一区91| 欧美电影免费观看| 一区二区三区.www| 欧美一区网站| 女人天堂亚洲aⅴ在线观看| 欧美成人在线免费视频| 欧美亚一区二区| 精品av久久久久电影| 日韩视频精品在线| 欧美一进一出视频| 亚洲国产99精品国自产| 亚洲精品视频中文字幕| 午夜精品www| 欧美激情网友自拍| 亚洲网站视频福利| 欧美伊人影院| 欧美日韩一区二区视频在线| 国产一区二区黄| 亚洲桃花岛网站| 欧美福利视频在线| 亚洲制服av| 欧美精品一线| 亚洲福利视频免费观看| 欧美亚洲在线播放| 亚洲精品美女在线观看| 久久国产夜色精品鲁鲁99| 欧美日韩一区二区三| 亚洲国产老妈| 久久亚洲国产精品一区二区| 亚洲视频在线观看网站| 欧美日韩国产一中文字不卡| 在线观看的日韩av| 久久丁香综合五月国产三级网站| 亚洲黄色一区| 久久一区二区视频| 国产在线精品一区二区中文| 亚洲色在线视频| 亚洲人成网站在线播| 久久裸体视频| 狠狠爱www人成狠狠爱综合网| 亚洲欧美三级伦理| 一本一本久久a久久精品综合妖精| 欧美freesex8一10精品| 在线免费观看一区二区三区| 久久黄金**| 久久动漫亚洲| 国精品一区二区| 久久蜜桃资源一区二区老牛| 午夜欧美视频| 国产日韩欧美二区| 久久国产精品99国产| 亚洲欧美乱综合| 国产精品日韩一区二区三区| 亚洲男女毛片无遮挡| 亚洲视频在线看| 国产视频精品网| 久久综合成人精品亚洲另类欧美| 香蕉av福利精品导航| 国产日韩一区二区| 久久久精品国产一区二区三区| 亚洲伊人观看| 国外成人在线视频| 欧美激情中文字幕在线| 欧美激情久久久久| 久久亚洲国产精品日日av夜夜| 在线免费观看欧美| 亚洲精品美女91| 国产精品视频观看| 老妇喷水一区二区三区| 老鸭窝91久久精品色噜噜导演| 亚洲精品美女在线观看| 99riav1国产精品视频| 国产精品丝袜久久久久久app| 久久国产日韩欧美| 久久综合亚洲社区| 欧美黄色一级视频| 亚洲欧美国产高清| 久久精品国产亚洲精品| 在线免费一区三区| 99成人在线| 精品91视频| 99精品欧美一区二区三区| 国产情人节一区| 亚洲国产精品va在线观看黑人| 欧美午夜免费电影| 老司机aⅴ在线精品导航| 欧美伦理视频网站| 久久久久久久波多野高潮日日| 欧美黄色aa电影| 久久精品视频在线看| 欧美freesex8一10精品| 欧美一级理论片| 欧美日韩国产影片| 欧美v国产在线一区二区三区| 欧美日韩亚洲综合一区| 免播放器亚洲一区| 国产精品久久二区| 亚洲欧洲另类国产综合| 国产一区二区三区电影在线观看| 亚洲高清影视| 一区二区在线看| 亚洲欧美在线免费| 正在播放日韩| 欧美www视频在线观看| 久久久97精品| 国产精品影视天天线| 亚洲精品久久久久中文字幕欢迎你| 国产一区二区三区日韩| 亚洲少妇在线| 亚洲视频播放| 欧美区国产区| 欧美激情一区二区三区在线视频| 国产一区二区高清不卡| 亚洲制服av| 亚欧美中日韩视频| 国产精品免费一区二区三区在线观看 | 久久精品国产第一区二区三区最新章节 | 日韩午夜在线观看视频| 久久精品国产精品亚洲精品| 欧美亚洲免费| 国产精品―色哟哟| 亚洲一区国产视频| 亚洲欧美偷拍卡通变态| 国产精品theporn| 在线午夜精品自拍| 亚洲一区免费视频| 国产情人节一区| 亚洲大片在线| 亚洲精品日韩激情在线电影| 久久久在线视频| 欧美xart系列高清| 精品99视频| 欧美成人午夜影院| 亚洲日本欧美在线| 亚洲无毛电影| 国产日本欧美一区二区| 一区二区高清在线观看| 欧美日韩综合另类| 亚洲在线日韩| 狂野欧美激情性xxxx欧美| 亚洲高清不卡一区| 欧美精品三区| 一区二区三区高清视频在线观看| 在线亚洲伦理| 国产欧美日韩在线视频| 欧美在线综合| 亚洲国产成人精品女人久久久| 日韩一区二区免费高清| 欧美偷拍另类| 欧美一区二区三区久久精品茉莉花 | 欧美va亚洲va日韩∨a综合色| 欧美激情aaaa| 亚洲视频网站在线观看| 国产欧美一区二区精品婷婷| 久久精品免费播放| 亚洲日本免费电影| 欧美一区二区三区在| 一色屋精品亚洲香蕉网站| 欧美大片在线观看一区| 在线视频精品一区| 麻豆91精品| 亚洲中字在线| 亚洲国产aⅴ天堂久久| 欧美日韩在线综合| 久久久7777| 亚洲一级片在线看| 亚洲第一网站免费视频| 午夜一区二区三区在线观看| 亚洲国产国产亚洲一二三| 国产精品高潮久久| 蜜桃av噜噜一区| 亚洲免费在线| 亚洲日本中文字幕免费在线不卡| 久久久久国产精品人| 亚洲少妇自拍| 亚洲日本一区二区| 狠狠网亚洲精品| 国产精品亚洲片夜色在线| 欧美顶级大胆免费视频| 久久精品国产第一区二区三区| 中文欧美字幕免费| 亚洲国产一区二区a毛片| 欧美在线观看视频| 亚洲视频中文字幕| 日韩视频在线一区二区| 伊大人香蕉综合8在线视| 国产精品推荐精品| 国产精品久久一级| 欧美视频在线观看免费| 欧美全黄视频|