2012-03-10 35 views
0

对于我的信息学研究,我必须使用Windows API编写Space Invaders Clone。Win 32 API Textinput

我们的任务之一是编写并显示出效果良好的Highscore列表。 如果你失去了所有学分,你应该可以将你的名字写入高分榜(如果你有足够的分数)。 Windows API不太可能获得文本输入,因此我编写了一个自己的版本,但不符合我的要求。 我使用pName编写名称并将其保存到名为“Name”的数组中。 此数组用于将Highscore和名称一起保存到Highscore.txt中。 到目前为止,保存进度工作正常。

但我现在的问题是: 我能写信,但他们自动排序。 所以,如果我输入:asdf 它是排序︰adfs

我看不到任何代码做这样的事情,所以我的错?

谢谢你们! 电贺在Windows迈克尔

bool HighScore::EnterName(HDC hdc) 
{ 

    #define VK_A 0x41 
    #define VK_B 0x42 
    #define VK_C 0x43 
    #define VK_D 0x44 
    #define VK_E 0x45 
    #define VK_F 0x46 
    #define VK_G 0x47 
    #define VK_H 0x48 
    #define VK_I 0x49 
    #define VK_J 0x4A 
    #define VK_K 0x4B 
    #define VK_L 0x4C 
    #define VK_M 0x4D 
    #define VK_N 0x4E 
    #define VK_O 0x4F 
    #define VK_P 0x50 
    #define VK_Q 0x51 
    #define VK_R 0x52 
    #define VK_S 0x53 
    #define VK_T 0x54 
    #define VK_U 0x55 
    #define VK_V 0x56 
    #define VK_W 0x57 
    #define VK_X 0x58 
    #define VK_Y 0x59 
    #define VK_Z 0x5A 


     string pName; 

      if(GetKeyState(VK_A)) pName.append("A"); if(GetKeyState(VK_B)) pName.append("B"); 
      if(GetKeyState(VK_C)) pName.append("C"); if(GetKeyState(VK_D)) pName.append("D"); 
      if(GetKeyState(VK_E)) pName.append("E"); if(GetKeyState(VK_F)) pName.append("F"); 
      if(GetKeyState(VK_G)) pName.append("G"); if(GetKeyState(VK_H)) pName.append("H"); 
      if(GetKeyState(VK_I)) pName.append("I"); if(GetKeyState(VK_J)) pName.append("J"); 
      if(GetKeyState(VK_K)) pName.append("K"); if(GetKeyState(VK_L)) pName.append("L"); 
      if(GetKeyState(VK_M)) pName.append("M"); if(GetKeyState(VK_N)) pName.append("N"); 
      if(GetKeyState(VK_O)) pName.append("O"); if(GetKeyState(VK_P)) pName.append("P"); 
      if(GetKeyState(VK_Q)) pName.append("Q"); if(GetKeyState(VK_R)) pName.append("R"); 
      if(GetKeyState(VK_S)) pName.append("S"); if(GetKeyState(VK_T)) pName.append("T"); 
      if(GetKeyState(VK_U)) pName.append("U"); if(GetKeyState(VK_V)) pName.append("V"); 
      if(GetKeyState(VK_W)) pName.append("W"); if(GetKeyState(VK_X)) pName.append("X"); 
      if(GetKeyState(VK_Y)) pName.append("Y"); if(GetKeyState(VK_Z)) pName.append("Z"); 

      TextOut(hdc, 20, 200, "TRAGE DEINEN NAMEN EIN",22); 

      if(GetAsyncKeyState(VK_BACK)) pName.erase(pName.begin() + pName.length()-1); 

      sprintf(Name,"%s", pName.c_str()); 
      TextOut(hdc, 50,250,Name, strlen(Name)); 

      return true; 
} 
+1

这是一个命令行应用程序或GUI应用程序? – 2012-03-10 22:11:09

+0

这是一个GUI应用程序,而不是控制台。 Sry,我在我的描述中忘记了 – 2012-03-10 23:50:07

+1

GetKeyState不仅仅是错误的功能,你称它为错误的。 – 2012-03-11 00:55:07

回答

0

我发现一个很简单的灵魂。 我犯了一个大错,我在编程几个小时后看不到: 我再次从头开始我的字符串pName ang。所以我把它移到我的构造函数中,现在一切正常。 为了获得更好的感觉,你必须改变

(GetKeyState(VK_LETTER))

(HIWORD(GetAsyncKeyState(VK_LETTER))) 

现在它的效果要好得多!

4

通常文本输入与编辑控件,它允许用户输入到编辑控件来完成。要获取控件的内容,请使用编辑控件的HWND中传递的GetWindowText API。

1

忘掉GetKeyState

如果您正在进行所有自定义渲染,请处理WM_CHAR消息。

如果你可以使用小部件(子窗口),那么编辑控制拉里建议将是最好的。