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

📄 infowindowdlg.cpp

📁 一个小的用于背二级日语单词、语法的小工具的源代码
💻 CPP
字号:
// InfoWindowDlg.cpp : 幚憰僼傽僀儖
//

#include "stdafx.h"
#include "InfoWindow.h"
#include "InfoWindowDlg.h"

#include "SettingDlg.h"
#include "define.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif



void ShowInTaskbar(HWND m_hWnd,BOOL bshow)
{
	HRESULT hr;
	ITaskbarList *pTaskbarList;

	hr=CoCreateInstance(CLSID_TaskbarList,NULL,CLSCTX_INPROC_SERVER,
	IID_ITaskbarList,(void**)&pTaskbarList);

	pTaskbarList->HrInit();if(bshow){
		pTaskbarList->AddTab(m_hWnd);
	}
	else{
		pTaskbarList->DeleteTab(m_hWnd);
	}
	pTaskbarList->Release();

}


// 傾僾儕働乕僔儑儞偺僶乕僕儑儞忣曬偵巊傢傟傞 CAboutDlg 僟僀傾儘僌

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// 僟僀傾儘僌 僨乕僞
	enum { IDD = IDD_ABOUTBOX };

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 僒億乕僩

// 幚憰
protected:
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()


// CInfoWindowDlg 僟僀傾儘僌




CInfoWindowDlg::CInfoWindowDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CInfoWindowDlg::IDD, pParent), m_WordFactory(_T("word.txt")), m_GrammarFactory(_T("grammar.txt"))
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
	m_pFactory = NULL;
	m_bPause = TRUE;
}

void CInfoWindowDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CInfoWindowDlg, CDialog)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	//}}AFX_MSG_MAP
	ON_WM_CREATE()
	ON_WM_CONTEXTMENU()
	ON_WM_LBUTTONDOWN()
	ON_WM_TIMER()
	ON_WM_LBUTTONUP()
	ON_COMMAND(ID_SETTING, OnSetting)
	ON_COMMAND(ID_POP_PAUSE, OnPopPause)
	ON_COMMAND(ID_POP_PREV, OnPopPrev)
	ON_COMMAND(ID_POP_NEXT, OnPopNext)
	ON_COMMAND(ID_AA_AA2, OnAaAa2)
	ON_COMMAND(ID_POP_CONTENT_WORD, OnPopContentWord)
	ON_COMMAND(ID_POP_CONTENT_GRAMMAR, OnPopContentGrammar)
	ON_WM_KEYDOWN()
	ON_WM_CHAR()
	ON_WM_SETFOCUS()
	ON_WM_CLOSE()
END_MESSAGE_MAP()


// CInfoWindowDlg 儊僢僙乕僕 僴儞僪儔

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

	// "僶乕僕儑儞忣曬..." 儊僯儏乕傪僔僗僥儉 儊僯儏乕偵捛壛偟傑偡丅

	// IDM_ABOUTBOX 偼丄僔僗僥儉 僐儅儞僪偺斖埻撪偵側偗傟偽側傝傑偣傫丅
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// 偙偺僟僀傾儘僌偺傾僀僐儞傪愝掕偟傑偡丅傾僾儕働乕僔儑儞偺儊僀儞 僂傿儞僪僂偑僟僀傾儘僌偱側偄応崌丄
	//  Framework 偼丄偙偺愝掕傪帺摦揑偵峴偄傑偡丅
	SetIcon(m_hIcon, TRUE);			// 戝偒偄傾僀僐儞偺愝掕
	SetIcon(m_hIcon, FALSE);		// 彫偝偄傾僀僐儞偺愝掕

	if( m_hWnd )
	{
		ModifyStyleEx(WS_EX_APPWINDOW,0);
		ShowInTaskbar( m_hWnd, FALSE );
	}
	
	//弶婜壔傪偙偙偵捛壛偟傑偡丅
	LoadParam();



	SetTransparent(m_iTransparent);

	if( !CreateGeneralFont( m_font ) )
		return FALSE;

	m_pFactory = &m_WordFactory;
	pause( FALSE );

	m_strContent = _T("\r\nInfomation Board v0.1\r\n \r\nBy HuQian\r\n\r\n Support Key: 'P' 'S' '<' ' >' 'Esc'");

	return TRUE;  // 僼僅乕僇僗傪僐儞僩儘乕儖偵愝掕偟偨応崌傪彍偒丄TRUE 傪曉偟傑偡丅
}

void CInfoWindowDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// 僟僀傾儘僌偵嵟彫壔儃僞儞傪捛壛偡傞応崌丄傾僀僐儞傪昤夋偡傞偨傔偺
//  壓偺僐乕僪偑昁梫偱偡丅僪僉儏儊儞僩/價儏乕 儌僨儖傪巊偆 MFC 傾僾儕働乕僔儑儞偺応崌丄
//  偙傟偼丄Framework 偵傛偭偰帺摦揑偵愝掕偝傟傑偡丅

void CInfoWindowDlg::OnPaint()
{
	CPaintDC dc(this); 

	// white background
	CRect rectClient;
	GetClientRect( rectClient );
	dc.FillSolidRect( rectClient, RGB(255,255,255) );

	// frame
	CPen pen( PS_SOLID, 1, RGB(127,168,153) );
	CPen *pOldPen = dc.SelectObject( &pen );

	dc.MoveTo( rectClient.left, rectClient.top );
	dc.LineTo( rectClient.left, rectClient.bottom );

	dc.MoveTo( rectClient.right-1, rectClient.top );
	dc.LineTo( rectClient.right-1, rectClient.bottom );

	dc.MoveTo( rectClient.left, rectClient.top );
	dc.LineTo( rectClient.right, rectClient.top );

	dc.MoveTo( rectClient.left, rectClient.bottom-1 );
	dc.LineTo( rectClient.right, rectClient.bottom-1 );
	
	dc.SelectObject( pOldPen );

	
	// Draw Data
	CRect rectText = rectClient;
	rectText.top = rectText.top + 10;
	rectText.left = rectText.left + 10;
	CFont* pFont = dc.SelectObject( &m_font );
	dc.DrawText( m_strContent, rectText, /* DT_CENTER | DT_VCENTER | DT_SINGLELINE |*/ DT_END_ELLIPSIS );
	dc.SelectObject( pFont );
}

// 儐乕僓乕偑嵟彫壔偟偨僂傿儞僪僂傪僪儔僢僌偟偰偄傞偲偒偵昞帵偡傞僇乕僜儖傪庢摼偡傞偨傔偵丄
//  僔僗僥儉偑偙偺娭悢傪屇傃弌偟傑偡丅
HCURSOR CInfoWindowDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}

int CInfoWindowDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CDialog::OnCreate(lpCreateStruct) == -1)
		return -1;

	if( m_ToolTipCtrl.Create( this ) == FALSE )
	{
		return -1;
	}
	m_ToolTipCtrl.AddTool( this, " Key: '<' prev   '>' next   'p' pause   'Esc' quit   's' setting " );

	SetWindowLong( GetSafeHwnd(), GWL_EXSTYLE, GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^0x80000 );

	// set always top
	CRect rect;
	GetWindowRect( rect );
	rect.OffsetRect( 300,300 );
	SetWindowPos(&wndTopMost,rect.left,rect.top,rect.Width(),rect.Height(),SWP_SHOWWINDOW);
	m_bMostTop = TRUE;

	return 0;
}

BOOL CInfoWindowDlg::PreTranslateMessage(MSG* pMsg)
{
	if( m_ToolTipCtrl.GetSafeHwnd() )	m_ToolTipCtrl.RelayEvent(pMsg);

	return CDialog::PreTranslateMessage(pMsg);
}

void CInfoWindowDlg::SetTransparent(int nPos)
{
	if( nPos < 0 || nPos > 100 ) return;

	BYTE eff=(BYTE)nPos*255/100;
	HINSTANCE hInst = LoadLibrary(_T("User32.DLL")); 
	if(hInst) 
	{            
		typedef BOOL (WINAPI *MYFUNC)(HWND,COLORREF,BYTE,DWORD);          
		MYFUNC fun = NULL;
		fun=(MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes");
		if(fun)fun(this->GetSafeHwnd(),0,eff,2);     
		FreeLibrary(hInst); 
	};
}

void CInfoWindowDlg::OnContextMenu(CWnd* /*pWnd*/, CPoint point)
{
	CMenu menu;
	menu.LoadMenu( IDR_MENU_POP );
	menu.GetSubMenu(0)->CheckMenuItem( ID_AA_AA2, m_bMostTop ? MF_CHECKED : MF_UNCHECKED );

	menu.GetSubMenu(0)->CheckMenuItem( ID_POP_PAUSE, m_bPause ? MF_CHECKED : MF_UNCHECKED );

	if( m_pFactory == &m_WordFactory )
		menu.GetSubMenu(0)->GetSubMenu(2)->CheckMenuItem( ID_POP_CONTENT_WORD, MF_CHECKED );
	else
		menu.GetSubMenu(0)->GetSubMenu(2)->CheckMenuItem( ID_POP_CONTENT_WORD, MF_UNCHECKED );

	if( m_pFactory == &m_GrammarFactory )
		menu.GetSubMenu(0)->GetSubMenu(2)->CheckMenuItem( ID_POP_CONTENT_GRAMMAR, MF_CHECKED );
	else
		menu.GetSubMenu(0)->GetSubMenu(2)->CheckMenuItem( ID_POP_CONTENT_GRAMMAR, MF_UNCHECKED );

	menu.GetSubMenu(0)->TrackPopupMenu( TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this);
}

void CInfoWindowDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
	SendMessage(WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM( point.x, point.y));

	CDialog::OnLButtonDown(nFlags, point);
}

void CInfoWindowDlg::OnTimer(UINT_PTR nIDEvent)
{
	switch( nIDEvent )
	{
	case 0:
		{
			Generate( true );
		}
		break;
	}

	CDialog::OnTimer(nIDEvent);
}

void CInfoWindowDlg::resize( CSize size )
{

	// move window
	CRect rectWindow;
	GetWindowRect( rectWindow );

	rectWindow.right = rectWindow.left + size.cx;
	rectWindow.bottom = rectWindow.top + size.cy;

	MoveWindow( rectWindow );

	Invalidate();
	UpdateWindow();
}

void CInfoWindowDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
	CDialog::OnLButtonUp(nFlags, point);
}

void CInfoWindowDlg::OnSetting()
{
	BOOL bNeedPause = !m_bPause;
	
	if( bNeedPause )
		pause();

	CSettingDlg dlg;
	dlg.m_iTransparent	= m_iTransparent;
	dlg.m_iSec			= m_iSec;
	dlg.m_iLine			= m_iLine - 1;

	if( dlg.DoModal() == IDOK )
	{
		m_iTransparent = dlg.m_iTransparent;
		SetTransparent( m_iTransparent );

		m_iSec = dlg.m_iSec;
		m_iLine = dlg.m_iLine + 1;

	}

	if( bNeedPause )
		pause(FALSE);
}

void CInfoWindowDlg::OnPopPause()
{
	pause( !m_bPause );
}

void CInfoWindowDlg::pause(BOOL bPause)
{
	if( bPause )
	{
		if( !m_bPause )
		{
			KillTimer( 0 );
			m_bPause = TRUE;
		}
	}
	else
	{
		if( m_bPause )
		{
			SetTimer( 0, m_iSec*1000, NULL );
			m_bPause = FALSE;
		}

	}
}
void CInfoWindowDlg::OnPopPrev()
{
	pause();
	Generate(false);
}

void CInfoWindowDlg::OnPopNext()
{
	pause();
	Generate(true);
}

void CInfoWindowDlg::OnAaAa2()
{
	CRect rect;
	GetWindowRect( rect );

	if( m_bMostTop )
	{
		SetWindowPos(&wndNoTopMost,rect.left,rect.top,rect.Width(),rect.Height(),SWP_SHOWWINDOW);
		m_bMostTop = FALSE;
	}
	else
	{
		SetWindowPos(&wndTopMost,rect.left,rect.top,rect.Width(),rect.Height(),SWP_SHOWWINDOW);
		m_bMostTop = TRUE;
	}
}

void CInfoWindowDlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
	switch( nChar )
	{
	case 188:
		{
			OnPopPrev();
		}
		break;
	case 190:
		{
			OnPopNext();
		}
		break;
	case 'P':
		{
			OnPopPause();
		}
		break;
	case 'S':
		{
			OnSetting();
		}
		break;
	}

	CDialog::OnKeyDown(nChar, nRepCnt, nFlags);
}

void CInfoWindowDlg::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{

	CDialog::OnChar(nChar, nRepCnt, nFlags);
}



void CInfoWindowDlg::OnSetFocus(CWnd* pOldWnd)
{
	CDialog::OnSetFocus(pOldWnd);

	if( m_hWnd )
	{
		ModifyStyleEx(WS_EX_APPWINDOW,0);
		ShowInTaskbar( m_hWnd, FALSE );
	}
}

void CInfoWindowDlg::LoadParam()
{
	TCHAR szPath[1024];
	GetCurrentDirectory( 1024, szPath );

	CString strPath( szPath );
	if ( strPath.GetAt( strPath.GetLength() - 1) != '\\' ) 
		strPath = strPath + '\\';

	strPath = strPath + "param.ini";

	m_iTransparent = GetPrivateProfileInt( "Param", "Transparent", 80, strPath );
	m_iSec = GetPrivateProfileInt( "Param", "Inteval", 2, strPath );
	m_iLine = GetPrivateProfileInt( "Param", "Line", 1, strPath );
}

void CInfoWindowDlg::SaveParam()
{
	TCHAR szPath[1024];
	GetCurrentDirectory( 1024, szPath );

	CString strPath( szPath ), strValue;
	if ( strPath.GetAt( strPath.GetLength() - 1) != '\\' ) 
		strPath = strPath + '\\';

	strPath = strPath + "param.ini";

	strValue.Format("%d",m_iTransparent);
	WritePrivateProfileString( "Param", "Transparent", strValue, strPath );

	strValue.Format("%d", m_iSec);
	WritePrivateProfileString( "Param", "Inteval", strValue, strPath );

	strValue.Format("%d", m_iLine);
	WritePrivateProfileString( "Param", "Line", strValue, strPath );

}

void CInfoWindowDlg::OnClose()
{
	SaveParam();
	CDialog::OnClose();
}

void CInfoWindowDlg::OnOK()
{
}

void CInfoWindowDlg::OnCancel()
{
	SaveParam();
	CDialog::OnCancel();
}

void CInfoWindowDlg::OnPopContentWord()
{
	m_pFactory = &m_WordFactory;
}

void CInfoWindowDlg::OnPopContentGrammar()
{
	m_pFactory = &m_GrammarFactory;
}
void CInfoWindowDlg::Generate(bool bDir)
{
	if( m_pFactory != NULL )
	{
		CSize size(20,20);
		CDC* pDC = GetDC();
		CFont* pFont = pDC->SelectObject( &m_font );

		m_strContent = "";
		CSize sText = pDC->GetTextExtent( m_strContent );

		if( bDir )
		{
			for( size_t i=0; i<m_iLine; i++ )
			{
				CString strText;
				if( m_pFactory->GeneratorNext( strText ) )
				{
					if( m_strContent != "" )
						m_strContent = m_strContent + "\r\n" + strText;
					else
						m_strContent = strText;
					
					CSize sText = pDC->GetTextExtent( strText );
					size.cy += (sText.cy);
					if( sText.cx + 20 > size.cx )
						size.cx = sText.cx + 20;
				}
			}
		}
		else
		{
			for( size_t i=0; i<m_iLine; i++ )
			{
				CString strText;
				if( m_pFactory->GeneratorPrev( strText ) )
				{
					if( m_strContent != "" )
						m_strContent = m_strContent + "\r\n" + strText;
					else
						m_strContent = strText;
					
					CSize sText = pDC->GetTextExtent( strText );
					size.cy += (sText.cy);
					if( sText.cx + 20 > size.cx )
						size.cx = sText.cx + 20;
				}
			}
		}

		pDC->SelectObject( pFont );

		resize( size );
	}
}

⌨️ 快捷键说明

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