100个vc小项目开发:一、仿qq主界面

本文介绍了一个使用Visual C++开发的仿QQ界面的小项目。该项目实现了QQ客户端的主要界面功能,包括绘制界面元素如按钮和图标,以及实现基本的窗口操作如关闭和最小化。文章详细展示了如何通过代码创建和定制各种界面组件。

100个vc小项目开发:一、仿qq主界面

作者 July

------------------

一、我是来兑现承诺的。在之前的一篇博文中,已说过,

整理完那微软等面试题系列V0.1版,便把那100套vc项目的源码给放出来。现在,正是时机。

二、有问题,望各位不吝指正。:D。

-------------------------- 

 

我看,之前,已经有不少人做过这个仿qq的界面了。因此,本文会尽量保持简短。

来看下,最后的效果图(界面粗糙之处,还请海涵):

             

====

呵呵,没错,我的qq头像是手冢。我和我老弟,都很喜欢这部网球王子。

由于没有qq2010的皮肤库,所以盗用了qq2008的皮肤。:D。

-------------------------------------------------------------------------------

 

一、MyICQApp文件里头,对话框的建立:

CMyICQDlg dlg;
 m_pMainWnd = &dlg;
 int nResponse = dlg.DoModal();
 if (nResponse == IDOK)
 {
  // TODO: Place code here to handle when the dialog is
  //  dismissed with OK
 }
 else if (nResponse == IDCANCEL)
 {
  // TODO: Place code here to handle when the dialog is
  //  dismissed with Cancel
 }

 // Since the dialog has been closed, return FALSE so that we exit the
 //  application, rather than start the application's message pump.
 return FALSE;

 

二、界面主对话框的初始化:

BOOL CMyICQDlg::OnInitDialog()
{
 CDialog::OnInitDialog();

 // Set the icon for this dialog.  The framework does this automatically
 //  when the application's main window is not a dialog
 SetIcon(m_hIcon, TRUE);   // Set big icon
 SetIcon(m_hIcon, FALSE);  // Set small icon
 
 // TODO: Add extra initialization here

 //1.画主界面,关闭、放大、缩小等,qq头像,菜单按钮,显示状态,邮件等按钮。

 //关键字:SetBmp
 CRect rc;GetClientRect(&rc);

 //Close Btn
 btnClose.Create(NULL,WS_VISIBLE|WS_CHILD,CRect(rc.right-35,0,rc.right-5,19),this,DE_WM_CLOSE);
 btnClose.SetBmp(IDB_BIT_CLOSE_NORMAL,IDB_BIT_CLOSE_HOVER,IDB_BIT_CLOSE_HDOWN,NULL);
 //Cro Btn
 btnCro.Create(NULL,WS_VISIBLE|WS_CHILD,CRect(rc.right-66,0,rc.right-36,19),this,DE_WM_CRO);
 btnCro.SetBmp(IDB_BIT_CRO_NORMAL,IDB_BIT_CRO_HOVER,IDB_BIT_CRO_HDOWN,NULL);
 //Min Btn
 btnMin.Create(NULL,WS_VISIBLE|WS_CHILD,CRect(rc.right-97,0,rc.right-67,19),this,DE_WM_MIN);

 btnMin.SetBmp(IDB_BIT_MIN_NORMAL,IDB_BIT_MIN_HOVER,IDB_BIT_MIN_HDOWN,NULL);

 //Head Btn
 btnHead.Create(NULL,WS_VISIBLE|WS_CHILD,CRect(4,37,51,77),this,DE_WM_HEAD);
 btnHead.SetBmp(IDB_BIT_HEAD,IDB_BIT_HEAD,IDB_BIT_HEAD,NULL);

 //Menu Btn
 btnMenu.Create(NULL,WS_VISIBLE|WS_CHILD,CRect(0,rc.bottom-34,54,rc.bottom),this,DE_WM_MENU);
 btnMenu.SetBmp(IDB_BIT_MENU_NORMAL,IDB_BIT_MENU_HOVER,IDB_BIT_MENU_HDOWN,NULL);

 btnState.Create("隐身",WS_VISIBLE|WS_CHILD,CRect(70,50,115,70),this,DE_WM_STATE);
 btnState.SetIcon(IDI_STATE,16);

   btnMail.Create("(0)",WS_VISIBLE|WS_CHILD,CRect(125,50,165,70),this,DE_WM_MAIL);
   btnMail.SetIcon(IDI_MAIL,16);
 
 
 //2.画底部的按钮,手机,qq音乐,宠物,qq空间

 //关键字:SetIcon
 btnMobile.Create(NULL,WS_VISIBLE|WS_CHILD,CRect(30,rc.bottom-55,50,rc.bottom-35),this,DE_WM_MOBILE);
 btnMobile.SetIcon(IDI_MOBILE,16);

 btnMusic.Create(NULL,WS_VISIBLE|WS_CHILD,CRect(55,rc.bottom-55,75,rc.bottom-35),this,DE_WM_MUSIC);
 btnMusic.SetIcon(IDI_MUSIC,16);

 btnPet.Create(NULL,WS_VISIBLE|WS_CHILD,CRect(80,rc.bottom-55,100,rc.bottom-35),this,DE_WM_PET);
 btnPet.SetIcon(IDI_PET,16);

 btnResearch.Create(NULL,WS_VISIBLE|WS_CHILD,CRect(105,rc.bottom-55,125,rc.bottom-35),this,DE_WM_RESEARCH);
 btnResearch.SetIcon(IDI_RESEARCH,16);

 btnZone.Create(NULL,WS_VISIBLE|WS_CHILD,CRect(130,rc.bottom-55,150,rc.bottom-35),this,DE_WM_ZONE);
 btnZone.SetIcon(IDI_ZONE,16);

  CRect rcFolderCtrl;rcFolderCtrl.SetRect(rc.left+35,rc.top+89,rc.right-4,rc.bottom-68);

 

 //3.画联系人分组,我的好友,我的同学之类的
 CGfxOutBarCtrl *gfx=new CGfxOutBarCtrl;
 DWORD dwf = CGfxOutBarCtrl::fDragItems|CGfxOutBarCtrl::fEditGroups|CGfxOutBarCtrl::fEditItems|CGfxOutBarCtrl::fRemoveGroups|
  CGfxOutBarCtrl::fRemoveItems|CGfxOutBarCtrl::fAddGroups|CGfxOutBarCtrl::fAnimation
  |CGfxOutBarCtrl::fSelHighlight;
 gfx->Create(WS_VISIBLE|WS_CHILD,rcFolderCtrl,this,111111,dwf);
 gfx->AddFolder("一生好友",0);
 gfx->AddFolder("如今同学",1);
 gfx->AddFolder("亲人姐弟",2);
 gfx->AddFolder("大学老师",3);
 gfx->AddFolder("东华志友",4);
 gfx->AddFolder("Csdn小组",5);
 gfx->AddFolder("100题讨论",6);
 
//  gfx->InsertItem(0,0,"刘若英",0,0);
//  gfx->InsertItem(0,1,"001",0,0);
//  gfx->InsertItem(0,1,"002",0,0);

 CInternet *net=new CInternet;
 net->Create(NULL,NULL,WS_CHILD|WS_VISIBLE,rcFolderCtrl,this,22222222);
 net->ShowWindow(SW_HIDE);


 //4.画主界面左边的拍拍,在线电影,之类的。
///Tab

 //关键字:SetIcon
 tabMem.Create(NULL,WS_CHILD|WS_VISIBLE,CRect(0,90,35,300),this,DE_WM_MEM);
// tabMem.AddTabItem(IDB_BIT_TAB_NORMAL,IDB_BIT_TAB_HOVER,IDB_BIT_TAB_HOVER,IDI_PAI,NULL);
 tabMem.SetBmp(IDB_BIT_TAB_NORMAL,IDB_BIT_TAB_HOVER,IDB_BIT_TAB_HDOWN);
 tabMem.SetIcon(0,IDI_PAI,gfx);
 tabMem.SetIcon(1,IDI_IT,net);
 tabMem.SetIcon(2,IDI_ONE,NULL);
 tabMem.SetIcon(3,IDI_HEART,NULL);
 tabMem.SetIcon(4,IDI_ONLINE,NULL);
 tabMem.m_iCurrentSelect=0;
// tabMem.SetIcon(IDI_PAI,NULL);

//  CRect rect;GetClientRect(&rect);
//  CMainTabCtrl *pTab=new CMainTabCtrl;
//  pTab->Create(WS_VISIBLE|WS_CHILD,rect,this,10000);

 
//  CFolderCtrl *pFolder=new CFolderCtrl;
//  pFolder->Create(WS_VISIBLE|WS_CHILD,rect,pTab,20000);
//  CFolderCtrl *pFolder=new CFolderCtrl;
//  pFolder->Create(WS_VISIBLE|WS_CHILD,CRect(0,0,64,69),this,DE_WM_CLOSE);
 return TRUE;  // return TRUE  unless you set the focus to a control
}

 

三、画顶角、中心段等处。

 //关键字:CBitmap

void CMyICQDlg::OnPaint()
{
 if (IsIconic())
 {
  CPaintDC dc(this); // device context for painting

  SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

  // Center icon in client rectangle
  int cxIcon = GetSystemMetrics(SM_CXICON);
  int cyIcon = GetSystemMetrics(SM_CYICON);
  CRect rect;
  GetClientRect(&rect);
  int x = (rect.Width() - cxIcon + 1) / 2;
  int y = (rect.Height() - cyIcon + 1) / 2;

  // Draw the icon
  dc.DrawIcon(x, y, m_hIcon);
 }
 else
 {
  CPaintDC dc(this);
  CRect rc;GetClientRect(&rc);
  //rc.InflateRect(CSize(2,12));
  CDC memDC;memDC.CreateCompatibleDC(&dc);
  CBitmap bit;bit.CreateCompatibleBitmap(&dc,rc.Width(),rc.Height());
  CBitmap *OldBmp = memDC.SelectObject(&bit);
  memDC.DrawEdge(rc,EDGE_SUNKEN,0);

  //-------Title1
  //Title1 Left
  CBitmap bmpTitle1Left;bmpTitle1Left.LoadBitmap(IDB_BIT_TITLE1_LEFT);
  DrawBmpByPoint(&memDC,bmpTitle1Left,CPoint(0,0));
  //Title1 Mid
  CBitmap bmpTitle1Mid;bmpTitle1Mid.LoadBitmap(IDB_BIT_TITLE1_MID);
  DrawBmpByCRect(&memDC,bmpTitle1Mid,CRect(64,0,rc.right-79,22));
  //Title1 Right
  CBitmap bmpTitle1Right;bmpTitle1Right.LoadBitmap(IDB_BIT_TITLE1_RIGHT);
  DrawBmpByPoint(&memDC,bmpTitle1Right,CPoint(rc.right-79,0));
  
  //-------Title2
  //Title2 Left
  CBitmap bmpTitle2Left;bmpTitle2Left.LoadBitmap(IDB_BIT_TITLE2_LEFT);
  DrawBmpByPoint(&memDC,bmpTitle2Left,CPoint(0,22));
  //Title2 Mid
  CBitmap bmpTitle2Mid;bmpTitle2Mid.LoadBitmap(IDB_BIT_TITLE2_MID);
  DrawBmpByCRect(&memDC,bmpTitle2Mid,CRect(63,22,rc.right-115,67));
  //Title2 Right
  CBitmap bmpTitle2Right;bmpTitle2Right.LoadBitmap(IDB_BIT_TITLE2_RIGHT);
  DrawBmpByPoint(&memDC,bmpTitle2Right,CPoint(rc.right-115,22));
  
  //-------Center
   //Center Left
  CBitmap bmpCenterLeft;bmpCenterLeft.LoadBitmap(IDB_BIT_CENTER_LEFT);
  DrawBmpByCRect(&memDC,bmpCenterLeft,CRect(0,89,35,rc.bottom-68));
  //Center Right
   CBitmap bmpCenterRight;bmpCenterRight.LoadBitmap(IDB_BIT_CENTER_RIGHT);
   DrawBmpByCRect(&memDC,bmpCenterRight,CRect(rc.right-4,89,rc.right,rc.bottom-68));

  //-------Bottom
  //Bottom Left
  CBitmap bmpBottomLeft;bmpBottomLeft.LoadBitmap(IDB_BIT_BOTTON_LEFT);
  DrawBmpByPoint(&memDC,bmpBottomLeft,CPoint(0,rc.bottom-68));
  //Bottom Mid
  CBitmap bmpBottomMid;bmpBottomMid.LoadBitmap(IDB_BIT_BOTTOM_MID);
  DrawBmpByCRect(&memDC,bmpBottomMid,CRect(73,rc.bottom-68,rc.right-68,rc.bottom));
  //Bottom Right
  CBitmap bmpBottomRight;bmpBottomRight.LoadBitmap(IDB_BIT_BOTTOM_RIGHT);
  DrawBmpByPoint(&memDC,bmpBottomRight,CPoint(rc.right-68,rc.bottom-68));


  //BitBlt
  dc.BitBlt(0,0,rc.Width(),rc.Height(),&memDC,0,0,SRCCOPY);
  //
  CDialog::OnPaint();
 }
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CMyICQDlg::OnQueryDragIcon()
{
 return (HCURSOR) m_hIcon;
}

//Change Client-Msg To Caption-Msg
UINT CMyICQDlg::OnNcHitTest(CPoint point)
{
 // TODO: Add your message handler code here and/or call default
 
 UINT nHitTest = CDialog::OnNcHitTest(point);

 if(nHitTest==HTCLIENT)
  nHitTest=HTCAPTION;
 return nHitTest;
}

//Set Bmp by Point
void CMyICQDlg::DrawBmpByPoint(CDC *pDC, CBitmap &mainBmp, const CPoint &pt)
{
 CDC tmpDC;tmpDC.CreateCompatibleDC(pDC);
 BITMAP tmpBmp;
 mainBmp.GetBitmap(&tmpBmp);
 
 CBitmap *oldBmp = tmpDC.SelectObject(&mainBmp);

 pDC->BitBlt(pt.x,pt.y,tmpBmp.bmWidth,tmpBmp.bmHeight,&tmpDC,0,0,SRCCOPY);
 
 tmpDC.SelectObject(&oldBmp);
 oldBmp->DeleteObject();
}

//Set Bmp By CRect
void CMyICQDlg::DrawBmpByCRect(CDC *pDC, CBitmap &bitRect, CRect &rect)
{
 CDC tmpDC;tmpDC.CreateCompatibleDC(pDC);
 BITMAP tmpBmp;
 bitRect.GetBitmap(&tmpBmp);

 CBitmap *oldBmp = tmpDC.SelectObject(&bitRect);

 for(int y=rect.top;y<rect.bottom;y+=tmpBmp.bmHeight)
 {
  for(int x=rect.left;x<rect.right;x+=tmpBmp.bmWidth)
  {
   pDC->BitBlt(x,y,tmpBmp.bmWidth,tmpBmp.bmHeight,&tmpDC,0,0,SRCCOPY);
  }
 }
 tmpDC.SelectObject(&oldBmp);
 oldBmp->DeleteObject();
}

//关闭
void CMyICQDlg::OnDeClose()
{
 exit(0);
}

//最小化

void CMyICQDlg::Min()
{
 ShowWindow(SW_MINIMIZE);
}

-------------------

完。July、二零一零年十二月二十二日。

转载于:https://www.cnblogs.com/v-July-v/archive/2010/12/22/1983712.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值