0

私は小さな GUI 電卓プロジェクトに取り組んでおり、エディット コントロールの内容に何かを追加する必要があります。私が現在使用している機能は次のとおりです。

int CharControl = 256;

void AddToEditMainText(char WhatToAdd[CharControl]) {
    char CurrText[CharControl] = "";
    GetDlgItemText(MainWindow, EDIT_MAIN, CurrText, CharControl);
    char NewText[CharControl] = "";
    malloc(strlen(NewText) + strlen(WhatToAdd) + 1);
    strcpy_s(NewText, CurrText);
    strcat_s(NewText, WhatToAdd);
    SendMessage(EditMain, WM_SETTEXT, NULL, LPARAM((LPCSTR)&NewText));
}

私は C++ に比較的慣れていないので、これが初めての GUI プロジェクトです。どんな助けでも大歓迎です。ありがとう。

4

2 に答える 2

1

いくつか変更してみましょう:

void AddToEditMainText(char *WhatToAdd)

関数パラメーターのコンテキストでは、文字配列とポインターは同じものです。渡されたパラメータが任意の長さの char 配列であっても問題ないので、混乱しないようにしましょう。

しかし、私たちはもっとうまくやることができます。この質問には、C ではなく C++ のタグが付けられています。C++ では、低レベルのバイトフリングよりも少し進んでいると考えたいと思います。文字列について話しているときは、std::string について話している:

void AddToEditMainText(const std::string &WhatToAdd)

私は MS-Windows API にあまり詳しくありませんが、「GetDlgItemText」が既存のダイアログ コントロールからテキストを取得する C API 関数であることは明らかです。返される文字列が小さくなることが保証されているのか、それとも 256 バイトのバッファーに切り詰められるのかはわかりません。これは実際には重要なポイントですが、C++ の入門環境では重要ではありません。

GetDlgItemText() で使用される char バッファーはとても ... C っぽいです。char バッファーは、C++ では非常に奇妙な概念です。getDlgItemText が返されたら、時間を無駄にせず、素敵できれいな std::string にしましょう。

std::string CurrTextStr=CurrText;

繰り返しになりますが、C++ では、メモリの割り当てや、使用後の解放の確認など、ささいな詳細を気にする必要はありません。std::string は私たちのためにそれを行います:

std::string combinedString=CurrTextStr + WhatToAdd;

これは簡単ではありませんでしたか?さまざまなバッファのサイズを計算する必要はありません。それはそうです...前世紀。私たちは、「+」演算子が代わりにそれを行う現代にいます。最後に、SendMessage() はもう 1 つの風変わりな C ライブラリ API であるため、そのレベルまで話を下げる必要があると思います...

SendMessage(EditMain, WM_SETTEXT, NULL, LPARAM((LPCSTR)combinedString.c_str()));

ああ、std::string の定義を取り込むために、「#include <string>」を先頭のどこかに貼り付けることを忘れないでください。

于 2014-08-28T01:15:33.530 に答える