No.2
- 回答日時:
int X=0, Y=0; // 現在の出力座標のカーソル位置
以下のようなコードをcase WM_CREATE:内に記述してもらえば文字を文字列として扱えると思います、
hdc = GetDC(hwnd);//通常は、case WM_CREATE:に記述
sprintf(str, "%c", (char) wParam);
if((char)wParam == '\r')
//改行処理,他にも処理も必要ですが省略します、
{
Y += 11;
X = 0;
}else {
TextOut(hhdc, X, Y, str,strlen(str));
// 再描画用のHDCへ
TextOut(hdc, X, Y, str,strlen(str));
// ウィンドウに出力する
X += 11;
}
ReleaseDC(hwnd, hdc);
// case WM_DESTROY:等に書くべきですがここに
No.3
- 回答日時:
No,2で意見したものです、
先ほどのコートは、case WM_CHAR: に記述してください、
WM_CREATEに書くのは、間違いです。
この回答への補足
返答が遅れてしまって大変申し訳ありません。
教えていただいたコードを使っていろいろ試したのですがうまくいきません。自分の知識が足りないのはわかっているのですが、お手数ですが動くサンプルコードを教えていただけないでしょうか?お願いします。
No.4
- 回答日時:
inputの型が間違っているか、
画面の更新を行っていなくて確認ができてない可能性があります。
この場合はinputの型はTCHAR型の配列が適しています。
(宣言例) TCHAR input[ 256 ];
画面の更新はいろいろありますが、
InvalidateRect( hWnd, NULL, TRUE );
で可能です。
参考になりましたでしょうか。
この回答への補足
回答ありがとうございます。
ご指摘の通りにTCHAR型に変更したのですが上手くいきませんでした。
画面の更新についてはInvaidataRectですでに行なっており、入力文字が毎回変わって表示されるので問題はないかと思います。
今現在typingゲームに近いものを作っているのですが文字列入力ができなければ完成しないので困っています。
お手数ですがWM_CHARの中をここに書いたら見て問題点を指摘していただけないでしょうか?
No.5
- 回答日時:
//サンプルコードですので注意して使ってください
#include <windows.h>
#include <cstring>
#include <cstdio>
LRESULT CALLBACK WindowFunc(HWND, UINT, WPARAM, LPARAM);
char str[255]; // 出力される文字
int X=0, Y=0; // 現在の表示される位置
int max_X, max_H; // 画面のサイズ
HDC hhdc;
HBITMAP hbit;
HBRUSH hbrush;
int WINAPI WinMain(HINSTANCE hThisInst, HINSTANCE ,
LPSTR , int _int)
{
/* TranslateMessage(&msg); // 記入もれしていないということなのでここいらへんは省略します */
}
LRESULT CALLBACK WindowFunc(HWND hwnd, UINT message,
WPARAM wParam, LPARAM lParam)
{
static HDC hdc;
static PAINTSTRUCT ps;
switch(message) {
case WM_CREATE:
// 画面のサイズを取得する
max_X = GetSystemMetrics(SM_CXSCREEN);
max_H = GetSystemMetrics(SM_CYSCREEN);
hdc = GetDC(hwnd);
hhdc = CreateCompatibleDC(hdc);
hbit = CreateCompatibleBitmap(hdc, max_X, max_H);
SelectObject(hhdc, hbit);
hbrush = (HBRUSH) GetStockObject(WHITE_BRUSH);
SelectObject(hhdc, hbrush);
PatBlt(hhdc, 0, 0, max_X, max_H, PATCOPY);
ReleaseDC(hwnd, hdc);
break;
case WM_CHAR:
hdc = GetDC(hwnd);
sprintf(str, "%c", (char) wParam); // 文字を文字列にする
// 改行処理
if((char)wParam == '\r') {
Y += 11;
X = 0;
}
else {
TextOut(hhdc, X, Y, str,
strlen(str));
TextOut(hdc, X, Y, str,
strlen(str));
X += 11;
}
ReleaseDC(hwnd, hdc);
break;
case WM_PAINT: // 再描画とかでのメッセージ
hdc = BeginPaint(hwnd, &ps); // デバイスコンテキストを取得する
BitBlt(hdc, 0, 0, max_X, max_H, hhdc, 0, 0, SRCCOPY);
EndPaint(hwnd, &ps);
break;
case WM_DESTROY: // プログラムを終了する
DeleteDC(hhdc);
DeleteObject(hbit);
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, message, wParam, lParam);
}
return 0;
}
///////////////////
以上のコード(一部省略)で作業ウインドウにキーボードから文字の入力ができるとおもいます、
また、strcpy という関数で文字と文字の合成もできますよ。
大部分のコードを載せていただいてありがとうございます。
せっかく教えていただいたのに自分の勉強不足で上手く活用することができませんでした。
もっと学び教えていただいたコードを上手く用いたプログラムを作れるようにしたいと思います。
またよろしくお願いします。
No.6ベストアンサー
- 回答日時:
文字列の格納の仕方でしたか(^_^;)
それなら、
case WM_CHAR:
wsprintf( input, "%s%c", input, (int)wp );
break;
で出来ますよ。
(ただし、inputの配列をオーバーした時の処理はしていません)
あとは表示するときに
TCHAR buf[ 256 ];
wsprintf( buf, "入力=\"%s\"", input );
という様に表示用の変数で
表示を行えば完了です。
この回答への補足
一応文字列を入力できるようになりました。ありがとうございます。
ただ問題なのがWM_CHAR内で
・
・
・
wsprintf( input, "%s%c", input, (int)wp );
・
・
となるので文字列となる前に次の処理に行ってしまいます。
何か上手く処理する方法はないでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- Visual Basic(VBA) 【再投稿】VBAで動作しなくて困っています 2 2022/10/11 11:05
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# C++のcinの動作 5 2023/02/26 00:13
- C言語・C++・C# str[j++]の意味 2 2022/08/30 16:20
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- Java Javaの問題なのですが、「3文字以上の英数字文字列を入力し、文字列の中に文字(9)が出てくるまでの 1 2023/06/06 18:55
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Win32APIにて、ウィンドウ全体...
-
音量調節
-
C++のcase文の書き方
-
Win32APIでウィンドウを中央に...
-
トラックのループの仕方
-
LoadImageとSetCursorについて
-
C言語のfor文です。 繰り返しの...
-
2÷3などの余りについて
-
信頼区間の1.96や1.65ってどこ...
-
Enterキーを押されたら次の処理...
-
*をユーザーが入力した数字の数...
-
fgetsなどのときのstdinのバッ...
-
C言語で%を使わない余りの出し方
-
C言語
-
プログラムでの数字につく”f”の...
-
break文でループを一気に抜ける...
-
マイナスからプラスへ転じた時...
-
#define _CRT_SECURE_NO_WARNIN...
-
既定のコンストラクタがありま...
-
ある商品のロス率を5%見込み、...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エディットボックスの背景の色...
-
ダイアログプログラムでEnterキ...
-
C言語win32api、エディットボッ...
-
音量調節
-
エディットコントロール入力時...
-
プログラミングでエラーが出ま...
-
エラー Run-Time Check Failur...
-
キャレットの現在位置の表示 (W...
-
LoadImageとSetCursorについて
-
コンソールアプリケーションの...
-
画像を表示したいのですが……
-
ボタンの色(WINAPI)
-
COMPORTマルチスレッドで例外発生
-
C++のcase文の書き方
-
Win32APIでウィンドウを中央に...
-
PeekMessageについて
-
CTreeCtrlのCreate関数でエラー...
-
オーバーレイみたいな処理がしたい
-
この列挙体でsysjanの関数はあ...
-
DirectInputについて再
おすすめ情報