C语言开发软键盘程序,实现一个软键盘,使得软键盘也能中文输入

你好,

很抱歉,我在测试你所说的问题是否还有另外一种解决方案,所以没有能及时回复你的消息。

首先使用按钮来做这件事似乎是不可能的,按钮也是个CWnd类,算是一种另类的窗口,当你点击它,会使得窗口焦点发生改变,尽管你在按钮的点击事件中加入让窗口焦点集中在编辑框的代码,但有那么一瞬间窗口焦点依旧是会改变的,所以输入法的内容会被清空。

在仔细观察了OSK键盘和Tabtip键盘,我发现它们可能也不是拿的按钮来做按键。它们很有可能用三张图片来做出按钮一样的效果。例如底下图片中这样,分别为鼠标不放在上面,鼠标放在上面,鼠标点击三种情况的图片,来做出点击它跟点击按钮一样的动态效果。

ecd35ba52c71303eef906c59c8d06b29.png          

fffa7c5e875414a15fc2635ad139e22b.png       

12591780189b2a7496da7fd242cb39fa.png

回到你的问题,我更推荐你用图片代替按钮来做。下面我将展示程序中关键的代码及程序的实际运行结果。

//视图类头文件需要添加图片资源和编辑框控件

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);

}

下面演示一下程序效果:

a33ca62a45a14af06fd2ac2e76d0ec37.gif

实现软键盘会需要你准备很多材料,并且代码片段也很多,这对初学者可能有些困难。如果你想学习MFC,那么你可以从简单的做起,例如学习一下MFC的框架结构,这会帮助你更好地理解MFC的工作原理。

Best Regards,

Suarez Zhou

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值