【问题标题】:Displaying Int Variable in LPCSTR CreateWindowEx function在 LPCSTR CreateWindowEx 函数中显示 Int 变量
【发布时间】:2013-06-28 20:27:10
【问题描述】:

所以我正在制作一个基本的井字游戏作为我在 win32 中的第一个程序(只是为了学习更多的乐趣,没有学校作业或任何事情)。我已经完成了大部分的 UI 和基本的游戏玩法,例如点击方块和适当地放置 x 或 o。我编写了它,以便在游戏结束时识别谁是获胜者,并且可以显示一个小文本窗口,上面写着“PLAYER 1 WINS!”等等……

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

我的全局变量:

   //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("scoreplayer1") 部分中。错误是:typ int 的参数与 LPCSTR 类型的参数不兼容。

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

*编辑***

为了回应我尝试使用 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-stringify scoreplayer1 到,比如说,一个带有 itoa() 的 StrScore' char 数组,(或 std::stringstream 到一个 std::string),传递 @StrScore[0],(或 StrScore .c_cstr[0]).
  • 我只是勉强尝试了一下,它强制中断...我将编辑我的问题以显示我用来尝试 itoa() 想法的代码。
  • 有什么特别的原因总是创建新窗口而不是创建一次STATIC 控件并在分数变化时使用SetWindowText 更改其内容?
  • 不,不是真的......我只是无法让 SetDlgItemText 函数工作(可能是因为字符串问题),所以我决定尝试制作一个新窗口......

标签: c++ winapi createwindowex


【解决方案1】:

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

【讨论】:

  • 好吧,这是有道理的,我猜是菜鸟的错误。但是我看到在这里你甚至根本没有放入第二个 TEXT("") 部分,只是用变量本身替换了它,这比我试图做的更有意义。谢谢!
  • 以防万一其他人在看,在 CreateWindowEx 函数中,字符串流点应该有 2 组括号,如下所示ss.str().c_str(),调用该函数而不仅仅是引用它。
  • 再次感谢您的帮助
猜你喜欢
  • 2011-05-21
  • 1970-01-01
  • 2015-04-21
  • 2014-07-31
  • 1970-01-01
  • 2014-02-09
  • 1970-01-01
  • 2012-04-21
  • 1970-01-01
相关资源
最近更新 更多