hur.cn - 华软网

 热门搜索

如何让editbox实现修改快捷键的效果

  作者:未知    来源:网络    更新时间:2011/1/9
就像QQ那样的,首先光标一直显示在editbox中最右。
其次,当接受Ctrl+A消息时候,显示Ctrl+A,接受Ctrl+Alt+A时候显示Ctrl+Alt+A

OnKeyDown 只可接受1个按键啊
---华软 网友回答---
注意,我不是问的如何设置,修改快捷键~
我是想问editbox的显示如何和QQ修改快捷键一样
---华软网友回复---
在OnKeyDown 里用GetKeyState()来判断ctrl,alt,shift有没有被按下

---华软网友回复---
引用 2 楼 varding 的回复:
在OnKeyDown 里用GetKeyState()来判断ctrl,alt,shift有没有被按下

这个我昨天也搜到了,现在的问题是editbox如何让光标一直在字符串最后面
---华软网友回复---
差不多算解决了,自己写了个
C++">
// EditEx.cpp : implementation file
//

#include "stdafx.h"
#include "TEST.h"
#include "EditEx.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CEditEx

CEditEx::CEditEx()
{
}

CEditEx::~CEditEx()
{
}


BEGIN_MESSAGE_MAP(CEditEx, CEdit)
//{{AFX_MSG_MAP(CEditEx)
ON_WM_KEYDOWN()
ON_WM_CHAR()
ON_CONTROL_REFLECT(EN_CHANGE, OnChange)
ON_WM_SYSKEYDOWN()
ON_WM_SETFOCUS()
ON_WM_KEYUP()
ON_WM_SYSKEYUP()
ON_WM_KILLFOCUS()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CEditEx message handlers

void CEditEx::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
// TODO: Add your message handler code here and/or call default
if (nChar>=112&&nChar<=123)   //F1~F12
{
if (GetKeyState(VK_CONTROL) < 0)
{
if (GetKeyState(VK_MENU)<0) 
{
CString str;
str.Format("Ctrl + Alt + F%d",nChar-111);
SetWindowText(str);
Invalidate(TRUE);
}
else
{
CString str;
str.Format("Ctrl + F%d",nChar-111);
SetWindowText(str);
Invalidate(TRUE);
}

}
else
{
if (GetKeyState(VK_MENU)<0) 
{
CString str;
str.Format("Alt + F%d",nChar-111);
SetWindowText(str);
Invalidate(TRUE);
}
else
{
CString str;
str.Format("F%d",nChar-111);
SetWindowText(str);
Invalidate(TRUE);
}

}
}
if (nChar>=48&&nChar<=57)   //0~9
{
if (GetKeyState(VK_CONTROL) < 0)
{
if (GetKeyState(VK_MENU)<0) 
{
CString str;
str.Format("Ctrl + Alt + %d",nChar-48);
SetWindowText(str);
Invalidate(TRUE);
}
else
{
CString str;
str.Format("Ctrl + %d",nChar-48);
SetWindowText(str);
Invalidate(TRUE);
}

}
else
{
CString str;
str.Format("Ctrl + %d",nChar-48);
SetWindowText(str);
Invalidate(TRUE);
}
}
if (nChar==17)     //ctrl
{
if (GetKeyState(VK_MENU)<0)   //按下了alt
{
CString str;
str.Format("Ctrl + Alt + ");
SetWindowText(str);
Invalidate(TRUE);
}
else
{
CString str;
str.Format("Ctrl + ");
SetWindowText(str);
Invalidate(TRUE);
}
}
if (nChar>='A'&&nChar<='Z')
{
if (GetKeyState(VK_CONTROL) < 0)
{
if (GetKeyState(VK_MENU)<0) 
{
CString str;
str.Format("Ctrl + Alt + %c",nChar);
SetWindowText(str);
Invalidate(TRUE);
}
else
{
CString str;
str.Format("Ctrl + %c",nChar);
SetWindowText(str);
Invalidate(TRUE);
}

}
else
{
if (GetKeyState(VK_MENU)<0) 
{
CString str;
str.Format("Alt + %c",nChar);
SetWindowText(str);
Invalidate(TRUE);
}
else
{
CString str;
str.Format("Ctrl + %c",nChar);
SetWindowText(str);
Invalidate(TRUE);
}

}
}

CString str1;
GetWindowText(str1);

int len=str1.GetLength();

CreateSolidCaret(1,15);   //创建光标,很重要

TEXTMETRIC tm;
    CDC * pDc = GetDC();
CFont *pFont;
pFont=GetFont();
    if(pFont)
        pDc->SelectObject(pFont);
    pDc->GetTextMetrics(&tm);
    ReleaseDC(pDc);

CPoint pt;
pt.x = len*tm.tmAveCharWidth+1;
pt.y=0;

SetCaretPos(pt); 
ShowCaret();

CEdit::OnKeyDown(nChar, nRepCnt, nFlags);
}

void CEditEx::OnChange() 
{
// TODO: Add your control notification handler code here

}

void CEditEx::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
// TODO: Add your message handler code here and/or call default
if(!nChar)
    {
CEdit::OnChar(nChar, nRepCnt, nFlags);
     }

// CEdit::OnChar(nChar, nRepCnt, nFlags);
}




void CEditEx::OnSysKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
// TODO: Add your message handler code here and/or call default
if (nChar==18)   //alt
{
if (GetKeyState(VK_CONTROL)<0)
{
CString str;
str.Format("Ctrl + Alt +",nChar);
SetWindowText(str);
Invalidate(TRUE);
}
else
{
CString str;
str.Format("Alt +",nChar);
SetWindowText(str);
Invalidate(TRUE);
}
}
else
{
if (nChar>=112&&nChar<=123)   //F1~F12
{
CString str;
str.Format("Alt + F%d",nChar-111);
SetWindowText(str);
Invalidate(TRUE);

}
if (nChar>=48&&nChar<=57)   //F1~F12
{
CString str;
str.Format("Alt + %d",nChar-48);
SetWindowText(str);
Invalidate(TRUE);

}
if (nChar>='A'&&nChar<='Z')
{
CString str;
str.Format("Alt + %c",nChar);
SetWindowText(str);
Invalidate(TRUE);
}
}

CString str1;
GetWindowText(str1);

int len=str1.GetLength();

CreateSolidCaret(1,15);   //创建光标,很重要

TEXTMETRIC tm;
    CDC * pDc = GetDC();
CFont *pFont;
pFont=GetFont();
    if(pFont)
        pDc->SelectObject(pFont);
    pDc->GetTextMetrics(&tm);
    ReleaseDC(pDc);

CPoint pt;
pt.x = len*tm.tmAveCharWidth+1;
pt.y=0;

SetCaretPos(pt); 
ShowCaret();

CEdit::OnSysKeyDown(nChar, nRepCnt, nFlags);
}


void CEditEx::OnSetFocus(CWnd* pOldWnd) 
{
CString str;
GetWindowText(str);

int len=str.GetLength();

TEXTMETRIC tm;
    CDC * pDc = GetDC();
CFont *pFont;
pFont=GetFont();
    if(pFont)
        pDc->SelectObject(pFont);
    pDc->GetTextMetrics(&tm);
    ReleaseDC(pDc);

CPoint pt;
pt.x = len*tm.tmAveCharWidth+1;
pt.y=0;

CreateSolidCaret(1,15);   //创建光标,很重要
SetCaretPos(pt); 
ShowCaret();

}

void CEditEx::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
// TODO: Add your message handler code here and/or call default
HideCaret();
CString str;
GetWindowText(str);
if (str.IsEmpty())
return;
int len=str.GetLength();
char ch=str.GetAt(len-1);
if (ch==' '||ch=='+')
{
SetWindowText("无");
CreateSolidCaret(1,15);   //创建光标,很重要
CPoint pt(13,0);
SetCaretPos(pt); 
ShowCaret();
return;
}
else
{
CWnd *pOtherWnd = CWnd::FindWindow("#32770", ......);
if (str!="无")
{
if (pOtherWnd)
{
CString* msg = new CString(str);
::SendMessage(pOtherWnd->GetSafeHwnd(),WM_MESSAGE_CHANGEHOTKEY,0,(LPARAM)msg);
delete msg;
OnKillFocus(NULL);
// copyDataResult has value returned by other app

}
else
{
if (pOtherWnd)
{
CString* msg = new CString(str);
::SendMessage(pOtherWnd->GetSafeHwnd(),WM_MESSAGE_DELHOTKEY,0,(LPARAM)msg);
delete msg;
OnKillFocus(NULL);
// copyDataResult has value returned by other app


}


}

CEdit::OnKeyUp(nChar, nRepCnt, nFlags);
}

void CEditEx::OnSysKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
// TODO: Add your message handler code here and/or call default
HideCaret();
CString str;
GetWindowText(str);
if (str.IsEmpty())
return;
int len=str.GetLength();
char ch=str.GetAt(len-1);
if (ch==' '||ch=='+')
{
SetWindowText("无");
CreateSolidCaret(1,15);   //创建光标,很重要
CPoint pt(13,0);
SetCaretPos(pt); 
ShowCaret();
return;
}
else
{
CWnd *pOtherWnd = CWnd::FindWindow("#32770", .....);
if (str!="无")
{
if (pOtherWnd)
{
CString* msg = new CString(str);
::SendMessage(pOtherWnd->GetSafeHwnd(),WM_MESSAGE_CHANGEHOTKEY,0,(LPARAM)msg);
delete msg;
OnKillFocus(NULL);
// copyDataResult has value returned by other app

}
else
{
if (pOtherWnd)
{
CString* msg = new CString(str);
::SendMessage(pOtherWnd->GetSafeHwnd(),WM_MESSAGE_DELHOTKEY,0,(LPARAM)msg);
delete msg;
OnKillFocus(NULL);
// copyDataResult has value returned by other app


}
}
CEdit::OnSysKeyUp(nChar, nRepCnt, nFlags);
}

void CEditEx::OnKillFocus(CWnd* pNewWnd) 
{
HideCaret();
CEdit::OnKillFocus(pNewWnd);

// TODO: Add your message handler code here

}



C++">
#if !defined(AFX_EDITEX_H__259D60F0_8B5F_4E46_B6B3_F382C78A233A__INCLUDED_)
#define AFX_EDITEX_H__259D60F0_8B5F_4E46_B6B3_F382C78A233A__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// EditEx.h : header file
//

/////////////////////////////////////////////////////////////////////////////
// CEditEx window

class CEditEx : public CEdit
{
// Construction
public:
CEditEx();

// Attributes
public:

// Operations
public:

// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CEditEx)
//}}AFX_VIRTUAL

// Implementation
public:
virtual ~CEditEx();

// Generated message map functions
protected:
//{{AFX_MSG(CEditEx)
afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);
afx_msg void OnChange();
afx_msg void OnSysKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
afx_msg void OnSetFocus(CWnd* pOldWnd);
afx_msg void OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags);
afx_msg void OnSysKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags);
afx_msg void OnKillFocus(CWnd* pNewWnd);
//}}AFX_MSG

DECLARE_MESSAGE_MAP()
};

/////////////////////////////////////////////////////////////////////////////

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_EDITEX_H__259D60F0_8B5F_4E46_B6B3_F382C78A233A__INCLUDED_)


---华软网友回复---
  class="deleted_message"> 该回复于2011-01-10 15:57:36被版主删除        
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。