[C++]登录界面(透明文字显示)

1、主界面对话框;

2、登录界面对话框;(图片控件、BITMAP)

     [C++]登录界面(透明文字显示)_第1张图片

[C++]登录界面(透明文字显示)_第2张图片


3、CSplashDlg类;(OnInitDialog())

BOOL CSplashDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// TODO: Add extra initialization here
	//创建字体
	CFont font;
	HRGN wndRgn;
	CDC dc, *pDC = GetDC();
	font.CreateFont(
		60,                        // nHeight
		30,							// nWidth
		0,                         // nEscapement
		0,                         // nOrientation
		FW_BOLD,		// nWeight  /*FW_BOLD*/FW_NORMAL
		FALSE,                     // bItalic
		FALSE,                     // bUnderline
		0,                         // cStrikeOut
		GB2312_CHARSET,            // nCharSet
		OUT_DEFAULT_PRECIS,        // nOutPrecision
		CLIP_DEFAULT_PRECIS,       // nClipPrecision
		DEFAULT_QUALITY,           // nQuality
		DEFAULT_PITCH | FF_SWISS,  // nPitchAndFamily
		_T("楷体"));                 // lpszFacename黑体    


	if (pDC && dc.CreateCompatibleDC(pDC))
	{        
		CRect rect;
		::GetClientRect(GetSafeHwnd(), &rect);

		dc.SelectObject(&font);
		CSize size;
		CString strText = _T("欢迎登陆Taily段软件系统");
		//计算要输出的字符串的高度和宽度
		::GetTextExtentPoint32(dc.GetSafeHdc(), strText, strText.GetLength(), &size);

		//居中输出,计算文字要输出的位置
		int x = (rect.Width()-size.cx)/2;
		int y = (rect.Height()-size.cy)/2;

		dc.SetBkMode(TRANSPARENT); 

		//开始记录窗体轮廓路径
		dc.BeginPath();
		dc.TextOut(x, y, strText, strText.GetLength());
		dc.EndPath();

		//把所记录的路径转化为窗体轮廓句柄
		wndRgn = PathToRegion(dc.GetSafeHdc());

		//赋予窗体指定的轮廓形状
		SetWindowRgn(wndRgn, TRUE);
		DeleteObject(wndRgn);
		dc.DeleteDC();

		ReleaseDC(pDC);
	}

	ModifyStyleEx(WS_EX_APPWINDOW,WS_EX_TOOLWINDOW);  //VC++程序不在任务栏显示

	return TRUE;  // return TRUE unless you set the focus to a control
	// EXCEPTION: OCX Property Pages should return FALSE
}

4、CSplashThread类;(.h、.cpp)

#pragma once


#include "SplashDlg.h"
// CSplashThread

class CSplashThread : public CWinThread
{
	DECLARE_DYNCREATE(CSplashThread)

protected:
	CSplashThread();           // protected constructor used by dynamic creation
	virtual ~CSplashThread();
	
public:
	virtual BOOL InitInstance();
	virtual int ExitInstance();
	void HideSplash();
	CSplashDlg* m_pSplashDlg;  //声明一个对话框指针
protected:
	DECLARE_MESSAGE_MAP()
};


// SplashThread.cpp : implementation file
//

#include "stdafx.h"
#include "LoginUI.h"
#include "SplashThread.h"
#include "SplashDlg.h"

// CSplashThread

IMPLEMENT_DYNCREATE(CSplashThread, CWinThread)

CSplashThread::CSplashThread()
{
}

CSplashThread::~CSplashThread()
{
}

BOOL CSplashThread::InitInstance()
{
	::AttachThreadInput(m_nThreadID, AfxGetApp()->m_nThreadID, TRUE );
	//通常系统内的每个线程都有自己的输入队列。本函数允许线程和进程共享输入队列。连接了线程后,输入焦点、窗口激活、鼠标捕获、键盘状态以及输入队列状态都会进入共享状态 . (这个函数可以不用)
	m_pSplashDlg = new CSplashDlg;   
	m_pSplashDlg->Create(IDD_SPLASH);
	m_pSplashDlg->ShowWindow(SW_SHOW);
	return TRUE;
}

int CSplashThread::ExitInstance()
{
	m_pSplashDlg->DestroyWindow();
	delete m_pSplashDlg;
	return CWinThread::ExitInstance();
}

// CSplashThread message handlers
void CSplashThread::HideSplash()
{
	m_pSplashDlg->SendMessage(WM_CLOSE);
}

BEGIN_MESSAGE_MAP(CSplashThread, CWinThread)
END_MESSAGE_MAP()



5、CLoginUIApp中添加;

	CSplashThread* pSplashThread;
	CSplashDlg* m_pSplashDlg;

BOOL CLoginUIApp::InitInstance()
{
	// InitCommonControlsEx() is required on Windows XP if an application
	// manifest specifies use of ComCtl32.dll version 6 or later to enable
	// visual styles.  Otherwise, any window creation will fail.

	pSplashThread = (CSplashThread*) AfxBeginThread( RUNTIME_CLASS(CSplashThread), THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED); 
	ASSERT(pSplashThread->IsKindOf(RUNTIME_CLASS(CSplashThread)));
	pSplashThread->ResumeThread(); 
	Sleep(2000);
	pSplashThread->HideSplash();//添加这段代码

	INITCOMMONCONTROLSEX InitCtrls;
	InitCtrls.dwSize = sizeof(InitCtrls);
	// Set this to include all the common control classes you want to use
	// in your application.
	InitCtrls.dwICC = ICC_WIN95_CLASSES;
	InitCommonControlsEx(&InitCtrls);

	CWinApp::InitInstance();


	AfxEnableControlContainer();

	// Create the shell manager, in case the dialog contains
	// any shell tree view or shell list view controls.
	CShellManager *pShellManager = new CShellManager;

	// Standard initialization
	// If you are not using these features and wish to reduce the size
	// of your final executable, you should remove from the following
	// the specific initialization routines you do not need
	// Change the registry key under which our settings are stored
	// TODO: You should modify this string to be something appropriate
	// such as the name of your company or organization
	SetRegistryKey(_T("Local AppWizard-Generated Applications"));

	CLoginUIDlg dlg;
	m_pMainWnd = &dlg;
	INT_PTR nResponse = dlg.DoModal();
	if (nResponse == IDOK)
	{
		// TODO: Place code here to handle when the dialog is
		//  dismissed with OK
	}
	else if (nResponse == IDCANCEL)
	{
		// TODO: Place code here to handle when the dialog is
		//  dismissed with Cancel
	}

	// Delete the shell manager created above.
	if (pShellManager != NULL)
	{
		delete pShellManager;
	}

	// Since the dialog has been closed, return FALSE so that we exit the
	//  application, rather than start the application's message pump.
	return FALSE;
}












你可能感兴趣的:([C++]登录界面(透明文字显示))