📄 statewnd.cpp
字号:
// StateWnd.cpp : implementation file
//
#include "stdafx.h"
#include "hikerwbstart.h"
#include "StateWnd.h"
#include "HikerWBUI.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CStateWnd
CStateWnd::CStateWnd()
{
}
CStateWnd::~CStateWnd()
{
}
BEGIN_MESSAGE_MAP(CStateWnd, CWnd)
//{{AFX_MSG_MAP(CStateWnd)
ON_WM_PAINT()
ON_WM_CREATE()
ON_WM_LBUTTONDOWN()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CStateWnd message handlers
void CStateWnd::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
CRect rwnd, rc;
GetClientRect(rwnd);
rc = rwnd;
rc.DeflateRect(3,3);
CBrush brushwbk(GetSysColor(COLOR_ACTIVECAPTION));
dc.SelectObject(&brushwbk);
//dc.SetBkColor(COLORREF(0x00FF0000));
// CFont font;
// LOGFONT lf;
// memset(&lf,0,sizeof(LOGFONT));
// lf.lfHeight = -14 ;
// lf.lfWeight = FW_LIGHT ;
// lf.lfCharSet = ANSI_CHARSET ;
// lf.lfOutPrecision = OUT_DEFAULT_PRECIS ;
// lf.lfClipPrecision = CLIP_DEFAULT_PRECIS ;
// lf.lfQuality = DEFAULT_QUALITY ;
// lf.lfPitchAndFamily = FF_DONTCARE|DEFAULT_PITCH;
// lstrcpy (lf.lfFaceName, "宋体") ;
// font.CreateFontIndirect(&lf);
// dc.SelectObject(&font);
dc.Rectangle(rwnd);
//dc.SetTextColor(COLORREF(0x0000CCFF));
//dc.SetTextColor(COLORREF(0x004FEF4F));
//dc.DrawText("终结者", rc, DT_LEFT|DT_VCENTER|DT_SINGLELINE);
// dc.SelectObject(&penb); //for draw round rectangle
// if (m_iHangOn == ACT_CHSSTA)
// dc.RoundRect(rchs, m_ptcorn);
// if (m_iHangOn == ACT_SBCSTA)
// dc.RoundRect(rsbc, m_ptcorn);
// if (m_iHangOn == ACT_CHSPCT)
// dc.RoundRect(rchspct, m_ptcorn);
// if (m_iHangOn == ACT_TMPPY)
// dc.RoundRect(rtmppy, ptcorn);
CRect rlogo = m_rlogo;
CRect rchs = m_rchs;
CRect rsbc = m_rsbc;
CRect rchspct = m_rchspct;
CRect rtmppy = m_rtmppy;
CBrush brushb(GetSysColor(COLOR_ACTIVECAPTION));
HBRUSH hBrushb = (HBRUSH)brushb.GetSafeHandle();
DrawIconEx(dc.GetSafeHdc(), rlogo.left+1, rlogo.top+1, m_hiLogo, rlogo.Width()-2, rlogo.Height()-2, 0, hBrushb, DI_IMAGE);
if (m_bCapSta)
{
dc.SelectObject(&m_font);
dc.SetBkColor(GetSysColor(COLOR_ACTIVECAPTION)); //for drawtext()
dc.SetTextColor(0x00FFFFFF);
DrawText(dc.GetSafeHdc(), "大写", 4, rchs|rsbc, DT_CENTER|DT_SINGLELINE|DT_VCENTER);
}
else
{
if (m_bChsSta)
DrawIconEx(dc.GetSafeHdc(), rchs.left+1, rchs.top+1, m_hiChs0, rchs.Width()-2, rchs.Height()-2, 0, hBrushb, DI_IMAGE);
else
DrawIconEx(dc.GetSafeHdc(), rchs.left+1, rchs.top+1, m_hiChs1, rchs.Width()-2, rchs.Height()-2, 0, hBrushb, DI_IMAGE);
if (m_bSbcSta)
DrawIconEx(dc.GetSafeHdc(), rsbc.left+1, rsbc.top+1, m_hiSbc0, rsbc.Width()-2, rsbc.Height()-2, 0, hBrushb, DI_IMAGE);
else
DrawIconEx(dc.GetSafeHdc(), rsbc.left+1, rsbc.top+1, m_hiSbc1, rsbc.Width()-2, rsbc.Height()-2, 0, hBrushb, DI_IMAGE);
}
if (m_bChsPct)
DrawIconEx(dc.GetSafeHdc(), rchspct.left+1, rchspct.top+1, m_hiChsPct0, rchspct.Width()-2, rchspct.Height()-2, 0, hBrushb, DI_IMAGE);
else
DrawIconEx(dc.GetSafeHdc(), rchspct.left+1, rchspct.top+1, m_hiChsPct1, rchspct.Width()-2, rchspct.Height()-2, 0, hBrushb, DI_IMAGE);
// Do not call CWnd::OnPaint() for painting messages
}
BOOL CStateWnd::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
//CWnd *pWnd = GetForegroundWindow();
LockInputWnd(); //05.11.10
ReleaseFocus();
// if (pMsg->message == WM_ACTIVATE)
// {
// if (pWnd)
// {
// pWnd->SetForegroundWindow();
// ReleaseFocus();
// }
// }
if (pMsg->message == WM_MOUSEMOVE)
{
HCURSOR hc = LoadCursor(NULL, IDC_ARROW);
SetCursor(hc);
}
return CWnd::PreTranslateMessage(pMsg);
}
void CStateWnd::LockInputWnd()
{
HWND wnd = ::GetForegroundWindow();
if(IsWindow(wnd))
{
if(wnd != this->m_hWnd)
{
if(m_hInputWnd != wnd || ::GetFocus() != m_hFocusWnd)
{
if(IsWindow(m_hInputWnd))
{
AttachThreadInput(
GetWindowThreadProcessId(m_hWnd,NULL),
GetWindowThreadProcessId(m_hInputWnd, NULL),
FALSE);
}
m_hInputWnd = wnd;
AttachThreadInput(
GetWindowThreadProcessId(m_hWnd,NULL),
GetWindowThreadProcessId(m_hInputWnd,NULL),
TRUE);
m_hFocusWnd = ::GetFocus();
//m_hFocusWnd = m_hInputWnd;
return;
}
}
}
}
void CStateWnd::ReleaseFocus()
{
if(IsWindow(m_hInputWnd))
{
HWND wnd = ::GetForegroundWindow();
if(IsWindow(wnd))
{
if(wnd == m_hInputWnd)
{
return;
}
}
::SetForegroundWindow(m_hInputWnd);
::SetFocus(m_hFocusWnd); //m_hInputWnd
}
}
void CStateWnd::UpdateRects()
{
m_rlogo = CRect(0, 0, 18, 18);
m_rchs = m_rlogo;
m_rchs.OffsetRect(18, 0);
m_rsbc = m_rchs;
m_rsbc.OffsetRect(18, 0);
m_rchspct = m_rsbc;
m_rchspct.OffsetRect(18, 0);
m_rtmppy = m_rchspct;
m_rtmppy.OffsetRect(18, 0);
}
int CStateWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CWnd::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
UpdateRects();
m_hiLogo = (HICON)LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_LOGO), IMAGE_ICON, m_rlogo.Width(), m_rlogo.Height(), LR_DEFAULTCOLOR);
m_hiChs0 = (HICON)LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_CHSSTA02), IMAGE_ICON, m_rchs.Width(), m_rchs.Height(), LR_DEFAULTCOLOR);
m_hiChs1 = (HICON)LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_CHSSTA12), IMAGE_ICON, m_rchs.Width(), m_rchs.Height(), LR_DEFAULTCOLOR);
m_hiSbc0 = (HICON)LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_SBCSTA02), IMAGE_ICON, m_rsbc.Width(), m_rsbc.Height(), LR_DEFAULTCOLOR);
m_hiSbc1 = (HICON)LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_SBCSTA12), IMAGE_ICON, m_rsbc.Width(), m_rsbc.Height(), LR_DEFAULTCOLOR);
m_hiChsPct0 = (HICON)LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_CHSPCT02), IMAGE_ICON, m_rchspct.Width(), m_rchspct.Height(), LR_DEFAULTCOLOR);
m_hiChsPct1 = (HICON)LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_CHSPCT12), IMAGE_ICON, m_rchspct.Width(), m_rchspct.Height(), LR_DEFAULTCOLOR);
//make the window transprant
//加入WS_EX_LAYERED扩展属性
SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE,
GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^0x80000);
HINSTANCE hInst = LoadLibrary("User32.DLL");
if(hInst)
{
typedef BOOL (WINAPI *MYFUNC)(HWND,COLORREF,BYTE,DWORD);
MYFUNC fun = NULL;
//取得SetLayeredWindowAttributes函数指针
fun=(MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes");
if(fun)fun(this->GetSafeHwnd(),GetSysColor(COLOR_ACTIVECAPTION), 128, 2);
FreeLibrary(hInst);
}
LOGFONT lf;
memset(&lf,0,sizeof(LOGFONT));
lf.lfHeight = -14 ;
lf.lfWeight = FW_LIGHT ;
lf.lfCharSet = ANSI_CHARSET ;
lf.lfOutPrecision = OUT_DEFAULT_PRECIS ;
lf.lfClipPrecision = CLIP_DEFAULT_PRECIS ;
lf.lfQuality = DEFAULT_QUALITY ;
lf.lfPitchAndFamily = FF_DONTCARE|DEFAULT_PITCH;
lstrcpy (lf.lfFaceName, "宋体") ;
m_font.CreateFontIndirect(&lf);
return 0;
}
void CStateWnd::SetChsSta(BOOL bSta)
{
m_bChsSta = bSta;
InvalidateRect(m_rchs);
}
void CStateWnd::SetSbcSta(BOOL bSta)
{
m_bSbcSta = bSta;
InvalidateRect(m_rsbc);
}
void CStateWnd::SetChsPct(BOOL bSta)
{
m_bChsPct = bSta;
InvalidateRect(m_rchspct);
}
void CStateWnd::SetCapSta(BOOL bSta)
{
m_bCapSta = bSta;
Invalidate();
}
void CStateWnd::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if (!m_bCapSta)
{
if (m_rchs.PtInRect(point))
SetChsState(!m_bChsSta);
if (m_rsbc.PtInRect(point))
SetSbcState(!m_bSbcSta);
}
if (m_rchspct.PtInRect(point))
SetChsPctState(!m_bChsPct);
CWnd::OnLButtonDown(nFlags, point);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -