相信已经有很多人用过QQ2009了,自然也对其中的UI设计很感兴趣,觉得设计很是完美。但是这是怎么设计的呢?下面我介绍一个用来实现这种效果的设计库——DSkinLite(源于CodeProject)。下面通过一个演示程序来介绍使用过程:

程序中,我主要对主窗口和两个通用对话框(打开对话框和浏览对话框)进行了换肤,这里我所有的窗口都使用了同一个皮肤(定义在XML文件中),通常应该为每个对话框都定义自己的皮肤。下面我简要描述一下使用过程:

1、 将头文件和库文件放在你的工程目录下:

(1)    头文件路径

…\FileCutterTool\include,其中包含DskinDef.h和DSkinDLL.h两个文件

(2)    库文件路径

…\FileCutterTool\lib,其中dskinlite.lib为多字节编码,dskinliteu.lib为Unicode编码

(3)    在工程的属性中添加附加依赖项路径,保证.lib库导入到工程中。

2、 在stdafx.h中导入库文件:

#ifdef DSKINDLL_EXPORTS

#define DSKINDLL_API extern "C" __declspec(dllexport)

#else

#define DSKINDLL_API extern "C" __declspec(dllimport)

#endif

#include "..\include\dskindll.h"

#include "..\include\dskindef.h"

#include <afxdlgs.h>

3、 在FileCutterTool.cpp文件中添加初始化库和结束库的代码:

(1)    在InitInstance()中添加初始化库代码

//Load the skin theme

dsLoadSkin( _T("SkinQQ"));

(2)    在Existance()中添加结束库的代码(也可放在InitInstance()的最后)

dsExitSkin();

4、 在XML文件中定义皮肤(略)

5、 在对话框的OnInitDialog()中添加换肤的代码

dsSkinWindow( GetSafeHwnd(), SKIN_TYPE_DIALOG, _T("mfctestdialog"), FALSE);

dsSkinWindow( GetDlgItem( IDC_SOURCEBROWSER)->GetSafeHwnd(), SKIN_TYPE_BUTTON, _T("button"), FALSE);

dsSkinWindow( GetDlgItem( IDC_DESTBROWSER)->GetSafeHwnd(), SKIN_TYPE_BUTTON, _T("button"), FALSE);

dsSkinWindow( GetDlgItem( IDC_START)->GetSafeHwnd(), SKIN_TYPE_BUTTON, _T("button"), FALSE);

dsSkinWindow( GetDlgItem( IDC_STOP)->GetSafeHwnd(), SKIN_TYPE_BUTTON, _T("button"), FALSE);

dsSkinWindow( GetDlgItem( IDCANCEL)->GetSafeHwnd(), SKIN_TYPE_BUTTON, _T("button"), FALSE);

dsSkinWindow( GetDlgItem( IDC_STATIC_1)->GetSafeHwnd(), SKIN_TYPE_STATIC, NULL, FALSE);

dsSkinWindow( GetDlgItem( IDC_STATIC_2)->GetSafeHwnd(), SKIN_TYPE_STATIC, NULL, FALSE);

dsSkinWindow( GetDlgItem( IDC_EDITSOURCE)->GetSafeHwnd(), SKIN_TYPE_EDIT, _T("edit"), FALSE);

dsSkinWindow( GetDlgItem( IDC_EDITDEST)->GetSafeHwnd(), SKIN_TYPE_EDIT, _T("edit"), FALSE);

dsSkinWindow( GetDlgItem( IDC_STATUSTEXT)->GetSafeHwnd(), SKIN_TYPE_EDIT, _T("edit"), FALSE);

dsSkinWindow( GetDlgItem( IDC_SELECTSPLIT)->GetSafeHwnd(), SKIN_TYPE_RADIOBUTTON, _T("radiobutton"), FALSE);

dsSkinWindow( GetDlgItem( IDC_SELECTMERGE)->GetSafeHwnd(), SKIN_TYPE_RADIOBUTTON, _T("radiobutton"), FALSE);

dsSkinWindow( GetDlgItem( IDC_COMBO1)->GetSafeHwnd(), SKIN_TYPE_COMBOBOX, _T("combobox"), FALSE);

dsSkinWindow( GetDlgItem( IDC_STATIC)->GetSafeHwnd(), SKIN_TYPE_GROUPBOX, _T("groupbox"), FALSE);

dsSkinWindow( GetDlgItem( IDC_PROGRESS1)->GetSafeHwnd(), SKIN_TYPE_PROGRESS, _T("progress"), FALSE);

dsSkinWindow( GetDlgItem( IDC_BUTTON1)->GetSafeHwnd(), SKIN_TYPE_BUTTON, _T("mainmenubutton"), FALSE);

dsSkinWindow( GetDlgItem( IDC_BUTTON2)->GetSafeHwnd(), SKIN_TYPE_BUTTON, _T("messagebutton"), FALSE);

dsSkinWindow( GetDlgItem( IDC_BUTTON3)->GetSafeHwnd(), SKIN_TYPE_BUTTON, _T("smsbutton"), FALSE);

dsSkinWindow( GetDlgItem( IDC_BUTTON4)->GetSafeHwnd(), SKIN_TYPE_BUTTON, _T("appcenterbutton"), FALSE);

dsSkinWindow( GetDlgItem( IDC_BUTTON5)->GetSafeHwnd(), SKIN_TYPE_BUTTON, _T("petbutton"), FALSE);

dsSkinWindow( GetDlgItem( IDC_BUTTON6)->GetSafeHwnd(), SKIN_TYPE_BUTTON, _T("gamebutton"), FALSE);

dsSkinWindow( GetDlgItem( IDC_BUTTON7)->GetSafeHwnd(), SKIN_TYPE_BUTTON, _T("chatbutton"), FALSE);

6、 为打开对话框添加换肤代码

要为打开对话框添加换肤代码,首先要自定义一个类,在类中实现,详细代码如下:

头文件:

#pragma once

// CMyFileDialog

class CMyFileDialog

{

// 接口

public:

// 构造函数

CMyFileDialog(void);

// 获取文件全名(含路径)

LPCTSTR GetFile() { return m_szFile; }

// 显示打开对话框

BOOL OpenFileDialog(HWND hWndParent);

// 内部实现

protected:

// 文件名

WCHAR m_szFile[MAX_PATH];

OPENFILENAME m_openFile;

// CALLBACK function

static UINT_PTR CALLBACK OFNHookProc(HWND hdlg,UINT uiMsg,WPARAM wParam,LPARAM lParam);

};

实现文件:

// MyFileDialog.cpp : 实现文件

//

#include "stdafx.h"

#include "FileCutterTool.h"

#include "MyFileDialog.h"

#include "windows.h"

// CMyFileDialog

CMyFileDialog::CMyFileDialog()

{

memset(m_szFile,0,MAX_PATH);

::ZeroMemory(&m_openFile,sizeof(OPENFILENAME));

m_openFile.lStructSize = sizeof(OPENFILENAME);

m_openFile.hwndOwner = NULL;

m_openFile.lpstrFile = m_szFile;

m_openFile.nMaxFile = MAX_PATH;

m_openFile.lpstrFilter = _T("All Files(*.*)\0*.*\0\0");

//   m_openFile.Flags =  OFN_ENABLEHOOK | OFN_EXPLORER;

m_openFile.Flags =  OFN_ENABLEHOOK;

m_openFile.lpfnHook = OFNHookProc;

}

BOOL CMyFileDialog::OpenFileDialog(HWND hWndParent)

{

m_openFile.hwndOwner = hWndParent;

if(GetOpenFileName(&m_openFile))

{

return TRUE;

}

return FALSE;

}

UINT_PTR CALLBACK CMyFileDialog::OFNHookProc(HWND hdlg,UINT uiMsg,WPARAM wParam,LPARAM lParam)

{

if (uiMsg==WM_INITDIALOG)

{

dsSkinWindow( hdlg, SKIN_TYPE_DIALOG, _T("mfctestdialog"), TRUE);

}

return 0;

}

调用代码:

// 打开文件对话框

CMyFileDialog sourceDlg;

if (sourceDlg.OpenFileDialog(m_hWnd))

{

// 获取源文件名

strSourceText = sourceDlg.GetFile();

}

7、 为浏览对话框添加换肤代码

要实现为浏览对话框换肤,也需要自定义一个类,详细实现代码如下:

头文件:

#ifndef _DIRDIALOG_H_

#define _DIRDIALOG_H_

#include <shlobj.h>

class CDirDialog

{

// 接口

public:

CDirDialog(void);

// 显示浏览对话框

BOOL DoBrowser(HWND hWndParent,LPCTSTR pszTitle = NULL);

// 取得用户选择的目录名称

LPCTSTR GetPath() { return m_szPath; }

protected:

// 浏览对话框所需的结构体,详见MSDN

BROWSEINFO m_info;

// 用来接受用户选择目录的缓冲区

WCHAR m_szDisplay[MAX_PATH];

WCHAR m_szPath[MAX_PATH];

// CALLBACK function

static int CALLBACK BrowseCallbackProc(HWND hwnd,UINT uMsg,LPARAM lParam,LPARAM lpData);

};

#endif // _DIRDIALOG_H_

实现文件:

#include "stdafx.h"

#include "windows.h"

#include "DirDialog.h"

CDirDialog::CDirDialog()

{

memset(&m_info,0,sizeof(m_info));

m_info.hwndOwner = NULL;

m_info.pidlRoot = NULL;

m_info.pszDisplayName = m_szDisplay;

m_info.lpszTitle = NULL;

m_info.ulFlags = BIF_RETURNONLYFSDIRS;

m_info.lpfn = BrowseCallbackProc;

m_szPath[0] = '\0';

}

BOOL CDirDialog::DoBrowser(HWND hWndParent, LPCTSTR pszTitle)

{

if (pszTitle == NULL)

{

m_info.lpszTitle = _T("选择目标文件夹");

}

else

{

m_info.lpszTitle = pszTitle;

}

m_info.hwndOwner = hWndParent;

LPITEMIDLIST pItem = ::SHBrowseForFolder(&m_info);

if (pItem != 0)

{

::SHGetPathFromIDList(pItem,m_szPath);

return TRUE;

}

return FALSE;

}

int CALLBACK CDirDialog::BrowseCallbackProc(HWND hwnd,UINT uMsg,LPARAM lParam,LPARAM lpData)

{

if (uMsg==BFFM_INITIALIZED)

{

dsSkinWindow( hwnd, SKIN_TYPE_DIALOG, _T("mfctestdialog"), TRUE);

}

return 0;

}

调用代码:

// 浏览目录对话框

CDirDialog sourceDlg;

if (sourceDlg.DoBrowser(m_hWnd))

{

// 获取源文件目录

strSourceText = sourceDlg.GetPath();

}

上面的代码即可实现换肤,在这里我要强调一个函数dsSkinWindow(),当最后一个参数为TRUE时,则整个窗口可实现全部换肤;当为FALSE时,只是对窗口框架进行换肤,而其中的控件则不做修改,需要自己逐个换肤,详细代码可以参照上面代码。

用DSkinLite实现QQ界面相关推荐

  1. 仿qq左滑删除listview_Java基于Swing和Netty仿QQ界面聊天小项目

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:硬刚一周,3W字总结,一年的经验告诉你如何准备校招! 个人原创100W+访问量博客:点击前往,查看更多 来源:b ...

  2. MFC 列表控件CListCtrl加载类似QQ界面的头像与文字

    本文主要讲述使用VS2012 MFC的CListCtrl(列表)控件加载类似于QQ界面的图片与文字数据.主要通过CListCtrl::InsertColumn.InsertItem.SetItemTe ...

  3. jquery ui仿腾讯web qq界面desktop酷炫特效

    下载:20130709125708248 原文:jquery ui仿腾讯web qq界面desktop酷炫特效

  4. android+qq底部界面,Android 高仿QQ 界面滑动效果

    Android高仿QQ界面滑动效果 点击或者滑动切换画面,用ViewPager实现, 首先是布局文件: android:layout_width="match_parent" an ...

  5. python实现qq登录界面_Python实现QQ界面

    Python实现QQ界面(好友列表,通信部分还未做好,没时间~~嘻嘻) 项目环境: (1)OS:Linux RedHat6.3 (2)Language:Python (3)Lib:pygtk,gtk ...

  6. 循序渐进实现仿QQ界面(三):界面调色与控件自绘

    本篇讲述如何进行界面调色.界面调色一般有两种方法,调色板和HSL色彩变换.调色板局限于256色,这里不采用,因此用HSL色彩变换实现.首先要了解一下什么是HSL色彩空间,完整且详尽的知识请到维基百科去 ...

  7. vc循序渐进实现仿QQ界面(三):界面调色与控件自绘

    本篇讲述如何进行界面调色.界面调色一般有两种方法,调色板和HSL色彩变换.调色板局限于256色,这里不采用,因此用HSL色彩变换实现.首先要了解一下什么是HSL色彩空间,完整且详尽的知识请到维基百科 ...

  8. java qq聊天界面_【附源码】用Java写了一个类QQ界面聊天小项目,可在线聊天!...

    原标题:[附源码]用Java写了一个类QQ界面聊天小项目,可在线聊天! 目录: 1.功能实现 2.模块划分 3.使用到知识 4.部分代码实现 5.运行例图 1.功能实现 1.修改功能(密码.昵称.个性 ...

  9. Android Studio仿QQ界面实现简单的功能

    文章目录 1. 登录界面 2. 记住密码功能 3. Fragment界面跳转 3.1 Fragement的界面编写 4. 聊天界面 写在前面 由于本人初学阶段,写这篇博客是总结所学的知识点,为后面的进 ...

最新文章

  1. c语言程序计算bmi指数,计算BMI的程序怎么写
  2. Android应用程序键盘(Keyboard)消息处理机制分析(20)
  3. 常用巡检语句(oracle)
  4. Android学习笔记---后台运行方法
  5. c++观察者模式observer
  6. javascript的数组之reduce()
  7. Oracle学习操作(6)函数与存储过程
  8. 【J2ME 2D 游戏开发系列】◣HIMI游戏开发启蒙教程◢JAVA零基础学习J2ME游戏开发全过程!...
  9. css中clear的作用是什么?
  10. MIT6.830 lab6 Rollback and Recovery 实验报告
  11. Java中的Random()函数 【转载】
  12. 我发现Facebook Messenger漏洞可使安卓用户互相监听,获奖6万美元
  13. TypeScript算法专题 - blog1.基于TypeScript语言的单链表实现
  14. Python3入门机器学习经典算法与应用 第3章 numpy矩阵运算
  15. python 字典排序成绩_原来python中dict()的高级用法可以这样实现!真是让我长了见识...
  16. 使用uTools快捷地图片转文字
  17. css div背景图大小,divcss如何改变背景图片大小
  18. STM32+IAP方案 实现网络升级应用固件
  19. 6大应用,大象机器人双臂协作机器人,即将7月上市,一切就绪!
  20. 什么是web前端开发工程师?主要做什么的?

热门文章

  1. LWC 69: 774. Minimize Max Distance to Gas Station
  2. 我用nodejs和electron实现了一个简单的聊天软件-----chat 开源
  3. 优漫动游学会平面设计能轻松就业吗?
  4. PHP关于文件上传,下载,删除,读取
  5. 微信小程序上实现 表格
  6. VUE的Excel导入导出功能
  7. 测试开发工程师必问面试题
  8. [附源码]Java计算机毕业设计SSM电商后台管理系统
  9. matlab遥感影像相对配准,基于IHS 变换的遥感影像融合方法研究
  10. 数据库读取速度与文件IO读取速度比较