在LPCSTR CreateWindowEx函数中显示Int变量



所以我正在制作一个基本的井字游戏,作为我在win32中的第一个程序(只是为了好玩,学习更多,没有学校作业或任何东西)。我已经完成了大部分的UI和基本的游戏,比如点击方块和适当地放置x或o。我写了它,这样它就可以在游戏结束时识别谁是赢家,并可以显示一个小文本窗口,上面写着"PLAYER 1 WINS!"等等…

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

我的全局变量:

   //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函数(它们以空白开始):

    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);

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

    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("scoreplayer.1")部分。错误为:类型为int的参数与类型为LPCSTR的参数不兼容。

那么,如何更改最后一个窗口的创建,使其显示一个int变量(如scorplayer1),该变量将随着游戏的进行而增加呢?谢谢

*编辑***

作为对一条评论的回应,我试图使用itoa()来解决这个问题,我做了以下操作:

    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,它将占用三个字符,大于99将占用4个字符,依此类推

在C++中,我建议,尽管时间稍长,但使用stringstream来输出数字是一种更容易/更安全的方法,可以避免在计算字符串需要多少空间时出现问题(并且允许输出比一个整数更复杂的东西,因为你可以简单地组合任何输出,就像使用cout进行控制台输出一样)。

类似这样的东西:

 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);

最新更新