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

萬星星@豌豆莢 歡迎加入我們
一個吃軟飯的男人!!!!!我只想寫程序####
微博:http://weibo.com/wanlianwen
posts - 172,  comments - 1253,  trackbacks - 0
好的軟件有好的開始,微軟VS IDE的起始界面做的實在不錯,色調和布局都是很舒服,這里我動手實現了一個,下面是過程。

第一步:用spy++工具觀察VS IDE開始界面構成。

通過spy++,可以看到開始頁由一個大窗口,里面是位圖背景,在上面有一些靜態窗口,按鈕等,之間夾一個小視圖(例如最近的項目里面是一個listctrl)。基本就是這樣,實現思路就是用位圖貼在靜態小窗口構成一個小的欄,中間放一個小的主視圖,比如項目列表、msdn新聞等。


第二步:收集位圖素材。我沒有那么好的藝術細胞畫這么好的小圖片,所以只得偷vs的。由于使用vc6,所以下面全部基于vc6環境來說。用資源的方式打開vs ide執行文件(\Microsoft Visual Studio 8\Common7\IDE\devenv.exe),可以看到位圖資源基本全是起始頁的。

第三步:實現思路確定。有一些問題,里面的圖片好像沒有主界面那么大的位圖,頭部好像不是太符合尺寸:

這下我的思路是先用背景色繪制窗口,然后貼圖。背景色可以用取色工具獲取,我用firework里面的工具。
還有一個問題就是小欄位圖的四角有顏色:

貼到主窗口上去會留下與環境不相稱的一點點多余的角,這里我在網上搜到一篇mask位圖的文章,基于此,把位圖四角的淡白色去掉。
還有就是中間的位圖太小:

我準備采取重復繪制來填滿一定長度,注意水平方向和垂直方向稍有不同,所以實現的時候要進行判斷。
這樣基本敲打實現方法,接著就動手實現。

第四步:開工。vc6建立一個單文檔基于formview的程序。
工序一:繪制背景
對話框的背景顏色可以通過重載OnCtlColor來實現,而不是OnEraseBackground。
HBRUSH?CVS2005StartView::OnCtlColor(CDC*?pDC,?CWnd*?pWnd,?UINT?nCtlColor)?
{
????HBRUSH?hbr?
=?CFormView::OnCtlColor(pDC,?pWnd,?nCtlColor);
????
????
//?TODO:?Change?any?attributes?of?the?DC?here
????if(nCtlColor?==?CTLCOLOR_DLG)
????
{
????????
return?m_bkBrush;
????}

????
//?TODO:?Return?a?different?brush?if?the?default?is?not?desired
????return?hbr;
}
上面只修改對話框背景,所以進行了判斷,m_bkBrush就是背景畫刷。

工序二:貼圖,在OnPaint里面繪制Visual studio的大位圖。
void?CVS2005StartView::OnPaint()?
{
????CPaintDC?dc(
this);?//?device?context?for?painting
????
????
//?TODO:?Add?your?message?handler?code?here
????CDC????????????memDC;
????HBITMAP????????hOldBmp????????
=?NULL;
????BITMAP????????bmp;
????memDC.CreateCompatibleDC(
&dc);
????hOldBmp?
=?(HBITMAP)memDC.SelectObject(&m_bmpHeader);
????m_bmpHeader.GetBitmap(
&bmp);
????BitBlt(dc,?
0,?0,?bmp.bmWidth,?bmp.bmHeight,?memDC,?0,?0,?SRCCOPY);
????memDC.SelectObject(hOldBmp);
????
//?Do?not?call?CFormView::OnPaint()?for?painting?messages
}
這樣就所有存托背景,下面開始實現每個小欄目。實現一個就ok,思路都是一樣的。

工序三:實現繪制位圖的靜態窗口。從CStatic派生CBmpStatic類來實現繪制位圖功能。考慮到上面提及的情況,函數接口如下:
????void????SetBitmap(UINT?nBmpID,?BOOL?bHorzStretch=TRUE);
????
void????SetTitle(CString?strTitle);
實現如下:
void?CBmpStatic::OnPaint()?
{
????CPaintDC?dc(
this);?//?device?context?for?painting
????
????
//?TODO:?Add?your?message?handler?code?here
????CDC????????????srcDC;
????CDC????????????mskDC;
????CBitmap????????mskBmp;
????BITMAP????????bmp;
????srcDC.CreateCompatibleDC(
&dc);
????mskDC.CreateCompatibleDC(
&dc);
????m_bmpBack.GetBitmap(
&bmp);

????mskBmp.CreateBitmap(bmp.bmWidth,?bmp.bmHeight,?
0,?1,?NULL);
????srcDC.SelectObject(
&m_bmpBack);

????srcDC.SetBkColor(RGB(
0xEB,?0xF1,?0xFE));
????mskDC.SelectObject(mskBmp);
????mskDC.BitBlt(
0,?0,?bmp.bmWidth,?bmp.bmHeight,?&srcDC,?0,?0,?SRCCOPY);

????srcDC.SetBkColor(RGB(
255,255,255));
????srcDC.SetTextColor(RGB(
0,0,0));

????LONG????lXStart????????
=?0;
????LONG????lXEnd????????
=?bmp.bmWidth;
????LONG????lYStart????????
=?0;
????LONG????lYEnd????????
=?bmp.bmHeight;
????CRect????rc;
????GetClientRect(
&rc);
????
if(m_bHorzStretch)
????
{
????????
while(lXStart?<=?rc.Width())
????????
{
????????????
if(lXEnd?>?rc.Width())
????????????
{
????????????????lXEnd?
=?rc.Width();
????????????}

????????????dc.BitBlt(lXStart,
0,?lXEnd-lXStart,?bmp.bmHeight,?&srcDC,?0,?0,?SRCINVERT);
????????????dc.SetBkColor(RGB(
255,255,255));
????????????dc.BitBlt(lXStart,?
0,?lXEnd-lXStart,?bmp.bmHeight,?&mskDC,?0,?0,?SRCAND);
????????????dc.BitBlt(lXStart,?
0,?lXEnd-lXStart,?bmp.bmHeight,?&srcDC,?0,?0,?SRCINVERT);
????????????lXStart?
+=?bmp.bmWidth;
????????????lXEnd?
+=?bmp.bmWidth;
????????}

????}

????
else
????
{
????????
while(lYStart?<=?rc.Height())
????????
{
????????????
if(lYEnd?>?rc.Height())
????????????
{
????????????????lYEnd?
=?rc.Height();
????????????}

????????????dc.BitBlt(
0,lYStart,?bmp.bmWidth,?lYEnd-lYStart,?&srcDC,?0,?0,?SRCINVERT);
????????????dc.SetBkColor(RGB(
255,255,255));
????????????dc.BitBlt(
0,lYStart,?bmp.bmWidth,?lYEnd-lYStart,?&mskDC,?0,?0,?SRCAND);
????????????dc.BitBlt(
0,lYStart,?bmp.bmWidth,?lYEnd-lYStart,?&srcDC,?0,?0,?SRCINVERT);
????????????lYStart?
+=?bmp.bmHeight;
????????????lYEnd?
+=?bmp.bmHeight;
????????}

????}

????srcDC.DeleteDC();
????mskDC.DeleteDC();

????
if(!m_strTitle.IsEmpty())
????
{
????????dc.SelectObject(m_ftTitle);
????????dc.SetTextColor(RGB(
255,?255,?255));
????????dc.SetBkMode(TRANSPARENT);
????????dc.TextOut(
0,?4,?m_strTitle);
????}

}



void?CBmpStatic::SetBitmap(UINT?nBmpID,?BOOL?bHorzStretch)
{
????
if(m_bmpBack.GetSafeHandle())
????
{
????????m_bmpBack.DeleteObject();
????}

????m_bmpBack.LoadBitmap(nBmpID);
????m_bHorzStretch?
=?bHorzStretch;
}


void?CBmpStatic::SetTitle(CString?strTitle)
{
????m_strTitle?
=?strTitle;
}
好了,有了顯示位圖的窗口,下面我們就來擺出一個欄目(最近的項目)。

工序四:擺置窗口,實現欄目。這個是細致活,先把中間的小主視圖控件擺上,然后四周放置8個static,基本如下(可能需要根據顯示結果來適當調整)。

然后為每個static控件關聯一個CBmpStatic,并設置位圖和顯示文本。
void?CVS2005StartView::OnInitialUpdate()
{
????CFormView::OnInitialUpdate();
????GetParentFrame()
->RecalcLayout();
????ResizeParentToFit();

????m_wndPrjUpLeft.SetBitmap(
6609);
????m_wndPrjUpMiddle.SetBitmap(
6610);
????m_wndPrjUpMiddle.SetTitle(_T(
"最近的項目"));
????m_wndPrjUpRight.SetBitmap(
6611);
????m_wndMiddleLeft.SetBitmap(
6612,?FALSE);
????m_wndMiddleRight.SetBitmap(
6613,?FALSE);
????m_wndBottomLeft.SetBitmap(
6614);
????m_wndBottomMiddle.SetBitmap(
6615);
????m_wndBottomRight.SetBitmap(
6616);

????m_imgProject.Create(
16,?16,?ILC_COLOR8|ILC_MASK,?2,?0);
????m_imgProject.Add(AfxGetApp()
->LoadIcon(MAKEINTRESOURCE(6826)));
????m_wndPrjList.SetImageList(
&m_imgProject,?LVSIL_SMALL);
????m_wndPrjList.InsertItem(
0,?_T("HTMLKit"),?0);
????m_wndPrjList.InsertItem(
1,?_T("Mapgis7"),?0);


????m_wndNewsUpLeft.SetBitmap(
6609);
????m_wndNewsUpMiddle.SetBitmap(
6610);
????m_wndNewsUpMiddle.SetTitle(_T(
"Visual?Studio?開發人員新聞"));
????m_wndNewsUpRight.SetBitmap(
6611);
????m_wndNewsMiddleLeft.SetBitmap(
6612,?FALSE);
????m_wndNewsMiddleRight.SetBitmap(
6613,?FALSE);
????m_wndNewsBottomLeft.SetBitmap(
6614);
????m_wndNewsBottomMiddle.SetBitmap(
6615);
????m_wndNewsBottomRight.SetBitmap(
6616);

????m_wndNewsInfo.SetFont(
&m_ftNewInfo);
????m_wndNewsInfo.AddString(_T(
"當前的新聞頻道可能無效或者你的?Internet"));
????m_wndNewsInfo.AddString(_T(
"連接不可用.若要更新新聞頻道,請在\"工具\"菜單上點擊\"選項\",然后展開"));
}

?

好了,下面來看看我們的窗口。


花費半天時間,只是圖實現,封裝性不是很好。

總結:
看過很多漂亮的界面,qq、泡泡堂登錄界面等,思路差不多,都是基于貼圖來做的,包括游戲的實現方式也差不多。界面的美觀其實主要靠藝術家,包括圖片效果以及窗口布局。

不足:
1、沒有使用雙緩存,拖動的時候背景有閃爍。
2、滾動條滑動的時候有問題,暫時沒時間處理。
3、代碼凌亂,不曉得資源句柄有沒有釋放干凈。
4、開發新聞那個listbox是自繪的,可以通過spy++看到,我沒時間做。
還有。。。

代碼下載

posted on 2006-11-16 20:39 萬連文 閱讀(3100) 評論(3)  編輯 收藏 引用 所屬分類: MFC

FeedBack:
# re: 用MFC做VS起始頁界面
2006-11-18 14:04 | fiestay
呵呵,動手能力不錯啊  回復  更多評論
  
# re: 用MFC做VS起始頁界面
2007-04-17 15:35 | ooo
繼續努力!  回復  更多評論
  
# re: 用MFC做VS起始頁界面[未登錄]
2008-09-22 16:42 | 菜鳥
你要是能把你做好的這個再重新放到.net的起始頁里,代替他老的那個,那就更好了!  回復  更多評論
  
簡歷下載
聯系我

<2005年12月>
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567

常用鏈接

留言簿(66)

隨筆分類

隨筆檔案

相冊

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲美女av电影| 久久久久九九九九| 亚洲黑丝在线| 欧美成黄导航| 一区二区三区视频观看| 亚洲日本aⅴ片在线观看香蕉| 欧美在线中文字幕| 一区二区三区高清视频在线观看| 亚洲国产一区二区三区a毛片| 在线亚洲观看| 中文av一区特黄| 在线观看亚洲a| av成人手机在线| 国外成人免费视频| 最新成人av在线| 国产婷婷色一区二区三区| 欧美xxxx在线观看| 国产精品三级视频| 亚洲精品网站在线播放gif| 国产精品成人一区二区| 欧美成人网在线| 国产精品综合色区在线观看| 久久在线视频| 国产欧美日韩精品在线| 亚洲精品日本| 亚洲娇小video精品| 久久国产精品99国产| 亚洲欧美日韩一区二区三区在线观看| 性8sex亚洲区入口| 亚洲欧美日韩国产一区| 欧美日韩一区二区三区高清| 欧美国产丝袜视频| 在线日韩精品视频| 老司机免费视频一区二区| 农村妇女精品| 亚洲激情成人网| 欧美成人一区二区三区| 亚洲国产欧美在线人成| 亚洲精品一品区二品区三品区| 久久嫩草精品久久久精品| 久久天堂成人| 9人人澡人人爽人人精品| 欧美日韩国产一区| 国产精品99久久不卡二区| 亚洲国产中文字幕在线观看| 亚洲黄色在线观看| 国产一区二区三区成人欧美日韩在线观看 | 亚洲综合色在线| 久久久www成人免费精品| 亚洲先锋成人| 一本一道久久综合狠狠老精东影业| 国产一区二区三区日韩| 国产一区二区成人| 国产一区二区视频在线观看| 国产精品狼人久久影院观看方式| 欧美日韩视频免费播放| 欧美日韩极品在线观看一区| 欧美日韩国产成人在线| 欧美日韩视频第一区| 国产精品一区亚洲| 国内揄拍国内精品少妇国语| 影音国产精品| 一区二区欧美日韩| 欧美一区二区黄色| 免费观看日韩av| 最新日韩在线| 亚洲欧美成人一区二区三区| 欧美中文日韩| 欧美韩日一区| 国产精品一区二区在线观看网站| 狠狠狠色丁香婷婷综合久久五月| 极品少妇一区二区| 亚洲欧美怡红院| 亚洲国产另类精品专区| 欧美亚洲免费高清在线观看| 免费不卡在线观看av| 亚洲精品乱码久久久久| 日韩视频精品在线观看| 午夜久久美女| 欧美日韩中文字幕在线视频| 国产午夜精品美女视频明星a级| **欧美日韩vr在线| 久久久久久久波多野高潮日日| 亚洲韩国精品一区| 欧美激情国产日韩| 亚洲福利在线看| 久久人91精品久久久久久不卡| 亚洲一区二区精品| 欧美日韩亚洲91| 亚洲综合日韩在线| 日韩亚洲在线观看| 欧美精品亚洲精品| 在线观看不卡av| 性娇小13――14欧美| 日韩视频在线一区二区三区| 蜜臀久久99精品久久久画质超高清| 国产亚洲精品一区二555| 欧美影院成人| 欧美在线视频不卡| 国产九色精品成人porny| 亚洲一二区在线| 亚洲一区国产精品| 国产精品一区二区在线观看不卡| 亚洲一区欧美二区| 亚洲在线免费视频| 国产午夜精品全部视频在线播放| 欧美一区午夜精品| 欧美在线免费播放| 亚洲精品一区二| 一区二区日韩| 韩日精品在线| 亚洲老板91色精品久久| 欧美午夜不卡| 欧美一区二区三区视频在线| 亚洲一区在线免费| 国产在线拍偷自揄拍精品| 欧美激情片在线观看| 欧美日韩一卡二卡| 久久国产乱子精品免费女| 久久精品综合一区| 亚洲视频在线二区| 久久精品中文| 老司机67194精品线观看| 亚洲一区视频在线| 欧美福利影院| 久久久精品999| 欧美日韩mv| 蜜臀av性久久久久蜜臀aⅴ| 欧美日本不卡视频| 欧美电影免费观看| 国内精品视频一区| 亚洲女人av| 欧美一区二区三区免费视| 欧美日韩成人综合| 亚洲日韩欧美一区二区在线| 亚洲国产成人av在线| 久久综合中文色婷婷| 女同一区二区| 精品av久久707| 麻豆精品一区二区av白丝在线| 久久福利毛片| 亚洲电影第1页| 欧美精品乱码久久久久久按摩| 亚洲第一页在线| 99热精品在线观看| 欧美日本在线视频| 亚洲日本va午夜在线影院| 亚洲国产另类久久久精品极度| 免费不卡亚洲欧美| 亚洲成人在线免费| 欧美激情一区在线观看| 中文精品视频| 国产一区二区三区在线观看免费视频| 久久蜜桃精品| 欧美一级理论性理论a| 亚洲另类在线一区| 亚洲片在线资源| 美女精品视频一区| 在线天堂一区av电影| 国外成人在线| 欧美日韩国产小视频在线观看| 亚洲片区在线| 久久精品国产第一区二区三区| 中文成人激情娱乐网| 亚洲国语精品自产拍在线观看| 国产精品久久久久久久久婷婷| 媚黑女一区二区| 亚洲精品激情| 亚洲国产小视频| 在线观看亚洲视频| 欧美三级在线视频| 欧美日韩aaaaa| 欧美www在线| 久久尤物视频| 91久久午夜| 亚洲一区在线免费| 日韩视频不卡中文| 久久久久久伊人| 欧美精品在线一区二区三区| 欧美激情2020午夜免费观看| 亚洲欧美日韩国产一区二区三区| 亚洲精品乱码久久久久久日本蜜臀| 影音先锋亚洲一区| 在线综合亚洲欧美在线视频| 亚洲午夜三级在线| 久久免费黄色| 亚洲欧洲日产国产综合网| 亚洲午夜精品一区二区三区他趣| 午夜精品久久一牛影视| 欧美成人黄色小视频| 国产精品午夜久久| 亚洲国产美女| 久久久久久婷| 一本色道久久99精品综合 | 午夜国产精品影院在线观看| 国产精品福利网| 欧美淫片网站| 正在播放欧美视频| 亚洲国产精品一区二区三区| 99视频精品免费观看|