#pragma twice

KAB-studio > プログラミング > #pragma twice > 200 Version 10.22 SDK のまとめ、そして文字列へ

#pragma twice 200 Version 10.22 SDK のまとめ、そして文字列へ

前のページへ 表紙・目次へ 次のページへ

 Version 10.22
SDK のまとめ、そして文字列へ

さて、 SDK だけでプログラムを作るのは今回まで。どう、感想は?
なんか全然違う……けど
けど?
 MFC と違って、わけわかんないっていうの、少ないかも
確かに API の所まで全部自分でコーディングするから、把握はしやすい

でもやっぱり、 MFC の方が便利かも
うん、それはたぶんそうだよ
……じゃあさ、 SDK だけで作る意味って?
僕が一番重要だと思うのは、単に MFC を使うよりもずっといいってこ

あ、そっか、 MFC が何をしてるかってこれでわかるんだもんね
 MFC をただ使ってるだけだと、まるで MFC こそがすべてって感じちゃう
けど、そうじゃなくて、本当は SDK を使ったプログラムがあって、 MFC は
それを手助けしているだけっていうこと、がわかればいいかな
ってことは、今回の SDK のと MFC のを見比べれば
……
? どったの?
実は、それは難しい部分もあるかな
どゆこと?
たとえば、ウィンドウプロシージャ

// ウィンドウプロシージャ。
LRESULT CALLBACK WndProc
    ( HWND p_hWnd
    , UINT p_uiMessage
    , WPARAM p_wParam
    , LPARAM p_lParam
    )
{
    if( p_uiMessage == WM_CREATE )
    {
        return OnCreate( p_hWnd, p_wParam, p_lParam );
    }
    else if( p_uiMessage == WM_DESTROY )
    {
        return OnDestroy();
    }
    else if( p_uiMessage == WM_RBUTTONUP )
    {
        return OnRButtonUp( p_hWnd, p_wParam, p_lParam );
    }
    else if( p_uiMessage == WM_COMMAND )
    {
        if( LOWORD( p_wParam ) == ID_MENU_TEST )
        {
            return OnMenuTest( p_hWnd, p_wParam, p_lParam );
        }
    }
    else if( p_uiMessage == WM_CHAR )
    {
        return OnChar( p_hWnd, p_wParam, p_lParam );
    }
    else if( p_uiMessage == WM_PAINT )
    {
        return OnPaint( p_hWnd, p_wParam, p_lParam );
    }

    // 標準的な処理をします。
    return DefWindowProc( p_hWnd, p_uiMessage, p_wParam, p_lParam );
}

 MFC ではこんな方法してません
ええっ!?
だって、たとえば ID_MENU_TEST とか
 MFC に書き込むわけにいかないもんね、毎回違うんだから……
 MFC の場合は、メッセージマップっていう特殊な方法を使ってます。た
とえば、ダイアログのクラス、 ***Dlg.cpp ってクラスの最初の方に

BEGIN_MESSAGE_MAP(CT_DlgJunk20Dlg, CDialog)
    //{{AFX_MSG_MAP(CT_DlgJunk20Dlg)
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

って部分があると思います
うん、ある
この中に IDC_BUTTON1 って書かれてる部分があるでしょ

    ON_BN_CLICKED(IDC_BUTTON1, OnButton1)

あ、これってボタンの ID っぽい
そう、その通り! これは、 WM_COMMAND で IDC_BUTTON1 が送られてき
たら OnButton1() を呼んでください、って意味なんです
??? なにそれ、 VC の機能???
ううん、 MFC の……これはマクロ
マクロって、置き換えるのだよね
そう、 Version 6.05 ( No.105 ) を読み返してみると分かると思うけ
ど、これがちゃんとした C++ のコードに変換されるんです
そうなると?
ウィンドウプロシージャの

    else if( p_uiMessage == WM_COMMAND )
    {
        if( LOWORD( p_wParam ) == ID_MENU_TEST )
        {
            return OnMenuTest( p_hWnd, p_wParam, p_lParam );
        }
    }

的なコードが作られるってわけ
おお!
まぁ今のはかなりざっくりとだけどね。ホントはもっと細かくて難しいか
ら、今は説明はパス
いつか教えてもらえる?
もちろん。 MFC くらい読めるようになってもらわないと
そうなんだ
実際、このくらいは作れるようにならないとね
作る!?
言ったでしょ、 MFC だって
 SDK で作ったのの代わり。だから自分でも作れる……
この MFC のメッセージマップの機能だって、自分で作ることもできる
し、改良型だって作れるだろうし
あ、作るって言えば、さっきのメッセージマップのって、あたし初めて見
たけど……いつの間にあんなのが?
あれは、 ClassWizard でイベントハンドラを作ると、 VC が入れてくれ
るんです
ああ! そーゆーことなんだ
 MFC は実際、 VC なしで使うのはかなりつらいから、 MFC と VC はペア
ってことになるかな。さて!
さて?
さっきも言ったように、今回で SDK 編は終わり。次回からは文字列につ
いてしっかり見ていきます
文字列? 前にやったよね
 Version 5.04 ( No.069 ) とかだよね。でも、まだまだまだまだ勉強し
なきゃいけないことがいっぱいあるんです。たとえば


// キー入力がありました。
LRESULT OnChar
    ( HWND p_hWnd
    , WPARAM p_wParam
    , LPARAM p_lParam
    )
{
    // 入力された文字を取り出して、文字列にします。
    char ch[2];
    ch[0] = (char)p_wParam;
    ch[1] = '\0';
    // それをくっつけます。
    if( strlen( g_pchText ) < TEXT_MAX_LENGTH )
    {
        // 文字列サイズをオーバーしてないのでくっつけまず。
        strcat( g_pchText, ch );
    }

    // そして再描画。
    InvalidateRect( p_hWnd, NULL, TRUE );
    return 0;
}

このまえのキー入力の部分だね
ここ、文字を文字列にくっつけるって部分で

    if( strlen( g_pchText ) < TEXT_MAX_LENGTH )

ってしてるでしょ。これは g_pchText のサイズを超えないようにチェッ
クしてます
それくらいわかるよ。 strlen() って文字列のサイズがわかるんだもん

でも、それってつまり TEXT_MAX_LENGTH よりも大きな文字列は入らない
ってことでしょ?
そういえば! 全然テキストエディタっぽくない!
こういう場合、サイズが固定の文字配列じゃなくて、可変のものを使わな
きゃいけないんです。たとえば CString とか
 CString って長さが変わるんだ。でも CString って MFC のでしょ?
だから今回は使えないでしょ。それじゃ、 SDK の時には
長い文字列が使えない!?
ってなったらまずいから、その辺の勉強をします。さらに!
さらに?
文字列関係の処理は、慣れてないととっても手間取るんです。たとえば

AAA1524,300,Z
0123F,100,Z
LLF33,200,F

な、何これ……
こういうデータがファイルに入っています。データは各行でカンマ区切
り、1列目はアルファベット3文字の後に整数値、2列目は整数値、3列
目は1文字になってます
う、うん……?
このデータを1列目の整数値の部分で昇順にソートして一覧表示せよ。
ただし1列目はフォーマットが異なるものも含まれているのでそれは除
く。また、3列目に対して

F,油揚げ
Z,揚げ玉

というデータの入っている別ファイルから検索して、第1列目のうち該当
するものの第2列目を表示せよ
……つまり

LLF33,200,油揚げ
AAA1524,300,揚げ玉

ってことだよね
それをプログラムで
……不可能!!
というわけで次回からはそういうのを教えていくから

/*
    Preview Next Story!
*/
っつーかそーゆーのってホントに必要?
お仕事ではよくあるパターンだから、こういうのは自然にできないと
難しそう……
ま、普通は関数化していつでも使えるようにするんだけどね
じゃ、その関数ちょうだい
ダメ
ケチー
というわけで次回
< Version 11.01 文字列ってなんだっけ >
につづく!
ちゃんと基本を理解してから、だよ
う”−う”−!!
 
del.icio.us 登録する
Yahoo!ブックマーク 詳細を表示 users
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
RSSに登録
del.icio.us 登録する
Yahoo!ブックマーク 詳細を表示 users
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
 
このページは、Visual C++ 6.0を用いた C++ 言語プログラミングの解説を行う#pragma twiceの一コンテンツです。
詳しい説明は#pragma twiceのトップページをご覧ください。