你好,
很抱歉,我在测试你所说的问题是否还有另外一种解决方案,所以没有能及时回复你的消息。
首先使用按钮来做这件事似乎是不可能的,按钮也是个CWnd类,算是一种另类的窗口,当你点击它,会使得窗口焦点发生改变,尽管你在按钮的点击事件中加入让窗口焦点集中在编辑框的代码,但有那么一瞬间窗口焦点依旧是会改变的,所以输入法的内容会被清空。
在仔细观察了OSK键盘和Tabtip键盘,我发现它们可能也不是拿的按钮来做按键。它们很有可能用三张图片来做出按钮一样的效果。例如底下图片中这样,分别为鼠标不放在上面,鼠标放在上面,鼠标点击三种情况的图片,来做出点击它跟点击按钮一样的动态效果。
回到你的问题,我更推荐你用图片代替按钮来做。下面我将展示程序中关键的代码及程序的实际运行结果。
//视图类头文件需要添加图片资源和编辑框控件
class CMFCApplication84View : public CView
{
public:
CEdit *edit;
int count = 0;
BITMAP bm;
}
//视图类.cpp文件
//鼠标移动的消息函数去判断鼠标是否在图片上
void CMFCApplication84View::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if (point.x < (300 + bm.bmWidth) && point.x > 300 && point.y > 0 && point.y < (0 + bm.bmHeight))
{
count = 1;
OnPaint();
}
else
{
count = 0;
OnPaint();
}
CView::OnMouseMove(nFlags, point);
}
//WM_PAINT消息里是绘制图片,根据计数的count来控制画什么图
void CMFCApplication84View::OnPaint()
{
//CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
// Do not call CView::OnPaint() for painting messages
CClientDC dc(this);
CBitmap Bitmap;
CDC MemDC;
if (count == 0)
Bitmap.LoadBitmap(IDB_BITMAP3);//将图片资源变为白底的1
else if (count == 1)
Bitmap.LoadBitmap(IDB_BITMAP2);//将图片资源变为灰底的1
else if (count == 2)
Bitmap.LoadBitmap(IDB_BITMAP1);//将图片资源变为蓝底的1
Bitmap.GetObject(sizeof(BITMAP), &bm);
MemDC.CreateCompatibleDC(&dc);
CBitmap *pOldBitmap = MemDC.SelectObject(&Bitmap);
dc.BitBlt(300, 0, bm.bmWidth, bm.bmHeight, &MemDC, 0, 0, SRCCOPY);
MemDC.SelectObject(pOldBitmap);
}
//WM_CREATE消息里完成控件和图片资源的初始化
int CMFCApplication84View::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
CBitmap Bitmap;
Bitmap.LoadBitmap(IDB_BITMAP3);
Bitmap.GetObject(sizeof(BITMAP), &bm);
edit = new CEdit;
edit->Create(WS_CHILD | WS_VISIBLE | WS_BORDER, CRect(300, 400, 600, 600), this, 10011);
edit->ShowWindow(SW_SHOW);
return 0;
}
//鼠标左键抬起消息里判断鼠标是否按在了图片上,可能用鼠标左键按下消息更好,
//因为有时候鼠标按下,然后移动出图片范围再抬起会导致程序运行不按设计的要求来。
void CMFCApplication84View::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if (point.x < (300 + bm.bmWidth) && point.x > 300 && point.y > 0 && point.y < (0 + bm.bmHeight))
{
count = 2;
OnPaint();
CEdit* pBtn = (CEdit*)GetDlgItem(10011);//必须进行强制类型转换
HWND hBtn = pBtn->GetSafeHwnd();
::SetFocus(hBtn);
//PostMessage(WM_KEYDOWN, 85, 85);
::keybd_event(85, 0, 0, 0);
::keybd_event(85, 0, KEYEVENTF_KEYUP, 0);
Sleep(100);
count = 1;
OnPaint();
}
CView::OnLButtonUp(nFlags, point);
}
下面演示一下程序效果:
实现软键盘会需要你准备很多材料,并且代码片段也很多,这对初学者可能有些困难。如果你想学习MFC,那么你可以从简单的做起,例如学习一下MFC的框架结构,这会帮助你更好地理解MFC的工作原理。
Best Regards,
Suarez Zhou