0

私は C++/WINAPI で最初の単純なプログラムを作成しています。多くのチェック ボックスといくつかの編集フィールドがあり、ボタンを押すだけでいくつかの計算がセットアップされます。私のすべてのチェックボックスは、個々のケースを通じて機能/保存情報、つまり

switch (msg)
{
    ...
    case WM_COMMAND:
    {
        switch (wParam)
        {
            case IDBC_BoxCheck1:
            {...}
            case IDBC_BoxCheck2:
            {...}
            ...
        } ...

...しかし、編集フィールドは、ボタンを押すようなケースステートメントとして機能しないと想定しました。これは、ユーザーが何度も変更した後、最後に値を読み取る必要があるためです。私はオンラインで見て、SendMessage(hwnd, ...) および GetWindowText(hwnd, ...) 関数を使用して WM_GETTEXT コマンドを編集フィールドに送信し、それを lpstr 文字列に保存しようとしましたが、同じ問題に遭遇しましたそれらの両方で-編集フィールドのhwndは、WM_GETTEXTコマンドが送信されているスコープで宣言されておらず、そこに取得する方法がわかりません。これは、私のプログラムで使用されている構造の概​​要です。これは、私が取り組んでいたいくつかのチュートリアルを組み合わせたものです。

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch (msg)
    {
        case WM_CREATE:
        {
            return OnCreate(hwnd, reinterpret_cast<CREATESTRUCT*>(lParam));
            // OnCreate is a sub function that handles the creation of all the buttons/controls,
            // since there are so many of them, with the format:
            // HWND editControl1 = CreateControl(...); // CreateControl being another sub fnct
                                                       // that creates edit field ctrls
                                                       // editControl1 is the hwnd I'm trying
                                                       // to read the value from
            // HWND checkControl1 = CreateButton(...); // Creates button ctrls, including ck box
            ...
        }
        ...
        case WM_COMMAND:
        {
            switch (wParam)
            {
                case IDBC_BoxCheck1:    // These control IDs are defined at the top of the file
                {
                   LPSTR Check1;
                   StoreInfo(Check1);   // Just a sub fnct to store info for later calculations
                }
                case IDBC_BoxCheck2:
                {
                    LPSTR Check2;
                    StoreInfo(Check2);
                } // etc... there are 20 or so check boxes/buttons
                case IDBC_Calculate:    
                {
                    LPSTR edit1;
                    GetWindowText(editControl1, edit1, 100); // or SendMessage(editControl1, ...)
                    // This kicks out the error of editControl1 not being declared in this scope
                    StoreInfo(edit1);
                    // Calculation function goes here
                } ...
            } ....
        }
        default: DefWindowProc(hwnd, msg, wParam, lParam);
    }
}

IDBC_Calculate は、計算が実行される前に押される最後のボタンです。編集フィールドから値を読み取って保存するのに最適な場所は、このボタンが押された後、計算関数が呼び出される直前ですが、同じコマンドに関連付けられていると考えました。これは、hwnd editControl1 が定義されていない場所ですが、定義をこのスコープに送信する方法や、編集フィールドの値を読み取って保存する場所がわかりません。

これらの編集フィールドから他の関数​​に値を取得するためのヘルプやポインターをいただければ幸いです! さまざまなチュートリアル/レッスンでボタンの状態を確認するためのさまざまな方法を見てきました。

4

1 に答える 1

1

編集フィールドには ID がありますよね? 次に、GetDlgItem を使用できます。

editControl1 = GetDlgItem(hwnd, CONTROL_ID_1);

GetDlgItem名前が悪いので、ダイアログ ボックスだけでは機能しません。子ウィンドウの ID を使用して、親ウィンドウから子ウィンドウのハンドルを取得します。

Anders K の言うことは正しい。GetWindowText を使用している方法では、プログラムがクラッシュします。

于 2012-08-07T06:30:27.830 に答える