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

📄 keys.cpp

📁 俄罗斯人开发的大名鼎鼎的Pocket Pc 阅读器haaliread的源代码,visual c
💻 CPP
📖 第 1 页 / 共 2 页
字号:

    ii.mask = LVIF_TEXT;
    ii.stateMask = 0;
    ii.iItem = i;
    ii.iSubItem = 1;

    CString ks = GetKeyNames(i);

    ii.pszText = (TCHAR *)(const TCHAR *)ks;

    ::SendMessage(::GetDlgItem(m_hWnd,IDC_COMMANDS),LVM_SETITEMTEXT,i,(LPARAM)&ii);
  }

  // Generated message map functions
  //{{AFX_MSG(CKeysDlg)
  virtual BOOL OnInitDialog();
  afx_msg void OnActivate(NMHDR* pNMHDR, LRESULT* pResult);
  //}}AFX_MSG
  DECLARE_MESSAGE_MAP()
};

CKeysDlg::CKeysDlg(CWnd* pParent /*=NULL*/)
: CDialog(CKeysDlg::IDD, pParent)
{
  //{{AFX_DATA_INIT(CKeysDlg)
  //}}AFX_DATA_INIT
}

BEGIN_MESSAGE_MAP(CKeysDlg, CDialog)
//{{AFX_MSG_MAP(CKeysDlg)
ON_NOTIFY(LVN_ITEMCHANGED, IDC_COMMANDS, OnActivate)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

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

#if POCKETPC
  ((CCeCommandBar *)m_pWndEmptyCB)->LoadToolBar(cIDR_DIALOG);
#endif

#if POCKETPC
  // resize the list box
  RECT	    rcC,rcB1,rcB2,rcL;
  GetClientRect(&rcC);

  ::GetWindowRect(::GetDlgItem(m_hWnd,IDC_LABEL),&rcL); ScreenToClient(&rcL);
  ::GetWindowRect(::GetDlgItem(m_hWnd,IDASSIGN),&rcB1); ScreenToClient(&rcB1);
  ::GetWindowRect(::GetDlgItem(m_hWnd,IDCLEAR),&rcB2); ScreenToClient(&rcB2);

  int	    delta = rcC.bottom - rcB1.bottom - 4;

  if (delta > 0) {
    rcL.top += delta; rcL.bottom += delta;
    rcB1.top += delta; rcB1.bottom += delta;
    rcB2.top += delta; rcB2.bottom += delta;
    GetDlgItem(IDC_LABEL)->MoveWindow(&rcL);
    GetDlgItem(IDASSIGN)->MoveWindow(&rcB1);
    GetDlgItem(IDCLEAR)->MoveWindow(&rcB2);

    GetDlgItem(IDC_COMMANDS)->GetWindowRect(&rcL);
    ScreenToClient(&rcL);
    rcL.bottom += delta;
    rcL.left = rcC.left - 1;
    rcL.right = rcC.right + 1;
    GetDlgItem(IDC_COMMANDS)->MoveWindow(&rcL);
  }
#endif

  ::EnableWindow(::GetDlgItem(m_hWnd,IDASSIGN),FALSE);
  ::EnableWindow(::GetDlgItem(m_hWnd,IDCLEAR),FALSE);

  CWnd	  *lv = GetDlgItem(IDC_COMMANDS);

#ifdef LVS_EX_FULLROWSELECT
  lv->SendMessage(LVM_SETEXTENDEDLISTVIEWSTYLE,LVS_EX_FULLROWSELECT,LVS_EX_FULLROWSELECT);
#endif

  RECT	  rcLV;
  lv->GetClientRect(&rcLV);

  int	  vw = rcLV.right - rcLV.left - GetSystemMetrics(SM_CXVSCROLL);

  LVCOLUMN   col;
  memset(&col, 0, sizeof(col));

  col.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
  col.fmt = LVCFMT_LEFT;
  col.cx = vw / 2;

  GetDlgItem(IDC_COMMANDS)->SendMessage(LVM_INSERTCOLUMN,0,(LPARAM)&col);

  col.cx = vw - col.cx;
  GetDlgItem(IDC_COMMANDS)->SendMessage(LVM_INSERTCOLUMN,1,(LPARAM)&col);

  CString   ks;

  for (int i = 0; i < NUMACTIONS; ++i) {
    LVITEM    ii;
    memset(&ii, 0, sizeof(ii));

    ii.mask = LVIF_TEXT;
    ii.stateMask = 0;
    ii.pszText = (TCHAR *)g_actions[i].name;
    ii.iItem = i;
    ii.iSubItem = 0;

    lv->SendMessage(LVM_INSERTITEM,0,(LPARAM)&ii);

    ks = GetKeyNames(i);

    ii.iSubItem = 1;
    ii.pszText = (TCHAR *)(const TCHAR *)ks;

    lv->SendMessage(LVM_SETITEMTEXT,i,(LPARAM)&ii);
  }

  return TRUE;
}

class CKeyGrabDlg : public CDialog
{
  // Construction
public:
  CKeyGrabDlg(CWnd* pParent = NULL);   // standard constructor

  UINT	      m_vk[16];

  void	Record(UINT vk) {
    SetTimer(1,50,NULL);
    for (int i = 0; i < sizeof(m_vk)/sizeof(m_vk[0]); ++i)
      if (m_vk[i] == 0) {
	m_vk[i] = vk;
	return;
      }
  }

  UINT	Get() {
    UINT    vk = 0;
    for (int i = 0; i < sizeof(m_vk)/sizeof(m_vk[0]); ++i)
      if (LOWORD(m_vk[i]) && (vk == 0 || LOWORD(m_vk[i]) < vk))
	vk = LOWORD(m_vk[i]);
    return vk;
  }

#if 0
  CString List() {
    CString s;
    for (int i = 0; i < sizeof(m_vk)/sizeof(m_vk[0]); ++i) {
      if (m_vk[i] == 0)
	break;
      CString t; t.Format(_T("0x%x"),m_vk[i]);
      if (!s.IsEmpty())
	s+=' ';
      s+=t;
    }
    return s;
  }
#endif

  enum { IDD = IDD_KEYGRAB };
  
protected:
  static LRESULT CALLBACK GrabKeyProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
  
  // Generated message map functions
  //{{AFX_MSG(CKeyGrabDlg)
  virtual BOOL OnInitDialog();
  afx_msg void OnDestroy();
  afx_msg void OnTimer(UINT nIDEvent);
  //}}AFX_MSG
  afx_msg LRESULT OnHotkey(WPARAM,LPARAM);
  afx_msg LRESULT OnApp(WPARAM,LPARAM);
  DECLARE_MESSAGE_MAP()
};

/////////////////////////////////////////////////////////////////////////////
// CKeyGrabDlg dialog

CKeyGrabDlg::CKeyGrabDlg(CWnd* pParent /*=NULL*/)
: CDialog(CKeyGrabDlg::IDD, pParent)
{
  memset(m_vk,0,sizeof(m_vk));
}

BEGIN_MESSAGE_MAP(CKeyGrabDlg, CDialog)
//{{AFX_MSG_MAP(CKeyGrabDlg)
ON_WM_DESTROY()
ON_WM_TIMER()
//}}AFX_MSG_MAP
ON_MESSAGE(WM_HOTKEY, OnHotkey)
ON_MESSAGE(WM_APP, OnApp)
#if POCKETPC
ON_WM_SETTINGCHANGE()
#endif
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CKeyGrabDlg message handlers

void CKeyGrabDlg::OnTimer(UINT nIDEvent) 
{
  for (int i = 0; i < sizeof(m_vk)/sizeof(m_vk[0]); ++i)
    if (LOWORD(m_vk[i]) && (GetAsyncKeyState(LOWORD(m_vk[i])) & 0x8000)) {
      SetTimer(1,50,NULL);
      return;
    }
  EndDialog(IDOK);
}

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

#if POCKETPC
  ((CCeCommandBar *)m_pWndEmptyCB)->LoadToolBar(cIDR_DIALOG);
#endif

  RECT	rcC;
  GetClientRect(&rcC);

  HWND hWnd = ::CreateWindow(_T("Static"),_T("Press any key..."),WS_VISIBLE|WS_CHILD|SS_CENTER,
    rcC.left,rcC.top + (rcC.bottom-rcC.top)/2 - HIWORD(GetDialogBaseUnits()),
    rcC.right-rcC.left,HIWORD(GetDialogBaseUnits()*2),m_hWnd,
    (HMENU)47793,AfxGetInstanceHandle(),NULL);

  // release all keys
  if (g_keyowner)
    ReleaseAllKeys(g_keyowner);

  // and grab all
  for (int i=MINHK;i<=MAXHK;++i)
    GrabKey(m_hWnd,i);

  SetWindowLong(m_hWnd,GWL_USERDATA,GetWindowLong(m_hWnd,GWL_WNDPROC));
  SetWindowLong(m_hWnd,GWL_WNDPROC,(LONG)GrabKeyProc);

  SetWindowLong(hWnd,GWL_USERDATA,GetWindowLong(hWnd,GWL_WNDPROC));
  SetWindowLong(hWnd,GWL_WNDPROC,(LONG)GrabKeyProc);

  SetFocus();

  return TRUE;
}

void CKeyGrabDlg::OnDestroy() {
  // release keys
  for (int i=MINHK;i<=MAXHK;++i)
    ReleaseKey(m_hWnd,i);
  // and regrab
  if (g_keyowner)
    GrabAllKeys(g_keyowner);
  CDialog::OnDestroy();
}

LRESULT CKeyGrabDlg::OnHotkey(WPARAM wp,LPARAM lp) {
  Record(MAKELONG(HIWORD(lp),LOWORD(lp)));
  return 0;
}

LRESULT CKeyGrabDlg::OnApp(WPARAM wp,LPARAM lp) {
  if (wp == 0x86)
    Record(13);
  return 0;
}

LRESULT CALLBACK CKeyGrabDlg::GrabKeyProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam) {
  WNDPROC wp = (WNDPROC)GetWindowLong(hWnd,GWL_USERDATA);

  HWND	  mWnd = hWnd;

  if (::GetDlgCtrlID(hWnd) == 47793)
    mWnd = ::GetParent(hWnd);

  if (mWnd == NULL)
    return CallWindowProc(wp,hWnd,uMsg,wParam,lParam);

  if (uMsg == WM_KEYDOWN) {
    if (!IsMod(wParam) && !(lParam & 0x40000000))
      ::PostMessage(mWnd,WM_APP,wParam,0);
  }

  if (uMsg == WM_KEYUP) {
    if (!IsMod(wParam))
      ::PostMessage(mWnd,WM_HOTKEY,wParam,MAKELONG(0,wParam));
    return 0;
  }

  if (uMsg == WM_DESTROY)
    SetWindowLong(hWnd,GWL_WNDPROC,GetWindowLong(hWnd,GWL_USERDATA));

  return CallWindowProc(wp,hWnd,uMsg,wParam,lParam);
}

void Keys::SetupKeys(CWnd *parent) {
  CKeysDlg    dlg;
  if (dlg.DoModal()==IDOK)
    SaveKeys();
  else {
    HWND  owner=g_keyowner;
    Keys::SetWindow(0);
    Keys::InitKeys();
    Keys::SetWindow(owner);
  }
}

BOOL CKeysDlg::OnCommand(WPARAM wParam, LPARAM lParam) 
{
  int sel = ::SendMessage(::GetDlgItem(m_hWnd,IDC_COMMANDS),LVM_GETSELECTIONMARK,0,0);

  switch (LOWORD(wParam)) {
    case IDASSIGN:
      if (sel >= 0 && sel < NUMACTIONS && HaveSlots(sel)) {
	CKeyGrabDlg dlg(this);
	dlg.DoModal();
	if (dlg.Get()) {
	  UINT  vk = dlg.Get();
	  for (int j = 0; j < NUMACTIONS; ++j) {
	    if (g_actions[j].vk1 == vk) {
	      g_actions[j].vk1 = 0;
	      SetText(j);
	    }
	    if (g_actions[j].vk2 == vk) {
	      g_actions[j].vk2 = 0;
	      SetText(j);
	    }
	    if (g_actions[j].vk3 == vk) {
	      g_actions[j].vk3 = 0;
	      SetText(j);
	    }
	  }

	  if (g_keyowner)
	    ReleaseAct(g_keyowner,sel);

	  AddKey(sel,vk);

	  if (g_keyowner)
	    GrabAct(g_keyowner,sel);

	  SetButtons(sel);
	  SetText(sel);
	}
      }
      return TRUE;
    case IDCLEAR:
      if (sel >= 0 && sel < NUMACTIONS) {
	if (g_keyowner)
	  ReleaseAct(g_keyowner,sel);
	g_actions[sel].vk1 = g_actions[sel].vk2 = g_actions[sel].vk3 = 0;
	SetButtons(sel);
	SetText(sel);
      }
      return TRUE;
  }

  return CDialog::OnCommand(wParam, lParam);
}

void CKeysDlg::OnActivate(NMHDR* pNMHDR, LRESULT* pResult) 
{
  NMLISTVIEW  *nv = (NMLISTVIEW *)pNMHDR;

  if (nv->iItem >= 0 && (nv->uChanged & LVIF_STATE) && 
      (nv->uNewState & LVIS_SELECTED))
  {
    SetButtons(nv->iItem);
  }
#if 0
  int sel = ::SendMessage(::GetDlgItem(m_hWnd,IDC_COMMANDS),LVM_GETSELECTIONMARK,0,0);

  if (sel >= 0 && sel < NUMACTIONS)
    SetButtons(sel);
#endif

  *pResult = 0;
}

⌨️ 快捷键说明

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