こんにちは、前に一度書いたものです。日数が経ってしまってすいませんでした。
今悩んでることを率直に聞いてみたいと思います。よろしくお願いします。
今SDI形式でタイピングソフトを作っているのですが、お題が表示され、その下に文字を書きこんでいくという画面でお題となる文字列を表示させるのは簡単なんですが、その下に直接文字を打ちこんでいくという作業がどうやっていいかわかりません。どんな関数を使っていいのかもわからないのでできれば詳しく教えてください。自分の中の考えでこの問題を解こうと考え付いたことはSDIからその画面だけダイアログを表示させてそこに入力させて、SDIにまた戻ってくるということなのですが、これが実現可能なのかとういことを今調べているのですが中々すすみません。そして、やはり文字列の直接入力はSDIでは難しいのでしょうか?

このQ&Aに関連する最新のQ&A

A 回答 (2件)

文字を描画するのは


DrawText()
DrawTextEx()
TextOut()
などのAPIを使えば大丈夫でしょう。
色、大きさ、フォントなどを変えたい場合はデバイスコンテキストの操作をする必要があります。ここで全部を書けるほど簡単な処理ではないので本屋さんなり図書館なり行って書籍を当たりましょう。
「Win32アニメーションプログラミング」や「Inside VisualC++」(ちょっと高いか)、「Inside Windows」当りがいいんじゃないでしょうか?

文字の取得は深く考えないならWM_CHARメッセージのハンドラで処理を書き、キーリピートの防止など、いろいろ細工を施すのであればWM_KEYUPやWM_KEYDOWNなどのハンドラで処理すれば大丈夫だと思います。
MFCベースで作られているのであればViewクラスのそれぞれのメッセージハンドラで引数として渡されてきます。

上記の方法では文字列ではなく押された文字やキーが帰るだけですので受け取った入力をもとに文字列に直す必要があります。
    • good
    • 0

あまり参考にはならないかも知れませんが、


同じようなことがあったので書きます。
1.エディットコントロールと同じようなものを自分で作ろうとしました.
2.イベントハンドラーのなかでキーイベントを取り出し処理しようとしたのですが、アルファベットの処理はできるのですが、漢字変換が上手くできません。
文字カーソル(キャレット)の場所を制御できなかったのです。
3.使っていたFEPはエイトクでした。
4.ジャストシステムのホームページにFEPを使って漢字変換するときに必要となる
DLLがあります。
5.このDLLを使えばできると思います。
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q文字列中からある文字列とある文字列の間にある文字列を取得

表題にあるとおり間の文字列をどうやって取得するべきかと悩んでいます・・
abcdefghijklmn・・・
となっているとき
bとe、aとkなど間の間隔が不定なときはどのようにして文字列を取得したらよいのでしょうか?
最初の2文字は与えられているとして考えています。
インターネットのURLで言うなら/から/までの間の文字列と言うことになります。
今私が考えているのは
strchrで位置のアドレスを取得してそこからfor文かwhile文で指定の2文字目が出るまでまわすのかなぁ・・と思っています。
ですが具体的にどのような感じに書けばいいのかがわかりません。どなたかご教授ください。

Aベストアンサー

2文字の間でいいのなら strchr() を2回使えばいいと思います。



char *p, *q;

if ((p = strchr(s, 'b')) != NULL) {
 if ((q = strchr(p + 1, 'e')) != NULL) {
  /* p + 1 ~ q - 1 が 'b' から 'e' の間の文字列 */
  size_t len = q - p - 1; /* これがバイト数 */
  printf("%-.*s\n", len, p + 1); /* 出力 */
 }
}

複数の文字の中のいずれかの文字が出現した所で区切りたいなら strpbrk() か strtok() を使えばいいと思います。

Q特定の文字列をcsvから探して、その文字列を含む行を読み込むには?

例えば以下のようなcsvファイルがあったとします。

ab1,ef2,ab3,af4,ab5
bb1,bf2,bb3,bf4
cb1,cf2,cb3,cf4,cb5
zb1,zf2,zb3,zf4,zb5


プログラムに"cb3"という文字列を探させて、その文字列を含む一行
"cb1,cf2,cb3,cf4,cb5"のみを読み込む方法を探しております。

何か良い方法がございましたら教えていただけませんでしょうか?
よろしくお願いします。

Aベストアンサー

http://oshiete1.goo.ne.jp/qa5709184.html
でやった、fgets + sscanf を使うもう一つの利点は、同じ行に対して複数の処理を行うときに楽、ということです。

文字列の中にある文字列が含まれているか調べるには、strstr関数を使用するか、同等の処理を自作します。
strstrを使用する場合は、#include <string.h>を追加してください。
探す文字列が日本語の場合は、文字コードにも注意してください。

実際の例としては、前回のプログラムに下の+で始まっている行を追加してみてください

while( fgets( buf,600, fp ) != NULL ) {
+/* "cb3"が含まれていなかったら、次のループへ */
+ if ( strstr( buf, "cb3" ) == NULL ) {
+ cotinue ;
+ }
ret = sscanf( buf, " %[^,],%[^,],%[^,],%[^,],%s", s, n1,n2,f1,f2 ) ;

http://oshiete1.goo.ne.jp/qa5709184.html
でやった、fgets + sscanf を使うもう一つの利点は、同じ行に対して複数の処理を行うときに楽、ということです。

文字列の中にある文字列が含まれているか調べるには、strstr関数を使用するか、同等の処理を自作します。
strstrを使用する場合は、#include <string.h>を追加してください。
探す文字列が日本語の場合は、文字コードにも注意してください。

実際の例としては、前回のプログラムに下の+で始まっている行を追加してみてください

while( fgets( ...続きを読む

QVC++.net SDIで追加したメニューを灰色から黒にする方法

VC++.net 2003 のSDIでプログラムを作っています。
新たにメニューを追加したのですが、実行しても文字が灰色になっており、選択することができません。

手元にある入門書には、フォームアプリケーションの場合は、新たに追加した「メニューをダブルクリックすると、コードエディタに切り替わり、Clickメソッドの枠組みが自動的に生成される」とあるのですが、私の場合、ダブルクリックしても何も起こりません。ネットで検索すると、VC++ ver.6 の情報ばかりで、VC++.net 2003の場合が、いまいちよくわかりません。

「この本に書いてある」という情報でも構わないのでよろしくお願いします。

Aベストアンサー

確信があるわけではありませんが・・・

アプリケーションを実行してメニューを
ダブルクリックしていませんか?
その場合、何も起こらなくて正解です(^^

きっとお手元の入門書にはリソースエディタの
メニューをダブルクリックすると・・・という
趣旨のことが書かれていると思います。

というわけでリソースエディタでメニューを
表示して、それをダブルクリックしてみてください。

QVC++、MFCでSDIでアプリ作成中

現在、VC++、MFCでSDIでアプリ作成中です。
アイコン上にファイル(txtファイル)をドラッグ&ドロップしてメモ帳を起動したいです。
ただ、ドロップされたファイルはうまく読み込めるのですが、そのファイルを開く(表示)することができません。

ドロップされたファイルは、C○○View.cppで

int C○○View::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;

// TODO: この位置に固有の作成用コードを追加してください
CStringArrayargv;
if( IsDropOnIcon( &argv, TRUE ) ){
inti;
for( i = 0; i < argv.GetCount(); i++ ){
MessageBox( argv[ i ], "ドロップされたファイルは", MB_OK );
Read(argv[i]);
}
}
}

BOOL C○○View::IsDropOnIcon( CStringArray* argv, BOOL acceptFolder )
{
CStringcmdlin = "";
CStringresToken;
char*p;
intstartnum = 0;

p = AfxGetApp()->m_lpCmdLine;
if( strlen( p ) == 0 || p[ 0 ] == '-')
return FALSE;

cmdlin = p;

resToken= cmdlin.Tokenize( "\"", startnum );
while( resToken != "" ){
if( resToken != " " && IsExist( resToken, acceptFolder ) )
argv->Add( resToken );
resToken= cmdlin.Tokenize( "\"", startnum );
};
return TRUE;
}

/* 引数で貰った文字列がファイルかどうかをチェック */
BOOL C○○View::IsExist( CString filepath, BOOL acceptFolder)
{
CFilefp;

if( fp.Open( filepath, CFile::modeRead ) ){
fp.Close();
return TRUE;
}
return FALSE;
}

のargv[i]で取得しています。

これが、Read(arg[i])でうまく読み込めません。
ちなみにRead(CString filename)は正しく動くことは確認済みです。
Read(arg[i])を入れる場所がOnCreateがいけないとは思うのですが、どのタイミングで
読み込めばいいかがわかりません。
どなたか教えて頂けないでしょうか?

現在、VC++、MFCでSDIでアプリ作成中です。
アイコン上にファイル(txtファイル)をドラッグ&ドロップしてメモ帳を起動したいです。
ただ、ドロップされたファイルはうまく読み込めるのですが、そのファイルを開く(表示)することができません。

ドロップされたファイルは、C○○View.cppで

int C○○View::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;

// TODO: この位置に固有の作成用コードを追加してください
CStringArrayargv;
if( IsDropOnI...続きを読む

Aベストアンサー

InitInstance SDI コマンドライン
でググってみてはいかがでしょうか

Qread()で読みこんだ文字列の比較について

実行環境はLinuxで、ディストリビューションはturboLinuxです。


strcmpで文字列の比較ができるのですが、何故かreadで読み込んだ文字列は比較できません。
何故なのでしょうか。ちなみにコードは下です

read(sock_ipadrc,&Buf,sizeof(Buf));

if(!strcmp("GETADR",Buf)){

printf("等しい");

}

Aベストアンサー

コードを拝見しました。2点程問題があるようです。

(1) read() の fd に相当する変数名が sock_ipadrc となっていますが、ソケットの場合、ファイルと違って必ず sizeof(Buf) 分読めるとは限りませんので(読める場合もあるので、コードは正しいと思い込まないようにしてください))、sizeof(Buf) に満たなかった場合、再度読み込むというような処理が必要です。

(2) で、Buf に sizeof(Buf) 分読み込めたとして、以下のようにすれば strncmp() を使えば、最後の '?0' を気にしなくても大丈夫です。

if( !strncmp( "GETADR", Buf, strlen( "GETADR" ) ) {
...
}


人気Q&Aランキング

おすすめ情報