关于C#:在LPCSTR CreateWindowEx函数中显示Int变量

Displaying Int Variable in LPCSTR CreateWindowEx function

因此,我正在做一个基本的井字游戏,这是我在Win32中的第一个程序(只是为了好玩而学习更多,没有学校作业或其他任何东西)。我已经完成了大部分的UI和基本的游戏操作,例如单击正方形并适当放置x \\或o \\。我写了它,以便在游戏结束时识别谁是赢家,并可以显示一个小的文本窗口,上面写着" PLAYER 1 WINS!"等。...

我的问题不是关于如何显示分数的。我的想法是拥有一个名为scoreplayer1的int变量,当玩家获胜时,我会将其增加1(scoreplayer1)。然后,我想将以前的乐谱更改为新乐谱的窗口。这是我到目前为止的内容(我将取出与此问题无关的所有代码,但是如果您需要更多,请告诉我):

我的全局变量:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
   //Global Variables

    HINSTANCE hInst;                // current instance
    TCHAR szTitle[MAX_LOADSTRING];      // The title bar text
    TCHAR szWindowClass[MAX_LOADSTRING];        // the main window class name
    HWND hwnd1, hwnd2, hwnd3, hwnd4, hwnd5, hwnd6, hwnd7, hwnd8;
    HWND hwnd9, hwndscore1, hwndscore2, hWnd;

    // Forward declarations of functions included in this code module:
    ATOM    MyRegisterClass(HINSTANCE hInstance);
    BOOL    InitInstance(HINSTANCE, int);
    LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
    INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);
    int determinewinner();
    int showscore(int win_value);
    int scoreplayer1,scoreplayer2;

最初创建得分窗口的CreateWindow函数(开始时为空白):

1
2
3
4
5
6
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    switch (message)
    case WM_CREATE:
    hwndscore1 = CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("STATIC"),TEXT(""), WS_CHILD|WS_VISIBLE|SS_CENTER, 20,285,100,20,hWnd,HMENU(NULL),GetModuleHandle(NULL),NULL);
    hwndscore2 = CreateWindowEx(WS_EX_CLIENTEDGE,TEXT("STATIC"),TEXT(""), WS_CHILD|WS_VISIBLE|SS_CENTER, 130,285,100,20,hWnd,HMENU(NULL),GetModuleHandle(NULL),NULL);

然后尝试处理更改分数窗口的功能:

1
2
3
4
5
6
7
8
    int showscore(int win_value)
    {
if(win_value==1)
{   scoreplayer1++;
    DestroyWindow(hwndscore1);
    hwndscore1 = CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("STATIC"),TEXT(scoreplayer1), WS_CHILD|WS_VISIBLE|SS_CENTER, 20,285,100,20,hWnd,HMENU(NULL),GetModuleHandle(NULL),NULL);
return (scoreplayer1);} // This return part is just temporary because it wants
               // the function to return a value, it doesn't come into play

} ??

这个想法是销毁旧窗口,然后简单地用新分数重新创建一个新窗口(这似乎是最简单的方法)。我知道问题出在哪里,它说我不能将int scoreplayer1变量放在最后一个CreateWindowEx函数的TEXT(" scoreplayer1 ")部分中。错误为:typ int的参数与LPCSTR类型的参数不兼容。

那么如何改变最后一个窗口的创建方式,使其显示一个int变量(例如scoreplayer1),该变量会随着游戏的进行而增加?谢谢!

*编辑***

作为回应,我试图使用itoa()解决问题,我做了以下工作:

1
2
3
4
5
6
7
8
9
    int showscore(int win_value)
    { if(win_value==1)
{   scoreplayer1++;
char score1[1];
itoa(scoreplayer1, score1, 1);

    DestroyWindow(hwndscore1);
    hwndscore1 = CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("STATIC"),TEXT(score1), WS_CHILD|WS_VISIBLE|SS_CENTER, 20,285,100,20,hWnd,HMENU(NULL),GetModuleHandle(NULL),NULL);
return (scoreplayer1);}

当我到达游戏中的那个点时,哪个会强制程序中断...关于我做错了什么的任何主意?


在C和C中,可以通过多种方式将整数转换为字符串。

您编辑的代码失败,因为字符串的长度为1个字符,并且保证所有数字都不适合一个字符,因为所有数字都代表字符串本身一个字符,而另一个字符则代表零字节的结尾字符串。如果数字大于9,它将占用3个字符,大于99则需要4个字符,依此类推。

在C中,我建议尽管使用更长的时间,但使用stringstream将数字输出到是一种更容易/更安全的方法,该方法可以避免如果弄清楚字符串需要多少空间(并允许输出比一个整数还复杂的东西,因为您可以简单地组合任何输出,就像使用cout进行控制台输出一样。

类似这样的内容:

1
2
3
4
 std::stringstream ss;
 ss << scoreplayer1;

 hwndscore1 = CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("STATIC"),ss.str().c_str(), WS_CHILD|WS_VISIBLE|SS_CENTER, 20,285,100,20,hWnd,HMENU(NULL),GetModuleHandle(NULL),NULL);