0

HWNDポインターを他のデータと一緒にintベクトルに格納しようとしています。次のコードを使用してデータを取得し、作成時に格納します。

void createscalingwindow(HWND &cswpara0,DWORD cswpara1,const CHAR* cswpara2,
                         const CHAR* cswpara3,DWORD cswpara4,int cswpara5,
                         int cswpara6,int cswpara7,int cswpara8,HWND cswpara9,
                         HMENU cswpara10,HINSTANCE cswpara11,LPVOID cswpara12)
{
    cswpara0 = CreateWindowEx (cswpara1, cswpara2, cswpara3, cswpara4, cswpara5,
                               cswpara6,cswpara7,cswpara8,cswpara9,cswpara10,
                               cswpara11,cswpara12);                     
    sizevalues.push_back((int)&cswpara0);
    snprintf (buffer, 20,"%d", sizevalues[zero]);
    MessageBox (NULL, buffer, "pointer", NULL);
    sizevalues.push_back(cswpara5);
    sizevalues.push_back(cswpara6);
    sizevalues.push_back(cswpara7);
    sizevalues.push_back(cswpara8);
    return;
}

この次のコードは、現在メッセージボックスの値のみを表示するプロトタイプですが、後で子ウィンドウのサイズを変更して親に合わせて拡大縮小する予定です。

void scalewindowsize (HWND &ownerwin, HWND &childwin)
{
    /*check owner window*/
    char buffer[100];
    int checknumber = 0; 
    while (checknumber < sizevalues.size())
    {
        if (sizevalues[checknumber] == (int)&ownerwin)
        {
            snprintf (buffer, 100,"%d", sizevalues[checknumber]);
            MessageBox (NULL, buffer, "foundit", NULL);
            break;
        }
        snprintf (buffer, 20,"%d", (int)&ownerwin);
        checknumber = (checknumber + 5);
        MessageBox (NULL, buffer, "fail", NULL);
    }
    return;
}

問題は、最初のMessageboxincreatescalingwindowが4235304の値を生成し、2番目のinがまったく異なる数値を生成することです(数値は異なります)。どうしてこれなの?

更新:原因の一部が見つかりました。これを再現するには、パラメーターとして使用されるscalewindowsizeHWNDを、そのウィンドウプロシージャで同じパラメータHWNDを持つウィンドウプロシージャで使用する必要があります。

4

1 に答える 1

2

int非値をintベクトルに格納しないでください。それはトラブルを求めています。

代わりに、すべての値のフィールド(適切なタイプ)を持つクラスを作成し、そのクラスのオブジェクトを含むベクトルを作成します。

ただし、数値が変化するのは、ローカル変数のアドレスを取得し、変数を宣言する関数が戻った後にそれを使用したことが原因である可能性があります。HWND保存されているアドレスではなく、の値をプッシュする必要があります。ハンドルは単純な数値であるため、関数で変更する予定がない限り、参照で渡す必要はありません(どちらでも変更する必要がある理由はわかりませんがcreatescalingwindow、値を返すだけで済みます)。

于 2013-01-01T17:28:50.447 に答える