您的位置:首页 > 其它

循序渐进实现仿QQ界面演示程序编译问题及MFC调用RingSDK图象库示例

2010-01-29 22:46 686 查看
有不少朋友反映《循序渐进实现仿QQ界面》里面的示例程序无法编译或编译有问题,以及希望能有MFC的工程,在此集中解答一下。

 

演示程序编译问题:

 

1、演示程序需要最新版本的RingSDK,请先用SVN到svn://svnhost.cn/RingSDK更新到最新版本,推荐用TortoiseSVN。TortoiseSVN的下载地址:http://tortoisesvn.net/downloads,安装后在资源管理器新建RingSDK目录,比如c:/ringsdk,在该文件夹上按鼠标右键,选择“SVN 检出”,输入地址svn://svnhost.cn/RingSDK,按确定就获取到了最新版本的RingSDK。

 

2、安装platform sdk,可以到微软网站去下或是到如下地址:ftp://platformsdk:platformsdk@61.132.59.166/platform_sdk.zip,如果setup不能安装请用setup 目录里的psdk_x86.msi安装。安装后选择VC菜单Tools->Options...,在弹出的对话框中选择Directories页,Show directories for:下拉框里选择include files,然后在下面列表中确认Platform SDK的include目录是排在第一位。同时把RingSDK的include目录加入列表,如下图:



 

然后Show directories for:下拉框里选择Library files,确认Platform SDK的lib目录排在第一位,把RingSDK的lib目录加入列表。如果你想调试程序时跟进RingSDK源代码,应该把RingSDK下libsrc下的目录加入到Source files列表里面。

 

3、编译RingSDK,先打开ringsdk/libsrc/freelib目录下3个子目录里的工程,这是3个第3方库,zlib,png和jpeg库,编译一下。然后打开ringsdk/ringsdk.dsw,编译RingSDK库

 

4、至此环境已经搭建完成,可以编译ringsdk/example下的示例程序和仿QQ界面的演示程序了。

 

MFC如何调用RingSDK图象库:

 

这里有个演示程序,MFC工程,下载地址:http://download.csdn.net/source/2028551

 

先看看程序截图:

 



 

是一个动画异性型窗口,按左键可拖动,按右键弹出菜单可选择退出。在此说明一下步骤,按此步骤可以不用去下这个演示程序,自己就能做出来。

 

1、新建一MFC对话框工程mfcdibdemo,选择使用MFC静态库。

 

2、选择VC菜单Project->setting...,General标签页,确认Microsoft Foundation Classes:的选项是Use MFC in a Static Library,然后选择C/C++标签页,Catgory:选择Code Generation,然后在下面的Use run-time library里面选择Debug Multithreaded或Multithreaded,设置完成。

 

3、把上面的程序截图图片存到本地,加入到资源,资源类型输入"GIF",连引号一起输入,资源ID为IDG_BKG

 

4、新建菜单资源,如下图:



 

映射两个菜单项命令函数为OnHelp和OnExit

 

5、CMfcdibdemoDlg增加WM_LBUTTONDOWN,WM_RBUTTONDOWN,WM_MEARUSEITEM,WM_DRAWITEM,消息的处理

 

6、代码修改:

 

mfcdibdemoDlg.h的开始包含图象库和界面库的头文件:

 

#include "ringdib.h"
#include "ringdows.h"

 

CMfcdibdemoDlg类增加两个成员变量:

RingDIB m_dib;
RingCoolMenu *m_rm;

 

修改mfcdibdemoDlg.cpp文件:

 

CMfcdibdemoDlg::OnInitDialog的最后,//TODO下面添加如下代码:

 

//MFC调用RingSDK库必须执行此初始化,第一个参数应该是主窗口句柄,可为NULL,第2个参数必须正确传递
InitRingLib(m_hWnd,AfxGetResourceHandle());
DIBREGFORMAT(GIF);
m_dib.Load(MAKEINTRESOURCE(IDG_BKG),"GIF",GIF);
m_dib.SetTarget(m_hWnd);
m_dib.CreateCoolWindow();

m_rm = new RingCoolMenu;
m_rm->LoadPopup(MAKEINTRESOURCE(IDR_POPMENU));
m_rm->SetXPStyle();


 

新增的消息代码:

void CMfcdibdemoDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default

CDialog::OnLButtonDown(nFlags, point);
EasyMove(m_hWnd);
}

void CMfcdibdemoDlg::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default

CDialog::OnRButtonDown(nFlags, point);

m_rm->Popup(m_hWnd);
}

void CMfcdibdemoDlg::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
// TODO: Add your message handler code here and/or call default
if(lpMeasureItemStruct->CtlType == ODT_MENU)
{
LPRINGMENUSTYLE lprms = (LPRINGMENUSTYLE)lpMeasureItemStruct->itemData;
if(lprms)
{
try
{
lprms->pMenu->MeasureItem(lpMeasureItemStruct);
}
catch(...)
{
}
}
}
//CDialog::OnMeasureItem(nIDCtl, lpMeasureItemStruct);
}

void CMfcdibdemoDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
// TODO: Add your message handler code here and/or call default
if(lpDrawItemStruct->CtlType == ODT_MENU)
{
LPRINGMENUSTYLE lprms = (LPRINGMENUSTYLE)lpDrawItemStruct->itemData;
if(lprms)
{
try
{
lprms->pMenu->Draw(lpDrawItemStruct);
}
catch(...)
{
}
}
}
//CDialog::OnDrawItem(nIDCtl, lpDrawItemStruct);
}

void CMfcdibdemoDlg::OnClose()
{
// TODO: Add your message handler code here and/or call default
delete m_rm;
CDialog::OnClose();
}

void CMfcdibdemoDlg::OnExit()
{
// TODO: Add your command handler code here
PostMessage(WM_SYSCOMMAND,SC_CLOSE);
}

void CMfcdibdemoDlg::OnHelp()
{
// TODO: Add your command handler code here
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}


 

注意OnMeasureItem和OnDrawItem里面不能调用CDialog::OnMeasureItem和CDialog::OnDrawItem,因为MFC会试图获取MFC的菜单对象但是获取不到,会非法操作。

 

7、完成,编译程序。

 

说明:用MFC的话其实不应该用RingSDK界面库,因为都是对窗口,控件做了封装,想要把仿QQ界面程序移植到MFC,应该自己创建MFC窗口和控件,贴图代码可以照搬。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐