更新时间:2016-01-05 17:39:26浏览次数:1+次
我们的程序的执行效果图如下:
整体来分析一下,我们要达到的效果是:我们的输入使用单行模式。Home回到开头,End回到结尾,PageUp向前移动10个字,PageDown向后移动10个字。键盘光标↑和←可以向左移动一个位置,光标→和↓可以向右移动一个位置。随时输入文字,可以通过指定的光标方向键和其他几个按键来移动光标,然后可以覆盖光标所在的位置的文字,这样实现修改的效果。同时,我们要实时提示当前光标所在的位置的文字。
所以,整体上分为三个部分,即:输入文字、移动光标和显示文字。
输入文字就是将光标所在的位置的数组元素赋值当前按键的字符即可。很简单是吧。当然,修改时的覆盖,还是在光标所在的位置的数组元素中赋值一个字符。所以是一样的。当然,输入一个文字后,自然要将光标的位置右移一个。既然如此,我们就可以轻松的实现这个简单的功能。为了能够在输入文字后立马显示出来,所以要让客户区无效且使客户区的背景擦除。输入文字在WM_CHAR消息中处理。
case WM_CHAR:
{
TCHAR ch=wParam;
txt[iPosInput]=ch;
iPosInput++;
}
InvalidateRect(hwnd,NULL,TRUE);
return 0;
移动光标则更加简单。因为移动光标只是对当前光标的位置进行计算即可。所以,在WM_KEYDOWN消息中,将wParam参数中附带的虚拟键码对比一下,然后更新一下光标的位置即可。按照我们的上面的定义,方向键的步长为一个字符,即向左向右只移动一个字符。PageUp、PageDown则移动10个字符,Home和End则分别移动到字符串的开始和结束位置的后一个位置。
#include "windows.h"
#include <tchar.h>
#define MAX 1024
static TCHAR cjjjs1[]=_T("提示1:Home回到开头,End回到结尾,PageUp向前移动10个字,PageDown向后移动10个字");
static TCHAR cjjjs2[]=_T("提示2:键盘光标↑和←可以向左移动一个位置,光标→和↓可以向右移动一个位置");
TCHAR txt[MAX]=_T("");
TCHAR tip[100]=_T("");
// - 项目是Unicode字符集
LRESULT CALLBACK WinProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
static int iPosInput=0;
switch (message)
{
case WM_PAINT:
{
hdc = BeginPaint(hwnd,&ps);
//设置等宽字体
SelectObject(hdc,GetStockObject(SYSTEM_FIXED_FONT));
//当前光标位置的字符
wsprintf(tip,_T("当前光标所在的字符:%c"),txt[iPosInput?iPosInput-1:0]);
TextOut(hdc,0,170,tip,lstrlen(tip));
//提示
TextOut(hdc,0,150,cjjjs1,lstrlen(cjjjs1));
TextOut(hdc,0,130,cjjjs2,lstrlen(cjjjs2));
//输出文字内容
TextOut(hdc,0,0,txt,lstrlen(txt));
EndPaint(hwnd,&ps);
}
return 0;
case WM_KEYDOWN:
{
//默认直接覆盖
switch(wParam)
{
case VK_UP://左移一个字
case VK_LEFT:
iPosInput+=-1;
break;
case VK_RIGHT://右移一个字
case VK_DOWN:
iPosInput+=1;
break;
case VK_PRIOR://Page Up键,左移10个字
iPosInput+=-10;
break;
case VK_NEXT://Page Down键,右移10个字
iPosInput+=10;
break;
case VK_HOME://Home键,移动开头
iPosInput=0;
break;
case VK_END://End键,移到结尾最后一个字符位置
iPosInput=lstrlen(txt);
break;
default:
break;
}
//规整文字输入的位置,以免溢出
if (iPosInput<0)
iPosInput=0;
else if (iPosInput>lstrlen(txt))
iPosInput=lstrlen(txt);
else if(iPosInput>MAX)
iPosInput=MAX;
}
InvalidateRect(hwnd,NULL,TRUE);
return 0;
case WM_CHAR:
{
TCHAR ch=wParam;
txt[iPosInput]=ch;
iPosInput++;
}
InvalidateRect(hwnd,NULL,TRUE);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
default:
break;//跳出到默认处理
}
return DefWindowProc(hwnd, message, wParam, lParam);
}
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrev,LPSTR lpCmd,int iShow)
{
TCHAR ClassName[] = _T("MyClass");
TCHAR title1[] = _T("C++技术网http://www.cjjjs.com");
WNDCLASS wndClass;
wndClass.cbClsExtra=0;
wndClass.cbWndExtra=0;
wndClass.hbrBackground= (HBRUSH)GetStockObject(WHITE_BRUSH);
wndClass.hCursor=LoadCursor(NULL,IDC_HAND);
wndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wndClass.hInstance = hInstance;
wndClass.lpfnWndProc = WinProc;
wndClass.lpszClassName = ClassName;
wndClass.lpszMenuName=NULL;
wndClass.style=CS_HREDRAW|CS_VREDRAW;
if(!RegisterClass(&wndClass))return 0;
HWND hwnd = CreateWindow(ClassName,title1,WS_OVERLAPPEDWINDOW,0,0,650,400,NULL,NULL,hInstance,NULL);
ShowWindow(hwnd,SW_SHOWNORMAL);
MSG msg;
while (GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
相关资讯