| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 447 人关注过本帖, 1 人收藏
标题:问个键盘控制和文件操作的问题
只看楼主 加入收藏
zyftank
Rank: 2
等 级:论坛游民
帖 子:5
专家分:13
注 册:2013-7-19
结帖率:0
收藏(1)
已结贴  问题点数:20 回复次数:3 
问个键盘控制和文件操作的问题
题目要求:从文件读一行文本,当按下DEL键时,从行首删除一个字符,当按下Backspace键时,从行尾删除一个字符。我的设想是按下按键时,直接删除文件中的字符。
以下是我写的代码,为什么只有一个键能起作用,且删除行尾字符,必须按两次才行;case VK_DELETE和 case VK_BACK谁放上面,就能实现哪个键的操作,盼指点下。
#include<afx.h>
#include <windows.h>
#include<iostream>
#include<fstream>
#include<stdlib.h>
#include<string>
using namespace std; int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int);
LRESULT CALLBACK WndProc( HWND,UINT, WPARAM,LPARAM);
void erasefirst();
void eraseend(); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    WNDCLASSEX wcex;
    wcex.cbSize = sizeof(WNDCLASSEX);
    wcex.style = CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS;
    wcex.lpfnWndProc = (WNDPROC)WndProc;
    wcex.cbClsExtra = 0;
    wcex.cbWndExtra = 0;
    wcex.hInstance = hInstance;
    wcex.hIcon= LoadIcon(NULL, (LPCTSTR)IDI_APPLICATION);
    wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName = NULL;
    wcex.lpszClassName = "SeeKeyMessage";
    wcex.hIconSm = LoadIcon(NULL,(LPCTSTR)IDI_APPLICATION);
    if(!RegisterClassEx(&wcex))//
        return FALSE;
    int SW_XFS = GetSystemMetrics(SM_CXSCREEN);//获取屏幕横向的像素尺寸
    int SW_YFS = GetSystemMetrics(SM_CYSCREEN);
    HWND hWnd;
    hWnd = CreateWindowEx(WS_EX_CLIENTEDGE,
       "SeeKeyMessage",
       "键盘控制输出",
       WS_OVERLAPPEDWINDOW,
       100, 200, 800, 300,
       NULL,
       NULL,
       hInstance,
       NULL);
       if(!hWnd)
        return FALSE;
       ShowWindow(hWnd, nCmdShow);
       UpdateWindow(hWnd);
 if(!hWnd)
  return FALSE;
 ShowWindow(hWnd, nCmdShow);
 UpdateWindow(hWnd);
 MSG msg;
 while(GetMessage(&msg, NULL, 0, 0))
 {
  TranslateMessage(&msg);
  DispatchMessage(&msg);
 }
 
 return msg.wParam;
} LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    HDC hDC;
    PAINTSTRUCT ps;
 int i;
 char buffer[40];
    CStdioFile cf("test.txt",CFile::modeRead);
    cf.ReadString(buffer,40);
    cf.Close();
 switch(message)
 {
    case WM_KEYDOWN:
  switch(wParam)
  case VK_BACK:
   eraseend(); //调用删除最后一个字符函数
       break;
  case VK_DELETE:
   erasefirst();//调用删除第一个字符函数
   break;   
    case WM_KEYUP:
     InvalidateRect(hWnd,NULL,TRUE);
  break;
    case WM_PAINT:
  hDC = BeginPaint(hWnd,&ps);  
  for(i=0;i<strlen(buffer)/2;i++)
  {
   TextOut(hDC,20+30*i,20,&buffer[2*i],2);
  }
  EndPaint(hWnd,&ps);
  break;
    case WM_DESTROY:
    PostQuitMessage(0);
    break;
    default:
  return DefWindowProc(hWnd,message,wParam,lParam);
 }
    return 0;
}
void erasefirst()//删除第一个字符函数
{
    string s;
 ifstream in("test.txt");
 if(getline(in,s))
 s.erase(0,2);
 in.close();
 DeleteFile("test.txt");
 ofstream out("test.txt");
 out<<s;
 out.close();
}
void eraseend()//删除文件最后一个字符函数
{
    string s;
 ifstream in("test.txt");
 if(getline(in,s))
 s.erase(s.end()-1);
 in.close();
 DeleteFile("test.txt");
 ofstream out("test.txt");
 out<<s;
 out.close();
}
搜索更多相关主题的帖子: include 键盘 
2013-07-19 19:48
zyftank
Rank: 2
等 级:论坛游民
帖 子:5
专家分:13
注 册:2013-7-19
收藏
得分:0 
问题已解决
2013-07-20 10:20
岁月如刀
Rank: 6Rank: 6
来 自:冰冻星球
等 级:侠之大者
威 望:7
帖 子:165
专家分:477
注 册:2013-7-21
收藏
得分:20 
Great!

U really did a good job.

Now. Game over.
2013-07-22 00:12
岁月如刀
Rank: 6Rank: 6
来 自:冰冻星球
等 级:侠之大者
威 望:7
帖 子:165
专家分:477
注 册:2013-7-21
收藏
得分:0 
But what's the problem? How to resolve it?

Now. Game over.
2013-07-22 00:12
快速回复:问个键盘控制和文件操作的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019786 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved