⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nukdlg.cpp

📁 一个界面类似QQ界面的小程序
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// NUKDlg.cpp : 实现文件
//

#include "stdafx.h"
#include "NUK.h"
#include "NUKDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CNUKDlg 对话框




CNUKDlg::CNUKDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CNUKDlg::IDD, pParent)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
	PointSpace = 3;
	BorderSpace = 4;
	m_bMouseDown = false;
	m_strStatus = _T("89642685(在线)");
	m_font.CreateFont(
	   15,                        // nHeight
	   0,                         // nWidth
	   0,                         // nEscapement
	   0,                         // nOrientation
	   FW_BOLD,                 // nWeight
	   FALSE,                     // bItalic
	   FALSE,                     // bUnderline
	   0,                         // cStrikeOut
	   ANSI_CHARSET,              // nCharSet
	   OUT_DEFAULT_PRECIS,        // nOutPrecision
	   CLIP_DEFAULT_PRECIS,       // nClipPrecision
	   DEFAULT_QUALITY,           // nQuality
	   DEFAULT_PITCH | FF_SWISS,  // nPitchAndFamily
	   _T("Arial"));                 // lpszFacename
}

void CNUKDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_SKINTAB, m_skintab);
}

BEGIN_MESSAGE_MAP(CNUKDlg, CDialog)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	//}}AFX_MSG_MAP
	ON_WM_GETMINMAXINFO()
	ON_WM_SIZING()
	ON_WM_ERASEBKGND()
	ON_WM_LBUTTONDOWN()
	ON_WM_TIMER()
	ON_WM_LBUTTONUP()
	ON_WM_SETCURSOR()
	ON_WM_MOUSEMOVE()
	ON_WM_DESTROY()
	ON_BN_CLICKED(IDC_BTN_CLOSE, &CNUKDlg::OnBnClickedCloseBtn)
	ON_BN_CLICKED(IDC_BTN_MENU, &CNUKDlg::OnBnClickedMenuBtn)
	ON_BN_CLICKED(IDC_BTN_USERHEAD, &CNUKDlg::OnBnClickedUserHeardBtn)
	ON_BN_CLICKED(IDC_BTN_SEARCH, &CNUKDlg::OnBnClickedSearchBtn)
	ON_BN_CLICKED(IDC_BTN_HOSTING, &CNUKDlg::OnBnClickedHostingBtn)
	ON_BN_CLICKED(IDC_BTN_STATUS, &CNUKDlg::OnBnClickedStatusBtn)
END_MESSAGE_MAP()


// CNUKDlg 消息处理程序

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

	// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	// TODO: 在此添加额外的初始化代码
	CRect rcClient;
	GetClientRect(&rcClient);
	
	//设置背景图片
	SetTopLeftImage(IDB_BITMAP_FRAME_TOPLEFT);
	SetTopMidImage(IDB_BITMAP_FRAME_TOPMID);
	SetTopRightImage(IDB_BITMAP_FRAME_TOPRIGHT);

	SetCenterLeftImage(IDB_BITMAP_FRAME_CENTERLEFT);
	SetCenterMidImage(IDB_BITMAP_FRAME_CENTERMID);
	SetCenterRightImage(IDB_BITMAP_FRAME_CENTERRIGHT);

	SetBottomLeftImage(IDB_BITMAP_FRAME_BOTTOMLEFT);
	SetBottomMidImage(IDB_BITMAP_FRAME_BOTTOMMID);
	SetBottomRightImage(IDB_BITMAP_FRAME_BOTTOMRIGHT);

	m_closeBtn.Create(NULL,WS_CHILD | WS_VISIBLE ,CRect(rcClient.Width()-21,5,rcClient.Width()-21+16,5+16),this,IDC_BTN_CLOSE);
	m_closeBtn.SetImage(IDB_BITMAP_CLOSEBTN_NORMAL,IDB_BITMAP_CLOSEBTN_HOVER,IDB_BITMAP_CLOSEBTN_DOWN,
		IDB_BITMAP_CLOSEBTN_NORMAL);

	//////////////////////////
	CString strNormal,strHover,strDown,strDisable;
	CString strMouseOut,strMouseIn;
	/////////////////////////
	m_userHeadBtn.Create(NULL,WS_CHILD | WS_VISIBLE ,CRect(8,30,8+32,30+32),this,IDC_BTN_USERHEAD);
	m_userHeadBtn.SetImage(IDB_BITMAP_USERHEAD,IDB_BITMAP_USERHEAD,IDB_BITMAP_USERHEAD,
		IDB_BITMAP_USERHEAD);
	m_statusBtn.Create(NULL,WS_CHILD | WS_VISIBLE ,CRect(41,28,41+11,28+36),this,IDC_BTN_STATUS);
	m_statusBtn.SetImage(IDB_BITMAP_STATUSBTN_NORMAL,IDB_BITMAP_STATUSBTN_HOVER,IDB_BITMAP_STATUSBTN_DOWN,
		IDB_BITMAP_STATUSBTN_NORMAL);

	m_mailBtn.Create(NULL,WS_CHILD | WS_VISIBLE ,CRect(55,50,55+35,50+16),this,IDC_BTN_MAIL);
	strMouseOut.LoadStringW(IDS_PATH_MAILBTN_MOUSEOUT);
	strMouseIn.LoadStringW(IDS_PATH_MAILBTN_MOUSEIN);
	m_mailBtn.SetIcon(strMouseOut,strMouseIn);
	m_mailBtn.SetWindowTextW(_T("(0)"));
	m_mailBtn.SetTextPos(CPoint(17,0));
	m_mailBtn.SetColor(RGB(0,28,123),RGB(255,255,255));

	m_hostingBtn.Create(NULL,WS_CHILD | WS_VISIBLE ,CRect(90,50,90+35,50+16),this,IDC_BTN_HOSTING);
	strMouseOut.LoadStringW(IDS_PATH_HOSTINGBTN_MOUSEOUT);
	strMouseIn.LoadStringW(IDS_PATH_HOSTINGBTN_MOUSEIN);
	m_hostingBtn.SetIcon(strMouseOut,strMouseIn);
	m_hostingBtn.SetWindowTextW(_T("(1)"));
	m_hostingBtn.SetTextPos(CPoint(17,0));
	m_hostingBtn.SetColor(RGB(0,28,123),RGB(255,255,255));

	m_paymentBtn.Create(NULL,WS_CHILD | WS_VISIBLE ,CRect(125,50,125+16,50+16),this,IDC_BTN_PAYMENT);
	strMouseOut.LoadStringW(IDS_PATH_PAYMENTBTN_MOUSEOUT);
	strMouseIn.LoadStringW(IDS_PATH_PAYMENTBTN_MOUSEIN);
	m_paymentBtn.SetIcon(strMouseOut,strMouseIn);

	//////////////////////////
	m_mobileBtn.Create(NULL,WS_CHILD | WS_VISIBLE ,CRect(12,rcClient.bottom-52,12+17,rcClient.bottom-52+17),this,IDC_BTN_MOBILE);
	strMouseOut.LoadStringW(IDS_PATH_MOBILEBTN_MOUSEOUT);
	strMouseIn.LoadStringW(IDS_PATH_MOBILEBTN_MOUSEIN);
	m_mobileBtn.SetIcon(strMouseOut,strMouseIn);

	m_gameBtn.Create(NULL,WS_CHILD | WS_VISIBLE ,CRect(12+26,rcClient.bottom-52,12+26+17,rcClient.bottom-52+17),this,IDC_BTN_GAME);
	strMouseOut.LoadStringW(IDS_PATH_GAMEBTN_MOUSEOUT);
	strMouseIn.LoadStringW(IDS_PATH_GAMEBTN_MOUSEIN);
	m_gameBtn.SetIcon(strMouseOut,strMouseIn);

	m_ttBtn.Create(NULL,WS_CHILD | WS_VISIBLE ,CRect(12+26*2,rcClient.bottom-52,12+26*2+17,rcClient.bottom-52+17),this,IDC_BTN_TT);
	strMouseOut.LoadStringW(IDS_PATH_TTBTN_MOUSEOUT);
	strMouseIn.LoadStringW(IDS_PATH_TTBTN_MOUSEIN);
	m_ttBtn.SetIcon(strMouseOut,strMouseIn);

	m_chatBtn.Create(NULL,WS_CHILD | WS_VISIBLE ,CRect(12+26*3,rcClient.bottom-52,12+26*3+17,rcClient.bottom-52+17),this,IDC_BTN_CHAT);
	strMouseOut.LoadStringW(IDS_PATH_CHATBTN_MOUSEOUT);
	strMouseIn.LoadStringW(IDS_PATH_CHATBTN_MOUSEIN);
	m_chatBtn.SetIcon(strMouseOut,strMouseIn);

	m_petBtn.Create(NULL,WS_CHILD | WS_VISIBLE ,CRect(12+26*4,rcClient.bottom-52,12+26*4+17,rcClient.bottom-52+17),this,IDC_BTN_PET);
	strMouseOut.LoadStringW(IDS_PATH_PETBTN_MOUSEOUT);
	strMouseIn.LoadStringW(IDS_PATH_PETBTN_MOUSEIN);
	m_petBtn.SetIcon(strMouseOut,strMouseIn);

	m_musicBtn.Create(NULL,WS_CHILD | WS_VISIBLE ,CRect(12+26*5,rcClient.bottom-52,12+26*5+17,rcClient.bottom-52+17),this,IDC_BTN_MUSIC);
	strMouseOut.LoadStringW(IDS_PATH_MUSICBTN_MOUSEOUT);
	strMouseIn.LoadStringW(IDS_PATH_MUSICBTN_MOUSEIN);
	m_musicBtn.SetIcon(strMouseOut,strMouseIn);

	m_tvBtn.Create(NULL,WS_CHILD | WS_VISIBLE ,CRect(12+26*6,rcClient.bottom-52,12+26*6+17,rcClient.bottom-52+17),this,IDC_BTN_TV);
	strMouseOut.LoadStringW(IDS_PATH_TVBTN_MOUSEOUT);
	strMouseIn.LoadStringW(IDS_PATH_TVBTN_MOUSEIN);
	m_tvBtn.SetIcon(strMouseOut,strMouseIn);
	//////////////////////////
	m_menuBtn.Create(NULL,WS_CHILD | WS_VISIBLE ,CRect(0,rcClient.bottom-30,65,rcClient.bottom-30+24),this,IDC_BTN_MENU);
	strNormal.LoadStringW(IDS_PATH_MENUBTN_NORMAL);
	strHover.LoadStringW(IDS_PATH_MENUBTN_HOVER);
	strDown.LoadStringW(IDS_PATH_MENUBTN_DOWN);
	strDisable.LoadStringW(IDS_PATH_MENUBTN_DISABLE);
	m_menuBtn.SetImage(strNormal,strHover,strDown,strDisable);

	m_msgManagerBtn.Create(NULL,WS_CHILD | WS_VISIBLE ,CRect(75,rcClient.bottom-25,80+17,rcClient.bottom-25+17),this,IDC_BTN_MSGMANAGER);
	strMouseOut.LoadStringW(IDS_PATH_MSGBTN_MOUSEOUT);
	strMouseIn.LoadStringW(IDS_PATH_MSGBTN_MOUSEIN);
	m_msgManagerBtn.SetIcon(strMouseOut,strMouseIn);

	m_searchBtn.Create(NULL,WS_CHILD | WS_VISIBLE ,CRect(100,rcClient.bottom-25,100+45,rcClient.bottom-25+17),this,IDC_BTN_SEARCH);
	strMouseOut.LoadStringW(IDS_PATH_SEARCHBTN_MOUSEOUT);
	strMouseIn.LoadStringW(IDS_PATH_SEARCHBTN_MOUSEIN);	
	m_searchBtn.SetIcon(strMouseOut,strMouseIn);
	m_searchBtn.SetWindowTextW(_T("查找"));
	m_searchBtn.SetColor(RGB(255,255,255),RGB(0,0,0));

	m_skintab.MoveWindow(3,68,27,33*4+4);

	int tabcount = 4;
	m_skintab.SetCount(tabcount);
	for(int i=0;i<tabcount;i++)
	{
		m_skintab.SetRect(i,CRect(0,33*i,27,33*i+33));
		m_skintab.SetSkin(i,_T("image\\barback_normal.bmp"),_T("image\\barback_over.bmp"),_T("image\\barback_disabled.bmp"));
	}
	m_skintab.SetIcon(0,_T("image\\FriendButton.ico"));
	m_skintab.SetIcon(1,_T("image\\NetDiskButton.ico"));
	m_skintab.SetIcon(2,_T("image\\EaseButton.ico"));
	m_skintab.SetIcon(3,_T("image\\BlankPanel.ico"));

	CenterWindow();//居中屏幕

	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。

void CNUKDlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); // 用于绘制的设备上下文

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// 使图标在工作矩形中居中
		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;

		// 绘制图标
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CPaintDC dc(this); // 用于绘制的设备上下文
		
		// TODO: 在此处添加消息处理程序代码

		CRect rcClient;
		GetClientRect(&rcClient);

		//调整控件位置////////////////////////////
		CRect rcCloseBtn;
		m_closeBtn.GetClientRect(&rcCloseBtn);
		m_closeBtn.MoveWindow(rcClient.Width()-21,5,rcCloseBtn.Width(),rcCloseBtn.Height());

		CRect rcMobileBtn;
		m_mobileBtn.GetClientRect(&rcMobileBtn);
		m_mobileBtn.MoveWindow(12,rcClient.bottom-52,rcMobileBtn.Width(),rcMobileBtn.Height());

		CRect rcGameBtn;
		m_gameBtn.GetClientRect(&rcGameBtn);
		m_gameBtn.MoveWindow(12+26,rcClient.bottom-52,rcGameBtn.Width(),rcGameBtn.Height());

		CRect rcTTBtn;
		m_ttBtn.GetClientRect(&rcTTBtn);
		m_ttBtn.MoveWindow(12+26*2,rcClient.bottom-52,rcTTBtn.Width(),rcTTBtn.Height());

		CRect rcChatBtn;
		m_chatBtn.GetClientRect(&rcChatBtn);
		m_chatBtn.MoveWindow(12+26*3,rcClient.bottom-52,rcChatBtn.Width(),rcChatBtn.Height());

		CRect rcPetBtn;
		m_petBtn.GetClientRect(&rcPetBtn);
		m_petBtn.MoveWindow(12+26*4,rcClient.bottom-52,rcPetBtn.Width(),rcPetBtn.Height());

		CRect rcMusicBtn;
		m_musicBtn.GetClientRect(&rcMusicBtn);
		m_musicBtn.MoveWindow(12+26*5,rcClient.bottom-52,rcMusicBtn.Width(),rcMusicBtn.Height());

		CRect rcTVBtn;
		m_tvBtn.GetClientRect(&rcTVBtn);
		m_tvBtn.MoveWindow(12+26*6,rcClient.bottom-52,rcTVBtn.Width(),rcTVBtn.Height());
		if(12+26*6+rcTVBtn.Width()+2>rcClient.Width())
			m_tvBtn.ShowWindow(false);
		else 
			m_tvBtn.ShowWindow(true);

		CRect rcMenuBtn;
		m_menuBtn.GetClientRect(&rcMenuBtn);
		m_menuBtn.MoveWindow(0,rcClient.bottom-30,rcMenuBtn.Width(),rcMenuBtn.Height());

		CRect rcMsgBtn;
		m_msgManagerBtn.GetClientRect(&rcMsgBtn);
		m_msgManagerBtn.MoveWindow(75,rcClient.bottom-25,rcMsgBtn.Width(),rcMsgBtn.Height());

		CRect rcSearchBtn;
		m_searchBtn.GetClientRect(&rcSearchBtn);
		m_searchBtn.MoveWindow(100,rcClient.bottom-25,rcSearchBtn.Width(),rcSearchBtn.Height());

		//内存画图//////////////////////////
		CDC m_MemDC;
		m_MemDC.CreateCompatibleDC(&dc);

		CBitmap btScreen;
		btScreen.CreateCompatibleBitmap(&dc, rcClient.Width(), rcClient.Height());

		m_MemDC.SelectObject(&btScreen);
		btScreen.DeleteObject();

		//画背景
		m_MemDC.Rectangle(rcClient);
		DrawPosImage(&m_BitmapCenterMid, &m_MemDC, CPoint(rcClient.Width()-m_szBitmapCenterRight.cx-m_szBitmapCenterMid.cx,
			rcClient.Height()-m_szBitmapBottomMid.cy-m_szBitmapCenterMid.cy));

		DrawPosImage(&m_BitmapTopLeft, &m_MemDC, CPoint(0, 0));
		DrawRangeImage(&m_BitmapTopMid, &m_MemDC, CRect(m_szBitmapTopLeft.cx, 0, rcClient.Width()-m_szBitmapTopRight.cx, m_szBitmapTopMid.cy));
		DrawPosImage(&m_BitmapTopRight, &m_MemDC, CPoint(rcClient.Width()-m_szBitmapTopRight.cx, 0));

		DrawRangeImage(&m_BitmapCenterLeft, &m_MemDC, CRect(0, m_szBitmapTopLeft.cy, m_szBitmapCenterLeft.cx, rcClient.Height()-m_szBitmapBottomLeft.cy));
		DrawRangeImage(&m_BitmapCenterRight, &m_MemDC, CRect(rcClient.Width()-m_szBitmapCenterRight.cx, m_szBitmapTopRight.cy, 
			rcClient.Width(), rcClient.Height()-m_szBitmapBottomRight.cy));
		
		DrawPosImage(&m_BitmapBottomLeft, &m_MemDC, CPoint(0, rcClient.Height()-m_szBitmapBottomLeft.cy));
		DrawRangeImage(&m_BitmapBottomMid, &m_MemDC, CRect(m_szBitmapBottomLeft.cx, rcClient.Height()-m_szBitmapBottomMid.cy,
			rcClient.Width()-m_szBitmapBottomRight.cx, rcClient.Height()));
		DrawPosImage(&m_BitmapBottomRight, &m_MemDC, CPoint(rcClient.Width()-m_szBitmapBottomRight.cx, rcClient.Height()-m_szBitmapBottomRight.cy));

		//画上线状态的字
		m_MemDC.SelectObject(m_font);
		m_MemDC.SetTextColor(RGB(0,28,123));
		m_MemDC.SetBkMode(TRANSPARENT);
		m_MemDC.DrawText(m_strStatus,CRect(55,30,55+100,30+16),DT_CENTER|DT_VCENTER|DT_SINGLELINE);

		//创建不规则窗体
		ChangeWindowRgn(&m_MemDC);

		//重画控件/////////////////////////
		ReDrawCrl(&m_MemDC);

		//画到显示器上////////////////////////////
		dc.BitBlt(rcClient.left, rcClient.top, rcClient.Width(), rcClient.Height(), &m_MemDC, 0, 0, SRCCOPY);

		m_MemDC.DeleteDC();
	}
}

//当用户拖动最小化窗口时系统调用此函数取得光标显示。
//
HCURSOR CNUKDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}


void CNUKDlg::OnGetMinMaxInfo(MINMAXINFO* lpMMI)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	//lpMMI->ptMinTrackSize.x = 170;
	//lpMMI->ptMinTrackSize.y = 400;

	CDialog::OnGetMinMaxInfo(lpMMI);
}

//定点画位图
void CNUKDlg::DrawPosImage(CBitmap *pBitmap, CDC *pDC, CPoint pt)
{
	CDC MemDC;
	MemDC.CreateCompatibleDC(pDC);
	CBitmap *pOldBitmap = (CBitmap*)MemDC.SelectObject(pBitmap);

	BITMAP bm;
	pBitmap->GetBitmap(&bm);
	int li_Width = bm.bmWidth;
	int li_Height = bm.bmHeight;

	pDC->BitBlt(pt.x, pt.y, li_Width, li_Height, &MemDC, 0, 0, SRCCOPY);
	
	MemDC.SelectObject(pOldBitmap);
	MemDC.DeleteDC();
}

//平铺画位图
void CNUKDlg::DrawRangeImage(CBitmap *pBitmap, CDC *pDC, CRect rc)
{
	CDC MemDC;
	BITMAP bm;
	pBitmap->GetBitmap(&bm);

	int li_Width = bm.bmWidth;
	int li_Height = bm.bmHeight;

	MemDC.CreateCompatibleDC(pDC);
	CBitmap* pOldBitmap = MemDC.SelectObject(pBitmap);

	int x=rc.left;
	int y=rc.top;
	while (y < (rc.Height()+rc.top)) 
 	{
 		while(x < (rc.Width()+rc.left)) 
 		{
			pDC->BitBlt(x, y, li_Width, li_Height, &MemDC, 0, 0, SRCCOPY);
 			x += li_Width;
 		}
		x = rc.left;
 		y += li_Height;
 	}

	MemDC.SelectObject(pOldBitmap);
	MemDC.DeleteDC();
}

//载入硬盘位图
void CNUKDlg::SetImage(CBitmap &bitmap, CString strName)
{
	HBITMAP hBitmap = NULL;
	hBitmap = (HBITMAP)::LoadImage(NULL, strName, IMAGE_BITMAP, 0, 0, LR_DEFAULTSIZE|LR_LOADFROMFILE);
	//ASSERT(hBitmap);

	if(hBitmap == NULL)
	{
		CString str;
		str.LoadStringW(IDS_ERROR_NOBMP);
		AfxMessageBox(str);
		PostQuitMessage(0);
	}

	if (bitmap.m_hObject)
		bitmap.Detach();

	bitmap.Attach(hBitmap);
}

//载入资源位图
void CNUKDlg::SetImage(CBitmap &bitmap, UINT nID)
{
	if (bitmap.m_hObject)
		bitmap.Detach();

	bitmap.LoadBitmap(nID);
}

//保存位图尺寸
void CNUKDlg::SetImageSize(CBitmap *pBitmap, CSize &sz)
{
	BITMAP bm;
	pBitmap->GetBitmap(&bm);

	sz = CSize(bm.bmWidth, bm.bmHeight);
}

//////////////////////////////////////////////////////////////////////
//载入左上角的硬盘位图
void CNUKDlg::SetTopLeftImage(UINT nID)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -