📄 hikerwbstatewnd.cpp
字号:
// HikerWBStateWnd.cpp : implementation file
//
#include "stdafx.h"
#include "resource.h"
#include "HikerWBStateWnd.h"
#include "HikerWBUI.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define MINWNDWIDTH 483 //minimum stateWnd width
#define BUTTONWIDTH 9
#define BUTTONHEIGHT 17
#define ACT_MOVING 0
#define ACT_SIZING 1
#define ACT_WORDPGUP 2
#define ACT_WORDPGDN 3
#define ACT_SENTPGUP 4
#define ACT_SENTPGDN 5
#define ACT_CHSSTA 6
#define ACT_SBCSTA 7
#define ACT_CHSPCT 8
#define ACT_TMPPY 9
#define ACT_OTHER 10
#define CODEMARGIN 3
#define WORDMARGIN 15
#define SENTMARGIN 15
/////////////////////////////////////////////////////////////////////////////
// CHikerWBStateWnd
CHikerWBStateWnd::CHikerWBStateWnd()
{
}
CHikerWBStateWnd::~CHikerWBStateWnd()
{
m_font.DeleteObject();
}
BEGIN_MESSAGE_MAP(CHikerWBStateWnd, CWnd)
//{{AFX_MSG_MAP(CHikerWBStateWnd)
ON_WM_PAINT()
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_CREATE()
ON_WM_ERASEBKGND()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CHikerWBStateWnd message handlers
BOOL CHikerWBStateWnd::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
//POINT pt;
HCURSOR hc = LoadCursor(NULL, IDC_ARROW);
SetCursor(hc);
LockInputWnd(); //05.11.10
ReleaseFocus();
UISetFocusWnd(m_hFocusWnd/*GetFocus()->GetSafeHwnd()*/);
if (pMsg->message == WM_HOOKKEY)
HookKeyHandle(pMsg->wParam, pMsg->lParam);
return CWnd::PreTranslateMessage(pMsg);
}
void CHikerWBStateWnd::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
CBrush brushwbk(m_crWndBack);
CBrush brushwbd(m_crWndBord);
CBrush brushb(m_crTxtBack);
CPen penl(PS_SOLID, 1, m_crLine);
CPen penb(PS_SOLID, 1, m_crWndBack); //pen for drawing button border
CPen penc(PS_SOLID, 1, m_crCaret);
CRect rwnd;
GetClientRect(rwnd);
CRect rc = m_rc;
CRect rw = m_rw;
CRect rs = m_rs;
CRect rp = m_rp;
CRect rslog = m_rslog;
CRect rsview = m_rsview;
CRect rwpu = m_rwpu;
CRect rwpd = m_rwpd;
CRect rspu = m_rspu;
CRect rspd = m_rspd;
CRect rchs = m_rchs;
CRect rsbc = m_rsbc;
CRect rchspct = m_rchspct;
CRect rtmppy = m_rtmppy;
if (m_iAct == ACT_SIZING)
{
HCURSOR hc = LoadCursor(NULL, IDC_SIZEWE);
SetCursor(hc);
}
//fill window background
// dc.SelectObject(&brushw); //for draw round rectangle
// dc.SelectObject(&penw); //for draw round rectangle
// dc.RoundRect(rt, ptcornw);
//dynamically set cursor when sizing, the cursor set at OnMouseMove will be erased when Invalidate()
CRgn rgnc, rgnw, rgnp, rgns, rgnwnd, rgnmar;
//rgnwnd.DeleteObject();
rgnwnd.CreateRoundRectRgn(rwnd.left, rwnd.top, rwnd.right+1, rwnd.bottom+1, m_ptcornw.x, m_ptcornw.y);
rgnmar.CreateRoundRectRgn(rwnd.left+1, rwnd.top+1, rwnd.right, rwnd.bottom, m_ptcornw.x, m_ptcornw.y);
rgnc.CreateRoundRectRgn(rc.left, rc.top, rc.right, rc.bottom, m_ptcorn.x, m_ptcorn.y);
rgnw.CreateRoundRectRgn(rw.left, rw.top, rw.right, rw.bottom, m_ptcorn.x, m_ptcorn.y);
rgnp.CreateRoundRectRgn(rp.left, rp.top, rp.right, rp.bottom, m_ptcorn.x, m_ptcorn.y);
rgns.CreateRoundRectRgn(rs.left, rs.top, rs.right, rs.bottom, m_ptcorn.x, m_ptcorn.y);
rgnmar.CombineRgn(&rgnmar, &rgnc, RGN_XOR);
rgnmar.CombineRgn(&rgnmar, &rgnw, RGN_XOR);
rgnmar.CombineRgn(&rgnmar, &rgnp, RGN_XOR);
rgnmar.CombineRgn(&rgnmar, &rgns, RGN_XOR);
dc.FrameRgn(&rgnwnd, &brushwbd, 1, 1);
dc.FillRgn(&rgnmar, &brushwbk);
//draw code word sentence and prompt area
dc.SelectObject(&brushb); //for draw round rectangle
dc.SelectObject(&penl); //for draw round rectangle
dc.RoundRect(rc, m_ptcorn);
dc.RoundRect(rw, m_ptcorn);
dc.RoundRect(rs, m_ptcorn);
dc.RoundRect(rp, m_ptcorn);
//draw page up and down buttons
if (m_iHangOn == ACT_WORDPGUP && m_bWdPgUpEnb)
{
if (m_iAct != ACT_WORDPGUP)
dc.Draw3dRect(rwpu, GetSysColor(COLOR_3DLIGHT), GetSysColor(COLOR_3DSHADOW));
else
dc.Draw3dRect(rwpu, GetSysColor(COLOR_3DSHADOW), GetSysColor(COLOR_3DLIGHT));
}
if (m_iHangOn == ACT_WORDPGDN && m_bWdPgDnEnb)
{
if (m_iAct != ACT_WORDPGDN)
dc.Draw3dRect(rwpd, GetSysColor(COLOR_3DLIGHT), GetSysColor(COLOR_3DSHADOW));
else
dc.Draw3dRect(rwpd, GetSysColor(COLOR_3DSHADOW), GetSysColor(COLOR_3DLIGHT));
}
if (m_iHangOn == ACT_SENTPGUP && m_bStPgUpEnb)
{
if (m_iAct != ACT_SENTPGUP)
dc.Draw3dRect(rspu, GetSysColor(COLOR_3DLIGHT), GetSysColor(COLOR_3DSHADOW));
else
dc.Draw3dRect(rspu, GetSysColor(COLOR_3DSHADOW), GetSysColor(COLOR_3DLIGHT));
}
if (m_iHangOn == ACT_SENTPGDN && m_bStPgDnEnb)
{
if (m_iAct != ACT_SENTPGDN)
dc.Draw3dRect(rspd, GetSysColor(COLOR_3DLIGHT), GetSysColor(COLOR_3DSHADOW));
else
dc.Draw3dRect(rspd, GetSysColor(COLOR_3DSHADOW), GetSysColor(COLOR_3DLIGHT));
}
DrawArrow(&dc, rwpu, 0, m_bWdPgUpEnb);
DrawArrow(&dc, rwpd, 1, m_bWdPgDnEnb);
DrawArrow(&dc, rspu, 0, m_bStPgUpEnb);
DrawArrow(&dc, rspd, 1, m_bStPgDnEnb);
//set clipping aera
CRgn rgncc, rgnwc, rgnsc, rgnclt;
rc.DeflateRect(CODEMARGIN,2);
rw.DeflateRect(WORDMARGIN,2);
//rgncc.CreateRoundRectRgn(rc.left, rc.top, rc.right, rc.bottom, ptcorn.x, ptcorn.y);
rgnwc.CreateRoundRectRgn(rw.left, rw.top, rw.right, rw.bottom, m_ptcorn.x, m_ptcorn.y);
rgnsc.CreateRoundRectRgn(rsview.left, rsview.top, rsview.right, rsview.bottom, m_ptcorn.x, m_ptcorn.y);
rgnclt.CreateRectRgn(rc.left, rc.top, rc.right, rc.bottom);
rgnclt.CombineRgn(&rgnclt, &rgnwc, RGN_OR);
rgnclt.CombineRgn(&rgnclt, &rgnp, RGN_OR);
rgnclt.CombineRgn(&rgnclt, &rgnsc, RGN_OR);
dc.SelectClipRgn(&rgnclt, RGN_OR); //clipping the sentence outside rs
//??? RGN_OR must be specified.
//draw prompt buttons
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);
HBRUSH hBrushb = (HBRUSH)brushb.GetSafeHandle();
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);
//Draw text
//rc.DeflateRect(CODEMARGIN, 2);
//rw.DeflateRect(WORDMARGIN, 2);
//dc.SetROP2(R2_COPYPEN); //no use?
dc.SelectObject(&m_font);
dc.SetBkColor(m_crTxtBack); //for drawtext()
dc.SetTextColor(m_crHiTxtFore);
dc.DrawText(m_code, rc, DT_LEFT|DT_TOP|DT_SINGLELINE);
dc.SetTextColor(m_crTxtFore);
dc.DrawText(m_word, rw, DT_LEFT|DT_TOP|DT_SINGLELINE);
dc.DrawText(m_sent, rslog, DT_LEFT|DT_TOP|DT_SINGLELINE);
if (!m_bFullCode)
{
dc.SetTextColor(m_crTxtFore);
dc.DrawText(m_code.Left(m_code.GetLength()-1), rc, DT_LEFT|DT_TOP|DT_SINGLELINE);
}
//draw hilight current word in the sentence
//dc.SetBkColor(m_crHiTxtBack);
dc.SetTextColor(m_crHiTxtFore);
CRect rscurwd = rslog;
rscurwd.left = m_rslog.left + m_iCurrWdPt;
rscurwd.right = rscurwd.left + m_iCurrWdWid;
dc.DrawText(m_sent.Mid(m_iCurrWdLoc, m_iCurrWdLen), rscurwd, DT_LEFT|DT_TOP|DT_SINGLELINE);
rscurwd.left = rscurwd.right-1;
dc.SelectObject(&penc);
dc.Rectangle(rscurwd);
// Do not call CWnd::OnPaint() for painting messages
}
void CHikerWBStateWnd::SetCode(LPCSTR pCode, BOOL bFull)
{
m_code = CString(pCode);
m_bFullCode = bFull;
//UpdateWindow();
InvalidateRect(m_rc);
}
void CHikerWBStateWnd::SetWord(LPCSTR pWord)
{
m_word = CString(pWord);
//UpdateWindow();
m_bWdPgUpEnb = FALSE;
m_bWdPgDnEnb = FALSE;
InvalidateRect(m_rw);
}
void CHikerWBStateWnd::SetWord(LPCSTR pWord, int giPageNo, int selwordnum)
{
m_word = CString(pWord);
//UpdateWindow();
m_bWdPgUpEnb = ((giPageNo == 0)?FALSE:TRUE);
m_bWdPgDnEnb = (((giPageNo+1)*10 >= selwordnum)?FALSE:TRUE);
InvalidateRect(m_rw);
}
void CHikerWBStateWnd::SetSent(LPCSTR pSent, int* wslen, int wdnum, int iCurrPos)
{
m_sent = CString(pSent);
m_wslen = wslen;
m_wordnum = wdnum;
//UpdateWindow();
int iLeftLoc = 0;
for (int i = 0; i < iCurrPos; i++)
iLeftLoc += wslen[i];
int iRightLoc = iLeftLoc + wslen[iCurrPos];
CDC* pdc = GetDC();
pdc->SelectObject(&m_font);
CSize stsiz = pdc->GetTextExtent(m_sent); //sent size
CSize srsiz = pdc->GetTextExtent(m_sent.Left(iRightLoc)); //left sent size
CSize siz = pdc->GetTextExtent(m_sent.Mid(iLeftLoc, iRightLoc-iLeftLoc)); //current word size
CSize slsiz = srsiz;
slsiz.cx = srsiz.cx - siz.cx;
ReleaseDC(pdc);
m_rslog.right = m_rslog.left + stsiz.cx;
int iOffset = m_rslog.left + srsiz.cx - m_rsview.right;
if (iOffset > 0)
m_rslog.OffsetRect(-iOffset, 0);
iOffset = m_rslog.left + slsiz.cx - m_rsview.left;
if (iOffset < 0)
m_rslog.OffsetRect(-iOffset, 0);
//set sentence page up and down buttons' state
m_bStPgUpEnb = ((m_rslog.left < m_rsview.left)?TRUE:FALSE);
m_bStPgDnEnb = ((m_rslog.right > m_rsview.right)?TRUE:FALSE);
m_iCurrWdLoc = iLeftLoc;
m_iCurrWdLen = wslen[iCurrPos];
m_iCurrWdPt = slsiz.cx;
m_iCurrWdWid = siz.cx;
InvalidateRect(m_rs);
}
void CHikerWBStateWnd::Clean()
{
m_code = "";
m_word = "";
m_sent = "";
m_rslog = m_rs;
m_rslog.DeflateRect(SENTMARGIN, 2);
m_iCurrWdLoc = 0;
m_iCurrWdLen = 0;
m_iCurrWdPt = 0;
m_iCurrWdWid = 0;
m_bWdPgUpEnb = FALSE;
m_bWdPgDnEnb = FALSE;
m_bStPgUpEnb = FALSE;
m_bStPgDnEnb = FALSE;
//UpdateWindow();
Invalidate();
}
//05.11.10
void CHikerWBStateWnd::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();
}
}
}
}
void CHikerWBStateWnd::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 CHikerWBStateWnd::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CPoint pt;
CRect rt;
HCURSOR hc;
//calculate offset
pt.x = point.x - m_pos.x;
pt.y = point.y - m_pos.y;
GetWindowRect(rt);
//sizing and moving
switch (m_iAct) //sizing
{
case ACT_SIZING:
// hc = LoadCursor(NULL, IDC_SIZEWE); //no use when Invalidate() is executed!
// SetCursor(hc); //so, the two sentence are placed in OnPaint()
rt = m_rect;
rt.right += pt.x;
if (rt.Width() < MINWNDWIDTH)
rt.right = rt.left+MINWNDWIDTH;
MoveWindow(rt);
UpdateRects();
Invalidate(FALSE);
break;
case ACT_OTHER: //moving
if (abs(pt.x) > 2 || abs(pt.y) > 2)
m_iAct = ACT_MOVING;
break;
case ACT_MOVING:
hc = LoadCursor(NULL, IDC_SIZEALL);
SetCursor(hc);
rt.OffsetRect(pt);
MoveWindow(rt);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -