📄 hikerwbstatewnd.cpp
字号:
break;
}
//displaying refresh
m_iHangOn = HitTest(point);
if (m_iHangOn == ACT_SIZING)
{
hc = LoadCursor(NULL, IDC_SIZEWE);
SetCursor(hc);
}
if (m_iLastHangOn != m_iHangOn)
{
rt = GetRect(m_iHangOn);
InvalidateRect(&rt, FALSE);
if (m_iLastHangOn != ACT_OTHER)
{
rt = GetRect(m_iLastHangOn);
InvalidateRect(&rt, FALSE);
}
m_iLastHangOn = m_iHangOn;
}
CWnd::OnMouseMove(nFlags, point);
}
void CHikerWBStateWnd::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CRect rt;
HCURSOR hc;
GetWindowRect(m_rect);
m_pos = point;
m_iAct = HitTest(point);
if (m_iAct == ACT_SIZING)
{
hc = LoadCursor(NULL, IDC_SIZEWE);
SetCursor(hc);
SetWindowRgn(0, FALSE); //delete window region first for avoiding changing it when moving!
}
Invalidate(FALSE);
SetCapture();
CWnd::OnLButtonDown(nFlags, point);
}
void CHikerWBStateWnd::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
int itgt = HitTest(point);
if (m_iAct == ACT_SIZING)
{
UpdateRects();
CRect rt;
GetWindowRect(rt);
m_cDefaultPos.right = m_cDefaultPos.left+rt.Width();
CRgn rgnwnd;
CRect rwnd;
GetClientRect(&rwnd);
rgnwnd.CreateRoundRectRgn(rwnd.left, rwnd.top, rwnd.right+1, rwnd.bottom+1, m_ptcornw.x, m_ptcornw.y);
SetWindowRgn(rgnwnd, TRUE);
}
else if (m_iAct == ACT_MOVING && !m_bFloatWnd)
{
GetWindowRect(m_cDefaultPos);
}
else if (m_iAct == ACT_OTHER && itgt == ACT_OTHER) //click
{
int pos = GetWordIndex(point);
if (pos >= 0)
UISetCurrPos(pos);
}
else if (m_iAct == ACT_WORDPGUP && itgt == ACT_WORDPGUP)
{
if (m_bWdPgUpEnb)
keybd_event(33, 0, 0, 0);
}
else if (m_iAct == ACT_WORDPGDN && itgt == ACT_WORDPGDN)
{
if (m_bWdPgDnEnb)
keybd_event(34, 0, 0, 0);
}
else if (m_iAct == ACT_SENTPGUP && itgt == ACT_SENTPGUP)
{
if (m_bStPgUpEnb)
{
int iStPgSize = m_rsview.Width()-20;
if (m_rslog.left + iStPgSize < m_rsview.left)
m_rslog.OffsetRect(iStPgSize, 0);
else
m_rslog.OffsetRect(-m_rslog.left+m_rsview.left, 0);
m_bStPgUpEnb = ((m_rslog.left < m_rsview.left)?TRUE:FALSE);
m_bStPgDnEnb = ((m_rslog.right > m_rsview.right)?TRUE:FALSE);
}
}
else if (m_iAct == ACT_SENTPGDN && itgt == ACT_SENTPGDN)
{
if (m_bStPgDnEnb)
{
int iStPgSize = m_rsview.Width()-20;
if (m_rslog.right - iStPgSize > m_rsview.right)
m_rslog.OffsetRect(-iStPgSize, 0);
else
m_rslog.OffsetRect(m_rsview.right - m_rslog.right, 0);
m_bStPgUpEnb = ((m_rslog.left < m_rsview.left)?TRUE:FALSE);
m_bStPgDnEnb = ((m_rslog.right > m_rsview.right)?TRUE:FALSE);
}
}
else if (m_iAct == ACT_CHSSTA && itgt == ACT_CHSSTA)
{
m_bChsSta = !m_bChsSta;
UISetChsState(m_bChsSta); //set gbChsSta in UI.cpp
}
else if (m_iAct == ACT_SBCSTA && itgt == ACT_SBCSTA)
{
m_bSbcSta = !m_bSbcSta;
UISetSbcState(m_bSbcSta); //set gbSBCSta in UI.cpp
}
else if (m_iAct == ACT_CHSPCT && itgt == ACT_CHSPCT)
{
m_bChsPct = !m_bChsPct;
UISetChsPctState(m_bChsPct); ////set gbChsPctSta in UI.cpp
}
m_iAct = -1;
ReleaseCapture();
Invalidate(FALSE);
CWnd::OnLButtonUp(nFlags, point);
}
int CHikerWBStateWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CWnd::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
//set and save default window position
m_bWdPgUpEnb = FALSE;
m_bWdPgDnEnb = FALSE;
m_bStPgUpEnb = FALSE;
m_bStPgDnEnb = FALSE;
m_iAct = -1;
m_crWndBack = 0x00FFB000;
m_crWndBord = 0x00000000;
m_crLine = 0x00000000;
m_crCaret = 0x0000007F;
m_crTxtBack = 0x00E0E0E0;
m_crTxtFore = 0x00000000;
m_crHiTxtFore= 0x00FF0000;
m_crHiTxtBack= 0x00000000;
m_ptcornw = CPoint(6, 6);
CDC dc;
dc.CreateDC("DISPLAY", NULL, NULL, NULL);
int iw = dc.GetDeviceCaps(HORZRES);
int ih = dc.GetDeviceCaps(VERTRES);
dc.DeleteDC();
m_ScreenSize.cx = iw;
m_ScreenSize.cy = ih;
CRect rect(0, ih-28-STAWNDHEIGHT, STAWNDWIDTH, ih-28);
SetWindowPos(&wndTopMost, rect.left, rect.top, rect.Width(), rect.Height(), SWP_HIDEWINDOW);
GetWindowRect(m_cDefaultPos); //save default window pos
m_bFloatWnd = FALSE;
CRgn rgnwnd;
CRect rwnd;
GetClientRect(&rwnd);
rgnwnd.CreateRoundRectRgn(rwnd.left, rwnd.top, rwnd.right+1, rwnd.bottom+1, m_ptcornw.x, m_ptcornw.y);
SetWindowRgn(rgnwnd, TRUE);
m_ptcornw = CPoint(5,5);
m_ptcorn = CPoint(3,3);
UpdateRects();
m_rslog = m_rs;
//load icons
m_hiChs0 = (HICON)LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_CHSSTA0), IMAGE_ICON, m_rchs.Width()-2, m_rchs.Height()-2, LR_DEFAULTCOLOR);
m_hiChs1 = (HICON)LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_CHSSTA1), IMAGE_ICON, m_rchs.Width()-2, m_rchs.Height()-2, LR_DEFAULTCOLOR);
m_hiSbc0 = (HICON)LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_SBCSTA0), IMAGE_ICON, m_rsbc.Width()-2, m_rsbc.Height()-2, LR_DEFAULTCOLOR);
m_hiSbc1 = (HICON)LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_SBCSTA1), IMAGE_ICON, m_rsbc.Width()-2, m_rsbc.Height()-2, LR_DEFAULTCOLOR);
m_hiChsPct0 = (HICON)LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_CHSPCT0), IMAGE_ICON, m_rchspct.Width()-2, m_rchspct.Height()-2, LR_DEFAULTCOLOR);
m_hiChsPct1 = (HICON)LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_CHSPCT1), IMAGE_ICON, m_rchspct.Width()-2, m_rchspct.Height()-2, LR_DEFAULTCOLOR);
//create 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, "Times New Roman") ;
m_font.CreateFontIndirect(&lf);
return 0;
}
void CHikerWBStateWnd::UpdateRects()
{
CRect rt;
GetClientRect(rt);
m_rc = CRect(2, 2, 80, 23); //code rect
m_rw = CRect(81, 2, 481 , 23); //word rect
m_rp = CRect(482, 2, max(rt.right-2, 482), 23); //prompt rect
m_rs = CRect(2, 24, rt.right-2, 45); //sentence rect
m_rsview = m_rs;
m_rsview.DeflateRect(SENTMARGIN, 2);
m_rwpu = CRect(m_rw.left+2, m_rw.top+2, m_rw.left+2+BUTTONWIDTH, m_rw.top+2+BUTTONHEIGHT); //word page up button rect
m_rwpd = CRect(m_rw.right-2-BUTTONWIDTH, m_rw.top+2, m_rw.right-2, m_rw.top+2+BUTTONHEIGHT); //word page down button rect
m_rspu = CRect(m_rs.left+2, m_rs.bottom-2-BUTTONHEIGHT, m_rs.left+2+BUTTONWIDTH, m_rs.bottom-2); //sent page up button rect
m_rspd = CRect(m_rs.right-2-BUTTONWIDTH, m_rs.bottom-2-BUTTONHEIGHT, m_rs.right-2, m_rs.bottom-2); //sent page down button rect
m_rchs = CRect(m_rp.left+2, m_rp.top+2, m_rp.left+2+17, m_rp.top+2+17);
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 CHikerWBStateWnd::HitTest(CPoint pt)
{
CRect rt;
GetWindowRect(rt);
CPoint point = pt;
ClientToScreen(&point);
if (abs(point.x - rt.right) <= 3) //sizing
{
return ACT_SIZING;
}
else
{
if (m_rwpu.PtInRect(pt))
return ACT_WORDPGUP;
else if (m_rwpd.PtInRect(pt))
return ACT_WORDPGDN;
else if (m_rspu.PtInRect(pt))
return ACT_SENTPGUP;
else if (m_rspd.PtInRect(pt))
return ACT_SENTPGDN;
else if (m_rchs.PtInRect(pt))
return ACT_CHSSTA;
else if (m_rsbc.PtInRect(pt))
return ACT_SBCSTA;
else if (m_rchspct.PtInRect(pt))
return ACT_CHSPCT;
else if (m_rtmppy.PtInRect(pt))
return ACT_TMPPY;
else
return ACT_OTHER;
}
}
void CHikerWBStateWnd::DrawArrow(CDC* dc, CRect rt, int direct, BOOL enable)
{
CPoint pt;
int i;
CPen pen;//, *pOldPen;
COLORREF cr;
if (!enable)
cr = 0x007F7F7F;
else
cr = 0x00000000;
pen.CreatePen(PS_SOLID, 1, cr);
dc->SelectObject(pen);
if (direct == 0)
{
pt = CPoint(rt.right, rt.top);
pt.Offset(-3,4);
for (i = 4; i > 0; i--)
{
dc->MoveTo(pt);
dc->LineTo(pt.x, pt.y+2*i);
pt.Offset(-1, 1);
}
}
else
{
pt = CPoint(rt.left, rt.top);
pt.Offset(2,4);
for (i = 4; i > 0; i--)
{
dc->MoveTo(pt);
dc->LineTo(pt.x, pt.y+2*i);
pt.Offset(1, 1);
}
}
//dc->SelectObject(pOldPen);
pen.DeleteObject();
}
void CHikerWBStateWnd::SetFloat(BOOL bFloat)
{
m_bFloatWnd = bFloat;
}
BOOL CHikerWBStateWnd::GetFloat()
{
return m_bFloatWnd;
}
void CHikerWBStateWnd::ShowFloat(CPoint pt)
{
CRect rtwnd;
GetWindowRect(rtwnd);
CRect rt = CRect(pt.x, pt.y, pt.x+rtwnd.Width(), pt.y+rtwnd.Height());
rt.OffsetRect(0, 16);
if (rt.left < 0)
rt.OffsetRect(-rt.left, 0);
if (rt.top < 0)
rt.OffsetRect(0, -rt.top);
if (rt.right > m_ScreenSize.cx)
rt.OffsetRect(m_ScreenSize.cx-rt.right, 0);
if (rt.bottom > m_ScreenSize.cy)
rt.OffsetRect(0, m_ScreenSize.cy-rt.bottom);
MoveWindow(rt);
ShowWindow(SW_SHOWNA);
//SetWindowPos(&wndTopMost, rt.left, rt.top, rt.Width(), rt.Height(), SWP_SHOWWINDOW);
}
void CHikerWBStateWnd::ShowFix()
{
MoveWindow(m_cDefaultPos);
ShowWindow(SW_SHOW);
}
CRect CHikerWBStateWnd::GetRect(int iAct)
{
switch (iAct) //sizing
{
case ACT_WORDPGUP:
return m_rwpu;
case ACT_WORDPGDN:
return m_rwpd;
case ACT_SENTPGUP:
return m_rspu;
case ACT_SENTPGDN:
return m_rspd;
case ACT_CHSSTA:
return m_rchs;
case ACT_SBCSTA:
return m_rsbc;
case ACT_CHSPCT:
return m_rchspct;
case ACT_TMPPY:
return m_rtmppy;
default: //moving or sizing
CRect rt;
GetClientRect(&rt);
return rt;
}
}
void CHikerWBStateWnd::SetChsSta(BOOL bSta)
{
m_bChsSta = bSta;
InvalidateRect(m_rchs);
}
void CHikerWBStateWnd::SetSbcSta(BOOL bSta)
{
m_bSbcSta = bSta;
InvalidateRect(m_rsbc);
}
void CHikerWBStateWnd::SetChsPct(BOOL bSta)
{
m_bChsPct = bSta;
InvalidateRect(m_rchspct);
}
BOOL CHikerWBStateWnd::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
return CWnd::OnEraseBkgnd(pDC);
//return TRUE;
}
//get the index of the word that displaying position is specified by pt
int CHikerWBStateWnd::GetWordIndex(CPoint pt)
{
int iLeftLoc;
CRect rt;
CSize slsiz, siz, srsiz;
if (!m_rsview.PtInRect(pt))
return -1;
CDC* pdc = GetDC();
pdc->SelectObject(&m_font);
rt.top = m_rslog.top;
rt.bottom = m_rslog.bottom;
rt.left = m_rslog.left;
iLeftLoc = 0;
for (int i = 0; i < m_wordnum; i++)
{
siz = pdc->GetTextExtent(m_sent.Mid(iLeftLoc, m_wslen[i])); //current word size
rt.right = rt.left + siz.cx -1;
if (rt.PtInRect(pt))
return i;
iLeftLoc += m_wslen[i];
rt.left = rt.right + 1;
}
return -1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -