Visual C++开发类似QQ游戏大厅全过程

 前言

        以前一直做的是.net web工作,虽然做的不咋地,但是,感觉总算是个老手了,就想研究点新鲜玩意,而且一辈子不能只是做web吧,而且c++一直是我的梦想,c++是王者之选,我不做一做,死不瞑目啊!

       今日我终于如愿以偿,从上一个公司已辞职,立即开始研究c++了,先是让同事帮忙给点入门的例子,后来同事就到网上扒了一片文章中讲述的IOCP的例子,太简单,后来又找了一个,我不知道从哪里入手加入我的代码,很是郁闷,一个IOCP搞了好几天还是没有明白,再后来我去海淀图书城借了一本书,《windows sockets网络开发——基于Visual C++实现》,孙海民写的,很好,写得很详细,我一下就弄懂了,而且直接基于他的例子我就开始做我的项目了,真是一本好书,特别是刚入门的时候的一本好书,能让你节省好好多多的时间,而且积极性也会大大提高,否则很扫兴,觉得很难,容易让人产生放弃的念头。

       我两天就用Visual C++写好了我的代码,只可惜很丑,正好公司的美工还没有给我效果图,美工又在等领导给内容,呵呵,正好我赶紧研究怎么实现,但是,没有效果图,我还是不能真实的测试,因为这是我第一次做vc,我感觉就是这么做的,但是没有到最后我也不知道还会有什么细节问题我无法实现的,所以荒废了两天,最后效果图给我了,我赶紧开始替换界面,效果图果然与我刚开始的设想有点差别,只好照效果图来做吧,第一用VC感觉真是太费劲了,我以前是做Web的,页面中如果要调用一个图片,那么<img src="photo.jpg" >ok,就好了,但是在Vc中就不可以了,要写很多很多的代码,而我对MFC还没有入门,根本就不会,诸如修改一下窗口的样式,按钮的样式等等细节我都不会,没有办法只能一个一个例子,一句一句代码,从0开始,我从网上查资料。例子,找啊找啊,终于找到了,找到这个效果可以了,那个鼠标效果还是不会,写一句代码就要费上半天尽,写一句代码要学半天,看半天msdn,数据类型转换,界面实现是最痛苦了,结果,一个很简单的东西,光界面就用了一周多才实现,效果还不错,挺漂亮的呵呵,但是我的大厅是基于对话框应用程序的,而且不能实现最大化和还原的功能,因为我的背景是写死的,固定了宽高的,先实现了再说。于是我赶紧找换肤的资料,学习换皮肤的程序是如何绘制窗口的,同时我决定把原先的基于对话框的应用程序修改成SDI应用程序,一下是我的操作全过程:

  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
第一步:新建一个基于对话框的MFC工程,拖动一棵标准树型控件放于界面之上。添加一个新类CTreeCtrlBT派生自CTreeCtrl。 第二步:为该类添加一些消息响应以及虚函数。其详细作用如下: void PreSubclassWindow(); //用于添加初始化控件的相关信息 WM_SIZE //控件区域发生变化时候的处理 WM_PAINT //绘制控件 WM_MOUSEMOVE //主要获取鼠标所在位置的单元项 第三步:TreeCtrlBT.h中首先声明一个结构用于保存单元项的相关信息,并把所有项的信息放入一个map。实现代码如下: typedef struct tagItemMsg { HTREEITEM hItem; //项的句柄 CBitmap ItemBitmap; //项的位图 COLORREF crTransparent; //透明颜色 tagItemMsg() { hItem = NULL; crTransparent = RGB(255,255,255); } ~tagItemMsg() { if ( ItemBitmap.GetSafeHandle() ) { ItemBitmap.DeleteObject(); } } }ITEM_MSG; typedef map ITEMMSG_MAP; 第四步:计算控件的客户区域大小,以及滚动条滚动的偏移量。详细过程参考源代码 Calculate函数。 第五步:添加接口函数以及成员变量。如下: (注意:TransparentBlt函数,需要包含msimg32.dll) //设置背景位图BOOL SetBackgroudBitmap( UINT nID );BOOL SetBackgroudBitmap(LPCTSTR lpszRecourceName);//设置某一项位图void SetItemBitmap(HTREEITEM hItem, UINT nIdBitmap);void SetItemBitmap(HTREEITEM hItem, LPCTSTR lpszBitmap);//设置展开收缩的图表void SetExpandBitmap(UINT nIdExpand, UINT nIdCollapse, COLORREF crTransparent = RGB(255,255,255));//插入新的项目HTREEITEM InsertItemEx(HTREEITEM hParent, LPCTSTR lpszItem, UINT nIdBitmap = 0, OLORREF crTransparent = RGB(255,255,255));HTREEITEM InsertItemEx(HTREEITEM hParent, LPCTSTR lpszItem, LPCTSTR lpszBitmap, COLORREF crTransparent = RGB(255,255,255));//开启横线void EnableRowLine( BOOL bEnable = TRUE );//是否开启横线BOOL IsEnableRowLine();//开启根节点背景void EnableRootBk( BOOL bEnable = TRUE );//是否开启根节点背景BOOL IsEnableRootBk();//获取某一项信息ITEM_MSG* GetItemMsg(HTREEITEM hItem); 第六步:绘制控件。需要的绘制函数如下: //绘制渐变色矩形区域void GradientFillRect( CDC *pDC, CRect &rect, COLORREF col_from, COLORREF col_to, bool vert_grad ); //绘制控件背景void DrawBackgroudBitmap(CDC* pDc); //绘制单元项void DrawItem( CDC* pDC ); //绘制单元项下部横线void DrawRowLine(CPoint ptBegin, CPoint ptEnd, CDC *pDc = NULL); //绘制展开收缩按钮void DrawExpand(CRect rect, int state,
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值