【3】QQ 聊天界面

1.说明

稍微修改了下QQ示例里面的聊天界面界面,然后把代码扣过来完成了QQ聊天界面部分,效果还可以。

2.代码部分

// QQTalk.h文件
#ifndef __QQ_TALK_H__
#define __QQ_TALK_H__
#include <DuiLib/DuiLibEnv.h>
#include <DuiLib/UIlib.h>

using namespace DuiLib;
#define QQ_TALK_XML		_T("chatbox.xml")

class CQQTalk : public CWindowWnd, public INotifyUI
{
public:
	virtual LPCTSTR	GetWindowClassName() const;		// CWindowWnd的纯虚函数,必须实现
	virtual void Notify( TNotifyUI& msg );			// INotifyUI的纯虚函数,必须实现

	// 窗口消息处理回调函数
	virtual LRESULT HandleMessage( UINT uMsg, WPARAM wParam, LPARAM lParam );

private:
	// 消息处理函数
	LRESULT OnNcHitTest(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandle);
	LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandle);
	LRESULT OnNCActivate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandle);
	LRESULT OnNCCalcsize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandle);
	LRESULT OnNCPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandle);
	LRESULT OnDestory(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandle);

	// 控件消息处理函数
	void OnNotifyClick(TNotifyUI& msg);

	// 获取窗口控件
	void	GetCtrlFromRes();

protected:
	CPaintManagerUI			m_paintManager;			// 窗口消息类管理对象

private:
	// 窗口控件列表
	CButtonUI*				m_pbtnClose;
	CButtonUI*				m_pbtnFontBar;
private:
	static LPCTSTR			m_lpszWndClsName;		// 窗口类名
};
#endif
// QQTalk.cpp文件
#include "QQTalk.h"
#include <exception>

LPCTSTR CQQTalk::m_lpszWndClsName = _T("QQTalk");

LPCTSTR CQQTalk::GetWindowClassName() const
{
	return m_lpszWndClsName;
}

void CQQTalk::Notify( TNotifyUI& msg )
{
	if(msg.sType == _T("click"))
	{
		OnNotifyClick(msg);
	}
}

LRESULT CQQTalk::HandleMessage( UINT uMsg, WPARAM wParam, LPARAM lParam )
{
	LRESULT lRes = 0;
	BOOL	bHandle = FALSE;

	switch(uMsg)
	{
	case WM_CREATE:		lRes = OnCreate(uMsg, wParam, lParam, bHandle);break;
	case WM_NCHITTEST:	lRes = OnNcHitTest(uMsg, wParam, lParam, bHandle);break;
	case WM_NCACTIVATE:	lRes = OnNCActivate(uMsg, wParam, lParam, bHandle);break;
	case WM_NCCALCSIZE:	lRes = OnNCCalcsize(uMsg, wParam, lParam, bHandle);break;
	case WM_NCPAINT:	lRes = OnNCPaint(uMsg, wParam, lParam, bHandle);break;
	case WM_DESTROY:	lRes = OnDestory(uMsg, wParam, lParam, bHandle);break;
	default:			lRes = FALSE;break;
	}

	if(bHandle)
	{
		return lRes;
	}
	else
	{
		if( m_paintManager.MessageHandler(uMsg, wParam, lParam, lRes) )
		{
			return lRes;
		}
		else
		{
			return CWindowWnd::HandleMessage(uMsg, wParam, lParam);
		}
	}
}

LRESULT CQQTalk::OnCreate( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandle )
{
	m_paintManager.Init(m_hWnd);
	CDialogBuilder builder;
	CControlUI* pRoot = builder.Create(QQ_TALK_XML, (UINT)0, NULL, &m_paintManager);
	ASSERT(pRoot && "Failed to parse XML");
	m_paintManager.AttachDialog(pRoot);
	bool bRet = m_paintManager.AddNotifier(this);
	GetCtrlFromRes();
	bHandle = TRUE;
	return 0;
}

LRESULT CQQTalk::OnNCActivate( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandle )
{
	bHandle = TRUE;
	return 0;
}

LRESULT CQQTalk::OnNCCalcsize( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandle )
{
	bHandle = TRUE;
	return 0;
}

LRESULT CQQTalk::OnNCPaint( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandle )
{
	bHandle = TRUE;
	return 0;
}

// 实现窗口可拖拽
LRESULT CQQTalk::OnNcHitTest( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandle )
{
	bHandle = TRUE;
	POINT pt;
	pt.x = GET_X_LPARAM(lParam);
	pt.y = GET_Y_LPARAM(lParam);
	::ScreenToClient(*this, &pt);

	RECT rcClient;
	::GetClientRect(*this, &rcClient);

	RECT rcCaption = m_paintManager.GetCaptionRect();
	if( pt.x >= rcClient.left + rcCaption.left && pt.x < rcClient.right - rcCaption.right 		&& pt.y >= rcCaption.top && pt.y < rcCaption.bottom ) {
			CControlUI* pControl = static_cast<CControlUI*>(m_paintManager.FindControl(pt));
			if( pControl && _tcscmp(pControl->GetClass(), _T("ButtonUI")) != 0 &&
				_tcscmp(pControl->GetClass(), _T("OptionUI")) != 0 &&
				_tcscmp(pControl->GetClass(), _T("TextUI")) != 0 )
				return HTCAPTION;
	}

	return HTCLIENT;
}

LRESULT CQQTalk::OnDestory( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandle )
{
	::PostQuitMessage(0L);
	bHandle = TRUE;
	return 0;
}

void CQQTalk::GetCtrlFromRes()
{
	m_pbtnClose = static_cast<CButtonUI*>(m_paintManager.FindControl(_T("closebtn")));
}

void CQQTalk::OnNotifyClick( TNotifyUI& msg )
{
	if( msg.pSender == m_pbtnClose )
	{
		PostQuitMessage(0);
	}
}

// main.cpp
// 测试文件

#include "QQTalk.h"

int WINAPI wWinMain( __in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance, __in LPWSTR lpCmdLine, __in int nShowCmd )
{
	// 初始化CPaintManagerUI
	CPaintManagerUI::SetInstance(hInstance);
	CPaintManagerUI::SetResourcePath(CPaintManagerUI::GetInstancePath() + _T("skin"));
	CPaintManagerUI::SetResourceZip(_T("MyQQRes.zip"));

	// 这一步可选
	// CoInitialize是Windows提供的API函数
	// 用来告诉 Windows以单线程的方式创建com对象
	HRESULT Hr = ::CoInitialize(NULL);
	if( FAILED(Hr) ) return 0;

	// 创建一个QQ对话界面
	CQQTalk* pQQTalkDlg = new CQQTalk();
	pQQTalkDlg->Create(NULL, _T("和XXX的对话"), UI_WNDSTYLE_FRAME, WS_EX_WINDOWEDGE);
	pQQTalkDlg->CenterWindow();
	pQQTalkDlg->ShowModal();
	CPaintManagerUI::MessageLoop();
	delete pQQTalkDlg; pQQTalkDlg = NULL;

	// 逆初始化
	::CoUninitialize();
	return 0;
}

【3】QQ 聊天界面,布布扣,bubuko.com

时间: 2024-12-22 14:17:41

【3】QQ 聊天界面的相关文章

Objective-c——UI基础开发第八天(QQ聊天界面)

一.知识点: QQ聊天界面 双模型的使用(dataModel和frameModel) UITextField的使用 通知的使用 拉伸图片的两种方法(slicing/image对象的resizeableImageWithCapInsets属性) 枚举 方法的抽取(相同的拿出,不同的部分作为参数) 二.设置tableview的基本格式 1)定义tableview基本 numberOfSectionsInTableView:设置块 numberOfRowsInSection:设置每块对应的行数 cel

亲身体验用Java写的仿qq聊天界面

Java开发工具有许多种,新手用记事本写Java程序,有些人用NetBean,jbuilder,高手用eclipse,下面介绍用eclipse开发qq聊天界面. 代码如下: package Myjava_QQ; import java.awt.*; import javax.swing.*; import Myjava_QQ.truess; import java.awt.event.*; import java.applet.*; import java.io.BufferedReader;

QQ聊天界面的输入法顶起界面底部输入框效果的实现

转载请注明:http://www.cnblogs.com/frank-zouxu/p/4127115.html 今天在公司做项目的时候遇到一个需求:需要做一个界面,效果类似QQ聊天界面,如图1,当我们点击内容输入框准备输入内容的时候,底部的表情框的那一栏会被输入法的软键盘给顶起来,默认状态下,输入法会覆盖掉我们的表情输入框.起初,百思不得解的我费尽了心思,未果,偶然看到此篇博客http://blog.csdn.net/twoicewoo/article/details/7384398.其实,欲达

简单模仿QQ聊天界面

首先看一下最终的效果,显示了消息时间,用户昵称,用户头像. 大致实现方法: 用最简单的ListView显示消息内容. 不同的用户使用不同的消息布局文件,例子有2个用户"Tony","Hill". 代码文件清单: 主布局文件activity_main.xml: 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools=&

Android 内部启动其他应用,以及打开指定qq聊天界面

在自己应用中打开第三方应用,有好多种方法,这里举例一种: //以打开微信为例,前提需要知道打开应用的包名,一般一个发布版本的应用,包名不会轻易改变的,但是,打开QQ就要注意了,毕竟QQ的发布版本有不下于4个版本. Intent intent = getPackageManager().getLaunchIntentForPackage("com.tencent.mm"); startActivity(intent); 可以从第三方应用跳转到QQ界面,并可以进入指定的QQ号码的聊天界面(

Android—简单的仿QQ聊天界面

最近仿照QQ聊天做了一个类似界面,先看下界面组成(画面不太美凑合凑合呗,,,,): 其中聊天背景可以是一个LinearLayout或者RelativeLayout里面存放的是ListView(将ListView的分割线设置成透明:android:divider="#0000"否则聊天界面会显示出分割线,,,想想都屌,,,) 于是,我要上主界面的xml布局文件了: <?xml version="1.0" encoding="utf-8"?&g

Android 根据QQ号跳转到QQ聊天界面

从自己开发的应用中根据QQ号跳转到QQ应用的聊天界面,实现起来很方便: 即: startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("mqqwpa://im/chat?chat_type=wpa&uin="+qqNum+"&version=1"))); qqNum(string型)即是所要跳转的qq号. 不过如果直接写这个代码的话,若本机未安装qq应用,程序会直接go die,所以要加以判断:

Android 仿微信QQ聊天界面

一些IM聊天软件的展现形式是左右分开的形式.比如说,别人给你发的信息全部靠左显示,你自己发给别人的信息全部靠右显示. 而我们的ListView很多时候是显示同一个布局,其实BaseAdapter中有2个重要的方法在大多数情况下我们并未使用到,一个是public int getViewTypeCount(),显示ListView中有多少种布局(默认是显示是1),像微信那样聊天界面,是有2种布局方式:另外一个getItemViewType(),可以让不同item条目加载不同的布局,下面就简单的模拟下

仿QQ聊天界面&lt;一&gt;

先上图: 首先需要两个模型: 1->数据模型 2->位置模型 数据模型代码如下: Message.h文件里: #import <Foundation/Foundation.h> typedef enum { MessagesTypeMe = 0 , //自己发的 MessagesTypeOther //别人发的 }MessagesType; @interface Messages : NSObject /** * 聊天内容 */ @property (nonatomic ,copy