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

📄 captionbtndlg.cpp

📁 局域网ICQ的源代码
💻 CPP
字号:
/***************************************************************************
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 *   copyright            : (C) 2002 by Zhang Yong                         *
 *   email                : z-yong163@163.com                              *
 ***************************************************************************/

// CaptionBtnDlg.cpp : implementation file
//

#include "stdafx.h"
#include "CaptionBtnDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CCaptionBtnDlg dialog


CCaptionBtnDlg::CCaptionBtnDlg(int buttons, UINT nIDTemplate, CWnd* pParent /*=NULL*/)
	: CDialog(nIDTemplate, pParent)
{
	//{{AFX_DATA_INIT(CCaptionBtnDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
	nrButtons = buttons;
	pressedButton = -1;
	inButton = FALSE;
}

int CCaptionBtnDlg::hitTest(CPoint &pt)
{
	int w = nrButtons * 14;
	CRect rc;
	GetWindowRect(rc);
	rc.right -= 20;
	rc.left = rc.right - w;
	rc.top += 6;
	rc.bottom = rc.top + 12;
	if (rc.PtInRect(pt))
		return (rc.right - pt.x - 1) / 14;
	return -1;
}

void CCaptionBtnDlg::drawButton(int button, BOOL pressed)
{
	CWindowDC dc(this);
	CRect rc;
	GetWindowRect(rc);
	rc.OffsetRect(-rc.left, -rc.top);

	rc.right -= 20 + button * 14;
	rc.left = rc.right - 12;
	rc.top += 6;
	rc.bottom = rc.top + 12;
	CRgn rgn;
	rgn.CreateRectRgn(rc.left, rc.top, rc.right, rc.bottom);
	dc.SelectClipRgn(&rgn);

	drawCaptionBtn(&dc, rc, button, pressed);
}

void CCaptionBtnDlg::drawButtons()
{
	for (int i = 0; i < nrButtons; i++)
		drawButton(i, FALSE);
}

void CCaptionBtnDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CCaptionBtnDlg)
		// NOTE: the ClassWizard will add DDX and DDV calls here
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CCaptionBtnDlg, CDialog)
	//{{AFX_MSG_MAP(CCaptionBtnDlg)
	ON_WM_NCPAINT()
	ON_WM_ACTIVATE()
	ON_WM_NCLBUTTONDOWN()
	ON_WM_LBUTTONUP()
	ON_WM_MOUSEMOVE()
	ON_WM_NCACTIVATE()
	//}}AFX_MSG_MAP
	ON_MESSAGE(WM_SETTEXT, OnSetText)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CCaptionBtnDlg message handlers

void CCaptionBtnDlg::OnNcPaint() 
{
	CDialog::OnNcPaint();

	drawButtons();
}

void CCaptionBtnDlg::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized) 
{
	CDialog::OnActivate(nState, pWndOther, bMinimized);

	drawButtons();
}

void CCaptionBtnDlg::OnNcLButtonDown(UINT nHitTest, CPoint point) 
{
	int button = hitTest(point);
	if (button >= 0) {
		SetCapture();
		pressedButton = button;
		inButton = TRUE;
		drawButton(button, TRUE);
	}
	CDialog::OnNcLButtonDown(nHitTest, point);
}

void CCaptionBtnDlg::OnLButtonUp(UINT nFlags, CPoint point) 
{
	if (GetCapture() == this) {
		ReleaseCapture();
		ClientToScreen(&point);
		int button = hitTest(point);
		if (button >= 0 && pressedButton == button) {
			drawButton(button, FALSE);
			onCaptionBtnClicked(button);
		}
		pressedButton = -1;
	}

	CDialog::OnLButtonUp(nFlags, point);
}

void CCaptionBtnDlg::OnMouseMove(UINT nFlags, CPoint point) 
{
	if (GetCapture() == this) {
		ClientToScreen(&point);

		int button = hitTest(point);
		if (inButton && button != pressedButton) {
			inButton = FALSE;
			drawButton(pressedButton, FALSE);
		} else if (!inButton && button == pressedButton) {
			inButton = TRUE;
			drawButton(pressedButton, TRUE);
		}
	}
	
	CDialog::OnMouseMove(nFlags, point);
}

LRESULT CCaptionBtnDlg::OnSetText(WPARAM wParam, LPARAM lParam)
{
	LRESULT res = Default();
	drawButtons();
	return res;
}

BOOL CCaptionBtnDlg::OnNcActivate(BOOL bActive) 
{
	BOOL ret = CDialog::OnNcActivate(bActive);
	drawButtons();
	return ret;
}

⌨️ 快捷键说明

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