📄 keys.cpp
字号:
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 + -