2012-03-10 9 views
0

私のインフォマティクス研究では、Windows APIを使用してSpace Invaders Cloneを作成する必要があります。Win 32 API Textinput

私たちの仕事の1つは、非常にうまくいくハイスコアリストを作成して表示することです。 すべてのクレジットを失った場合は、得点が十分ある場合は、最高得点リストに自分の名前を書くことができます。 Windows APIにはテキスト入力がありませんので、私が望むとおりに動作する独自のバージョンを作成しました。 私はpNameを使って名前を書き、それを "名前"という配列に保存します。 この配列は、ハイスコアと名前を一緒に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アプリですか? –

+0

これはコンソールではなくGUIアプリケーションです。 Sry、私は私の記述でそれを忘れてしまった –

+1

GetKeyStateが間違った関数であるだけでなく、あなたはそれを間違って呼んでいるだけでなく、 –

答えて

0

私はかなり簡単だった魂を見つけました。 私は数時間のプログラミングの後で見ることができなかった大きな失敗をしました: 私は最初から私の文字列pNameをもう一度開始します。だから私はそれを私のコンストラクタに移しました、そして今、それはすべて正常に動作します。 がより良い感覚を得るために、あなたは今、それがはるかに良い作品

(GetKeyState(VK_LETTER))

(HIWORD(GetAsyncKeyState(VK_LETTER))) 

を変更する必要があります!

4

通常のテキスト入力は、ユーザーがエディットコントロールに入力することができますエディットコントロール、で行われる挨拶します。コントロールの内容を取得するには、GetWindowText APIをエディットコントロールのHWNDに渡します。

1

GetKeyStateを忘れてください。

すべてのカスタムレンダリングを行っている場合は、WM_CHARメッセージを処理します。

ウィジェット(子ウィンドウ)を使用できる場合は、Larryが提案するEDITコントロールが最適です。

関連する問題