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

📄 mdiclient.cpp

📁 AD 数据采集卡基本的采集界面
💻 CPP
字号:
#include "stdafx.h"
#include "TabCtrlBarDoc.h"
#include "MdiClient.h"

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

/////////////////////////////////////////////////////////////////////////////
// CMdiClient

CMdiClient::CMdiClient(): m_sizeClient(0, 0)
{
	m_crBkColor = GetSysColor(COLOR_DESKTOP);

	m_pWndTabs = NULL;
}


CMdiClient::~CMdiClient()
{
}


BEGIN_MESSAGE_MAP(CMdiClient, CWnd)
	//{{AFX_MSG_MAP(CMdiClient)
	ON_WM_ERASEBKGND()
	ON_WM_SIZE()
	ON_MESSAGE(WM_MDICREATE,OnMDICreate)
	ON_MESSAGE(WM_MDIDESTROY,OnMDIDestroy)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
void CMdiClient::AddHandle(HWND hWnd)
{
	ASSERT(m_pWndTabs != NULL);
	// 添加列表
	m_pWndTabs->AddHandle(hWnd);
}

void CMdiClient::RemoveHandle(HWND hWnd)
{
	ASSERT(m_pWndTabs != NULL);
	m_pWndTabs->RemoveHandle(hWnd);
}

/////////////////////////////////////////////////////////////////////////////
// CMdiClient message handlers

LRESULT CMdiClient::OnMDICreate(WPARAM wParam, LPARAM lParam)
{
	HWND hWnd = (HWND) DefWindowProc(WM_MDICREATE,  wParam, lParam);
	AddHandle(hWnd);
	return (LRESULT) hWnd;
}

LRESULT CMdiClient::OnMDIDestroy(WPARAM wParam, LPARAM lParam)
{
	RemoveHandle((HWND) wParam);
	return DefWindowProc(WM_MDIDESTROY,  wParam, lParam);
}



BOOL CMdiClient::OnEraseBkgnd(CDC* pDC) 
{
	// TODO: Add your message handler code here and/or call default

	// 当改变窗口大小或被移动或首次创建时,此函数被调用,它创建窗口的背景
	CRect rect;
	// 取得主窗口客户区矩形
	GetClientRect(&rect);	
	
	// 如果背景前色不为0, m_crBkColor在构造函数中初始化
	if (m_crBkColor != 0)
	{

		CBrush NewBrush(m_crBkColor); 
		// 设置刷子的起始原点
		pDC->SetBrushOrg(0, 0);
		// 选择新刷子,且将原刷子转换成CBrush类
		CBrush* pOldBrush = static_cast<CBrush*>(pDC->SelectObject(&NewBrush));  
		// 以拷贝方式绘制窗口背景
		pDC->PatBlt(rect.left, rect.top, rect.Width(), rect.Height(), PATCOPY); 		
		pDC->SelectObject(pOldBrush);
		// 删除新刷子对象
		NewBrush.DeleteObject();
	}

    CRect rcDataBox;
	CString strLogo = "阿尔泰科技";//szLogoString;
	CFont fontLogo;
	TEXTMETRIC tm;
	
	// 将第一个32位参数与第二个32位参数相乘,再除以第三个32位数,最后取商
	int fontSize = -MulDiv(18, pDC->GetDeviceCaps(LOGPIXELSY), 72);
	
	// 创建字体
	fontLogo.CreateFont(fontSize, 0, 0, 0, FW_BOLD, FALSE, FALSE, FALSE,
		ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
		FIXED_PITCH | FF_ROMAN, _T("Times New Roman"));
	// 设置背景模式为不透明方式(OPAQUE)
	pDC->SetBkMode(OPAQUE);		
	
	// 选择新字体
	CFont* oldFont = pDC->SelectObject(&fontLogo);
	CRect st(0, 0, 0, 0);
	
	// 取得给定字符串strLogo的矩形区域
	CSize sz = pDC->GetTextExtent(strLogo, strLogo.GetLength());
	// 根据当前字体,获得所选字体的度量
	pDC->GetTextMetrics(&tm);

	// Calculate the box size by subtracting the text width and height from the
	// window size.  Also subtract 20% of the average character size to keep the
	// logo from printing into the borders...

	// 取得客户区
	GetClientRect(&rcDataBox);
	
	rcDataBox.left = rcDataBox.right  - sz.cx - tm.tmAveCharWidth ;
	rcDataBox.top  = rcDataBox.bottom - sz.cy - st.bottom - tm.tmHeight ;
	
	CRect rcSave = rcDataBox;		
	// 设置背景模式为透明方式(TRANSPARENT)
	pDC->SetBkMode(TRANSPARENT); 
	rcSave = rcDataBox;
	
	// shift logo box right, and print black...
	rcDataBox.left   += tm.tmAveCharWidth / 5;
	// 设置文字色(黑色)
	COLORREF oldColor = pDC->SetTextColor(RGB(0, 0, 0));
	// 绘制立体字的底层文字
	pDC->DrawText(strLogo, strLogo.GetLength(), &rcDataBox, 
		DT_VCENTER | DT_SINGLELINE | DT_CENTER);
	
	rcDataBox = rcSave;
	
	//向左偏移文体位置为当前字体宽度的25%
	rcDataBox.left -= tm.tmAveCharWidth /4;
	// 设置立体字的中层字体色为白色
	pDC->SetTextColor(RGB(255, 255, 255));
	// 绘制中层字
	pDC->DrawText(strLogo, strLogo.GetLength(), &rcDataBox, 
		DT_VCENTER | DT_SINGLELINE | DT_CENTER);
	
	
	rcDataBox = rcSave;
	// 设置文字为系统色
	pDC->SetTextColor(GetSysColor(COLOR_BTNFACE));
	// 在原位置绘制上层文字
	pDC->DrawText(strLogo, strLogo.GetLength(), &rcDataBox, 
		DT_VCENTER | DT_SINGLELINE | DT_CENTER);
	
	// restore the original properties and release resources...
	pDC->SelectObject(oldFont);
	pDC->SetTextColor(oldColor);   
	pDC->SetBkMode(OPAQUE);	
	fontLogo.DeleteObject();
    // 释放公共DC和窗口DC,使其他应用程序可以使用,对类DC和私有DC无影响	
	ReleaseDC(pDC);
	
    return TRUE;	
	//return CMDIFrameWnd::OnEraseBkgnd(pDC);
}
void CMdiClient::OnSize(UINT nType, int cx, int cy) 
{
	// 当客户区域变化时,被调用。即当子帧窗口被最大化时,也会产生此消息
	CWnd::OnSize(nType, cx, cy);
	
	// 如果应用程序当启动,则保存这个大小参数,即可返回
    if ((m_sizeClient.cx == 0) && (m_sizeClient.cy == 0))
	{
        m_sizeClient.cx = cx;
        m_sizeClient.cy = cy;
		
        return ;
	}
	
    // 如果客户窗口大小未发生变化,则返回
    if ((m_sizeClient.cx == cx) && ( m_sizeClient.cy == cy))
    { 
        return;
    }
	
	// 保存新值
    m_sizeClient.cx = cx;
    m_sizeClient.cy = cy;
	// 强制重绘
    RedrawWindow(NULL, NULL,
        RDW_INVALIDATE | RDW_ERASE | RDW_ERASENOW | RDW_ALLCHILDREN);    
	
    return;                
}

⌨️ 快捷键说明

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