• ベストアンサー

MFCでプログラミングしたことがなく、皆目わからず、途方に暮れております。

開発言語はVC++2005です。 Cは構文程度は理解しています。 新規作成 - プロジェクト - MFCアプリケーションという具合にすると、フレームワークを作ってくれますので、実行すると何もしないアプリができます。 MFCでプログラミングしたことがなく、どこにどうコードを埋め込んで行けば動作するのか皆目わからず、途方に暮れております。 手始めに、以下の3つをやってみたいのですが、MFCの肝はなんでしょうか? 1. ボタンを押して、「Hellow World」メッセージボックスを表示させたい。 2.マウスで、ある領域をクリックすると、小さい円を描画する。 3. テキスト入力域に 「Yes We Can!」を入力しエンターすると、オバマ大統領のBMP画像を中央に表示させたい。 3はギャグですが、よくよくソケットを使って簡単なメールアプリを作りたいと思っています。 道筋を指南してくださる方、よろしくお願いいたします。

  • roox2
  • お礼率1% (1/79)

質問者が選んだベストアンサー

  • ベストアンサー
  • MrBan
  • ベストアンサー率53% (331/615)
回答No.1

> MFCの肝はなんでしょうか? 「イベントドリブンなGUI」という考え方と、 「Win32(MFCの中で使われるWindowsのAPI)」および「C++」の使い方でしょうか。 標準Cとは作法が違いますし、構文レベルではない応用、考え方・使い方の問題なので、 そこが分からないと途方にくれても仕方ないです。 > 1. ボタンを押して、「Hellow World」メッセージボックスを表示させたい。 リソースエディタでボタンを作り、ボタンのハンドラを登録する。 後は表示の仕方次第ですが、お手軽なのはMessageBoxの利用? 画面描画するなら、状態フラグなどを立ててOnDrawで描画。 > 2.マウスで、ある領域をクリックすると、小さい円を描画する。 WM_LBUTTONUPあたりのハンドラを作ってそこで描画位置を決める。 (※Windowsのお約束では、マウスは押した位置より離した位置で反応します) 後は、OnDrawで描画。 > 3. テキスト入力域に 「Yes We Can!」を入力しエンターすると、オバマ大統領のBMP画像を中央に表示させたい。 テキスト入力域(Editのこと?)をリソースエディタで追加して… 入力ボタン等がないとするならばPreTranslateMessageあたりでENTERをハンドリングして、描画状態フラグを変更する感じでしょうか。 後はコントロールのイメージを差し替えるなり、CImageあたりをOnDrawでBitBltするなり…。

その他の回答 (3)

  • sho1get
  • ベストアンサー率57% (20/35)
回答No.4

もし、ネットワークアプリを作成されるのであれば、この本がいいと思います。 「WinSock2プログラミング 改訂第2版」 http://winsock2.org/ C言語やC++によるプログラミング方法をサンプルなどを記載して詳しく解説されています。 中にはMFCを使用したアプリケーションのコードもあるので、一度目を通してみると良いでしょう。

  • BLK314
  • ベストアンサー率55% (84/152)
回答No.3

MFC用のチュートリアルがあります http://msdn.microsoft.com/ja-jp/library/f35t8fts.aspx まずは、ここからでしょう マウスでの"お絵かき"プログラムです。 これで基本的なことを学べると思います。

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.2

MFCはWindowsAPIをC++言語のクラスでラッピングしたライブラリです。WindowsAPI自体はC言語の文法で操れるんですが、MFCはC++言語を理解していないとまともに使いこなせません。 方法としては、 (1)MFCを止めてWindowsAPIを直接使う。 http://www.geocities.jp/ky_webid/win32c/index.html http://wisdom.sakura.ne.jp/system/winapi/index.html [Windows SDK編] http://www.kumei.ne.jp/c_lang/ 弱点は、ウィンドウのデザインが楽に出来ない。 (2)C++言語を覚える。 C++言語を覚えた上で、MFCに再チャレンジするのがお勧めです。 MFC入門サイトは知らないので、全部テクニックサイトですが。 http://athomejp.com/goldfish/mfc/ http://www.crimson-systems.com/tips/index.html http://www.g-ishihara.com/ http://www.alpha-net.ne.jp/users2/uk413/vc/index.html ちなみに、VC++6等で書かれていて古いので最新環境ではメニューの操作方法が違います。 MFCの入門書は別購入してください。 http://www.amazon.co.jp/%E3%81%B2%E3%81%A8%E7%9B%AE%E3%81%A7%E3%82%8F%E3%81%8B%E3%82%8BMicrosoft-Visual-C-2005%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E9%96%8B%E7%99%BA%E5%85%A5%E9%96%80-%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E3%82%BD%E3%83%95%E3%83%88%E5%85%AC%E5%BC%8F%E8%A7%A3%E8%AA%AC%E6%9B%B8/dp/4891005084 弱点は、C++を覚えないといけない。

関連するQ&A

  • MFC XPでのTextOutのボヤケについて

    はじめまして。 質問させてください。 CImageを使用して OnPaint( )でBMP画像を描画するアプリを作成しております。 仕様といたしまして ダイアログのDC部にBMPを全体に描画して RGB( 255, 255, 255 )を透明化(背景が完全に見える)する ようにしております。 OnInitDialog( )で透過、透明処理をしています。 OnPaint( )で PaintDC PDC; //背景を透過 PDC.SetBkMode( TRANSPARENT ); PDC.SetTextColor( RGB( 255, 0, 0 ) ); PDC.SetBkColor( RGB( 255, 255, 255 ) ); PDC.TextOutW( 100, 100, _T( "TEST" ) ); 上記のように実装して、EXEで実行して確認しますと Windows2000の場合、正常に文字(TEST)が赤字で描画されるのですが WindowsXPの場合、赤字で描画されるのですが文字の周りがぼやけてしまいます。 イメージとしては文字描画部分が 2000の場合、BMP表示 XPの場合、JPG表示 のようになります。 これは仕様なのでしょうか? それとも何かコードレベルで解決できるのでしょうか? お詳しい方がおりましたらご教授お願いいたします。 よろしくお願いいたします。

  • MFCプログラミング

    MFCのダブルバッファリングを用いて画面を切り替えるプログラムを作ったのですが 画面がちらついてしまいます、どう修正すればよいか教えてください // CgraphView 描画 void CgraphView::OnDraw(CDC* pDC) { CgraphDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; // TODO: この場所にネイティブ データ用の描画コードを追加します。 CRect myRect; GetClientRect(myRect); if(background_color == 0) pDC->FillSolidRect(myRect, RGB(255, 255, 255)); else if(background_color == 1) pDC->FillSolidRect(myRect, RGB(153, 204, 255)); else pDC->FillSolidRect(myRect, RGB(255, 153, 204)); //ダブルバッファに関するコード CRect rc; GetClientRect(&rc); bkDC.CreateCompatibleDC(pDC); bkBMP.CreateCompatibleBitmap(pDC, rc.right, rc.bottom); CBitmap Bitmap, *pOldBitmap; pOldBitmap = bkDC.SelectObject(&bkBMP); //これから、すべての描画は、裏画面bkDCにおいて行う bkDC.FillSolidRect(rc, RGB(255, 255, 255)); int x, y, sx, sy; if(draw_state == 0) { bkDC.SetTextColor(RGB(0, 0, 0)); bkDC.TextOut(400, 500, _T("Start")); sx = 128;//表示するビットマップの横の大きさ sy = 128;//表示するビットマップの縦の大きさ y = 300;//表示するビットマップの左上の頂点のy座標 x = 50; draw_school(x, y, sx, sy); x = 200; draw_health(x, y, sx, sy); x = 350; draw_environment(x, y, sx, sy); } else if(draw_state == 1) { CRect myRect; GetClientRect(myRect); pDC->FillSolidRect(myRect, RGB(255, 255, 255)); } //裏画面bkDCにおいて、すべての描画を行った後 //裏画面を表画面に送る pDC->BitBlt(0, 0, rc.right, rc.bottom, &bkDC, 0, 0, SRCCOPY); bkDC.SelectObject(pOldBitmap); //裏画面を消去 bkBMP.DeleteObject(); bkDC.DeleteDC(); void CgraphView::OnInitialUpdate() { CView::OnInitialUpdate(); // TODO: ここに特定なコードを追加するか、もしくは基本クラスを呼び出してください。 bitmap[0].LoadBitmap(IDB_BITMAP1); bitmap[1].LoadBitmap(IDB_BITMAP2); bitmap[2].LoadBitmap(IDB_BITMAP3); bitmap[3].LoadBitmap(IDB_BITMAP4); bitmap[4].LoadBitmap(IDB_BITMAP5); bitmap[5].LoadBitmap(IDB_BITMAP6); Bmp_ID = 0; //タイマーをスタート SetTimer(ID_BITMAP, TIMER_MS_BITMAP, NULL); //画面再描画のタイマーをスタートする SetTimer(ID_REDRAW, TIMER_MS_FPS, NULL); Bmp_ID = 0; } void CgraphView::OnTimer(UINT_PTR nIDEvent) { // TODO: ここにメッセージ ハンドラ コードを追加するか、既定の処理を呼び出します。 if(nIDEvent == ID_BITMAP) Bmp_ID = (Bmp_ID+1) % 2; if(nIDEvent == ID_REDRAW) InvalidateRect(NULL, FALSE); CView::OnTimer(nIDEvent); } void CgraphView::OnDestroy() { CView::OnDestroy(); // TODO: ここにメッセージ ハンドラ コードを追加します。 KillTimer(ID_BITMAP); KillTimer(ID_REDRAW); } void CgraphView::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: ここにメッセージ ハンドラ コードを追加するか、既定の処理を呼び出します。 mouse_x = point.x; mouse_y = point.y; if(draw_state == 0) { if(mouse_x > 400 && mouse_y > 500) { draw_state = 1; } } CView::OnLButtonDown(nFlags, point); } BOOL CgraphView::OnEraseBkgnd(CDC* pDC) { // TODO: ここにメッセージ ハンドラ コードを追加するか、既定の処理を呼び出します。 return TRUE; //return CView::OnEraseBkgnd(pDC); }

  • PHPのアプリについて

    PHPなどを利用して、ある単語でツイッターを検索し、データベースに登録している単語の中から、検索したコメント内の検索の単語とは違う別の単語を表示させる方法はありますか? 例 アプリを使い「アメリカ」で検索、検索された結果の中からコメント内に「オバマ」と記載されていたら「オバマ」と表示される。 ユーザーはアプリをクリックするだけで、「オバマ」や「クリントン」と表示される。 例えば「アメリカの歴代民主党大統領が分かるアプリ」というイメージです。

    • 締切済み
    • PHP
  • MFCで株価チャートソフトを作りたい

    株価のチャートを表示するソフトを、MFCアプリで作ろうとしています。 チャートを表示して、マウスをウィンドウ内で動かすと十字カーソルが動いて、 現在ポイントしている場所の株価が表示されるようにしたいと思っています。 そこで十字カーソルの表示の処理をどのように実現したらいいか分かりません。 簡単に思いつく方法では、ビュークラスのOnDraw関数の中にチャートと十字カーソルを 一緒に描く(デバイスコンテキストに描き込む)ようにして、さらにWM_MOUSEMOVEイベント が発生するたびにRedrawWindow()してチャートと十字カーソルを一緒に再描画する、 という方法で試したのですが、マウスを移動(カーソルを動かす)のたびに、 チャートごと再描画するために画面がチカチカして見栄えが悪くなってしまいます。 チカチカしないように十字カーソルだけ動くように見せるには どのようなコードを書けば良いでしょうか?

  • ダイアログでの再描画

    こんばんわ。 ダイアログに2つBMPが表示されているとします。 説明上、AとBとします。 なんらかの処理後、 Aを表示したまま。 Bを表示されないよう消去したいのです。 コントロールを指定して描画をできないものでしょうか? 現在、 Invalidate(FALSE); GetDlgItem(IDCxxx)->Invalidate(TRUE); と、AもBも消去されないように残した後、 Bだけ再描画させて表示しないようにさせたのですが、 うまく動きません・・・。 宜しくお願いします。 Win98、VC++6.0、MFCで作成してます。

  • MFCでウィンドウ枠をアニメーションさせたい

    こんにちは、VC++初心者です。 今MFCでデスクトップマスコットを作りたいと思っています。 MFCのSDIアプリでとりあえず作成している最中で、 BMP画像の表示はC***ViewクラスのOnDraw関数で表示させています。 問題はウィンドウ枠です。 スタイル指定をWS_POPUPにして、クライアント領域にのみ表示させていますが、 リージョンを使って、BMP画像を切り取った形のウィンドウにするのにてこずっています。 ちうか、そもそもOnDraw関数内でBMP表示とともに行っている、 SetWindowRgn関数がうまく動いてくれていない状態です(泣)。 ソースの一部をのせておきますで、どうかご判断ください。 宜しくお願いします。 CTestView::CTestView() { //コンストラクタでビットマップの読み込みとリージョンの設定 gazou.LoadBitmap( IDB_GAZOU); //CBitmapのメンバ変数 m_rgn[0].CreateEllipticRgn(0, 0, 48,48); //CRgnのメンバ変数1 m_rgn[1].CreateRectRgn(0, 0, 48,48); //CRgnのメンバ変数1 } void CTestView::OnDraw(CDC* pDC) { //画像表示及びリージョンの切り替え 中略... static int anim = 0; CDC dc; dc.CreateCompatibleDC( pDC); dc.SelectObject( gazou); pDC->BitBlt(0,0,48,48,&dc,0,0,SRCAND); //48*48ドットのBMP HRGN hrgn =(HRGN)m_rgn[anim].Detach(); SetWindowRgn( hrgn, true); dc.DeleteDC(); anim ^= 1; 中略... }

  • iアプリ、それともJava(?)における文字表示の挙動について

    iアプリ、それともJava(?)における文字表示の挙動について public void run(){  Graphics g = getGraphics();  while(true){   g.lock();   int i = 1;   g.drawString("hogehoge",0,15 + i); //下にずれて表示されていく。   g.unlock(true);   i++;  }//while() }//run() 【質問】 whileループで繰り返し、上記のような処理がなされる場合、 一度表示した文字は残らず、ループの繰り返し毎に、 何も表示されていない所に、1から表示しなおされる形で、 処理が行われています。 例えば、ループなしの簡単なHellow World!のような文字表示サンプルプログラムですと、 そのHellow World!という文字列を1度描画したら、そのまま描画されたままですが、 whileループの場合、 ループごとに、真っ白な状態に初期化され、その上に次の描画が行われ…ということを、 繰り返しているようです。 この時の、「毎回のループの初めに行われているであろう、真っ白な状態への初期化」は、 どういった仕組みで行われているのでしょうか? 別の言い方で言うと、 「whileループの描画処理が、蓄積されていかないのは何故?また、その蓄積がなされない理由(しくみ)はどこに?」 となります。 上記whileループの挙動に対し、 文字と文字が重なっていく、とか、 上段から下段へと文字がどんどん蓄積されながら描画されていく、 なんてことを想定していたわけですが、 実際には、そうはならないため、質問をさせて頂きました。、 このあたりのことについて、どなたか、お分かりになる方、ご教示下さい。 宜しくお願い致します。

    • ベストアンサー
    • Java
  • MFCのタイマーのつかい方を教えてください

    タイマーのつかい方が今ひとつ分かりません。 MFCでタイピングのゲームを作成しているのですが、 25問を解き、正解だった場合もしくは制限時間を超えてしまった場合、次の問題を表示したいと思っております。 下記がプログラム内容です。 void CProgramView::Loop1(CDC* pDC) { CProgramDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if((m_nRight<26)|(0<m_nRight)) { m_nRight=0; //正解数 m_nQuestion=1; //問題数 } Haikei(pDC); //問題表示領域の枠表示 Tokei(pDC); //時計の秒針が表示される枠表示 Moji(pDC); //問題文表示 OnChar(ch, count,flags); //入力 if(m_fTimer==FALSE) { SetTimer(123,250,NULL); //タイマーをセット if(m_nQuestion<26) //25問以上問題を解いていないケース { m_fTimer = FALSE; } else m_fTimer = TRUE; //全問解いた場合 } Loop0(pDC); //秒針の描画クラス if(m_nx==715) //タイムアウトだった場合 { KillTimer(123); NGPaper(pDC); m_nQuestion++; //問題をカウント m_sAnser.Empty(); //回答文字列をクリア pDoc->GetNextSet(); //次の問題を取得する InvalidateRect(NULL); } if(m_nQuestion<m_nCount) //正解だった場合 { KillTimer(123); //タイマーを切る Tokei(pDC); //秒針の画像を消すために時計の画面を再描画 Right(pDC); //正解した場合の画像を描画 Haikei(pDC); //問題文・回答を消すために問題表示領域の枠を再描画 PartsPaper1(pDC); //正解した場合の壁紙を表示 m_nQuestion++; //問題数をカウント m_sAnser.Empty(); //回答文字列をクリアする pDoc->GetNextSet(); //次の問題を取得する InvalidateRect(NULL); } } そして、この動作を25問、解くまでループさせる関数として以下の関数を作成しました。 void CProgramView::Loop2(CDC* pDC) { if(m_fTimer==FALSE) { Loop1(pDC); } } //タイマーの内容 void CProgramView::OnTimer(UINT nIDEvent) { // TODO: この位置にメッセージ ハンドラ用のコードを追加するかまたはデフォルトの処理を呼び出してください if(nIDEvent == 123) { InvalidateRect(NULL); } CView::OnTimer(nIDEvent); } しかし、実際にこのプログラムを実行すると入力し、正解する間は次の問題が表示されるのですが、タイマーが切れません。 そして、制限時間になるとそこまで解いていた問題から凄い勢いで描画が始まり、止まりません。 おそらくタイマーが正常に使えていないという可能性が考えられるのですが・・・。 希望としては、25問を順次解き、解き終わった後は画像を描画し、次の問題を表示したいのですが、どうしたら良いか教えてください。

  • MFCマルチスレッドについて

    MFCマルチスレッドについて COMやIOボードからの入力に応じて動作するアプリを作っています。 AfxBeginThreadにてそれぞれワーカスレッドを作成しCOMやIOから入力があれば AfxBeginThreadを呼んでいるクラスにあるメンバ関数を実行しようとしています。 AfxBeginThreadにて*thisを送り、制御関数内で、mycls->OnButton***()というような 感じで現在は作っています。(OnButton***になっているのはデバッグ用にボタンで あらかじめ作成している関数のためです。) このときに、mycls->OnButton***()は親スレッドで動いていると考えていいのですか? あくまで親スレッドのクラスのメンバ関数を制御関数が動いている子スレッドで実行 しているだけなのでしょうか? 実は、ログ表示のため制御関数の中(受信データを表示)と、mycls->OnButton***()の中 (作業結果を表示)に同じエディットコントロールへの表示部分があります。 表示部分の処理は、いったんCStringで読み込んできて最大文字数チェックを行い、 再度文字数を調節して書き直しということをやっているため、一応クリティカル セクションにはしているのですが、実際どう動いているか分からないため、やり忘れ ていることや、やってはいけないことをやってそうです。 すいませんがご教授願います。

  • OpenOffice.org3.1で、特売POPを作りたい

    OpenOffice.org3.1で、特売POPを作ろうとしています。手始めに黄色の背景に赤いPOP文字で価格を表示しただけの簡単なものをから始めたいのですが、Drawを新規に開くと左右にでてくる白紙にカーソルが表示されないので文字が入力できません。またPOP文字のようなくだけた感じの文字は使えるのでしょうか。簡単な絵も入れたいのですが、Draw(図形描画)とWriter(文書ドキュメント)のどちらから入ったらよいでしょうか。とりとめもない質問ですが、概略と手順を教えてください。

専門家に質問してみよう