【问题标题】:problem initializing global variables初始化全局变量的问题
【发布时间】:2011-02-24 09:42:28
【问题描述】:

我最近开始使用本教程学习 Win32 API:

http://www.winprog.org/tutorial/(虽然我使用的是 C++,而不是教程中的 C) 我目前正在试验“编辑框”功能,我试图将编辑框中的文字与另一行字符进行比较。 代码:

#define IDC_MAIN_EDIT   101

代码:

case WM_CREATE:
{
    HFONT hfDefault;
    HWND hEdit;

    hEdit = CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "", 
        WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL | ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL, 
        0, 0, 100, 100, hwnd, (HMENU)IDC_MAIN_EDIT, GetModuleHandle(NULL), NULL);
    if(hEdit == NULL)
        MessageBox(hwnd, "Could not create edit box.", "Error", MB_OK | MB_ICONERROR);

    hfDefault = GetStockObject(DEFAULT_GUI_FONT);
    SendMessage(hEdit, WM_SETFONT, (WPARAM)hfDefault, MAKELPARAM(FALSE, 0));
}
break;
case WM_SIZE:
{
    HWND hEdit;
    RECT rcClient;

    GetClientRect(hwnd, &rcClient);

    hEdit = GetDlgItem(hwnd, IDC_MAIN_EDIT);
    SetWindowPos(hEdit, NULL, 0, 0, rcClient.right, rcClient.bottom, SWP_NOZORDER);
}
break;

代码:

bool comparison (HWND hEdit) {
LPWSTR pszText;
DWORD dwTextLength;
DWORD dwBufferSize;

dwTextLength = GetWindowTextLength(hEdit);
dwBufferSize = dwTextLength + 1;

GetWindowText(hEdit, pszText, dwBufferSize);

if(pszText == TEXT("3")) {
    return true;
}
else {
    return false;
}
}

我调用“比较”函数时的问题是 pszText 和 hEdit 没有初始化。我明白为什么 pszText 不是,我已经尝试使用 new/delete 来修复它,但我没有让它工作。我对hEdit一无所知。我是否可能使用错误的 GetWindowText 函数? 警告 代码:

警告 C4700:使用了未初始化的局部变量“pszText” 警告 C4700:使用了未初始化的局部变量“hEdit”

运行时检查失败(在我使用该功能时出现,这只是其中之一) 代码:

运行时检查失败 #3 - 变量 'hEdit' 未经初始化就被使用

【问题讨论】:

  • 你是怎么调用comparison函数的?
  • 在 C++ 中,只有在获得变量的初始值后,才能声明变量。例如。 HFONT hfDefault = GetStockObject(...。这会阻止您在初始化变量之前使用它,这是 C 中的常见错误。

标签: c++ windows window


【解决方案1】:

pszText 是指针类型。所以你需要在使用它之前给它分配内存。

这样做:

wchar_t *pszText = new wchar_t[size]; //calculate or guess `size`

【讨论】:

    【解决方案2】:

    是的,您必须为 GetWindowText() 分配一个缓冲区以在其中存储其数据。 LPWSTR 中的“LP”表示该变量实际上是一个指针,而不是分配的对象。

    这种风格被称为“匈牙利表示法”,在我个人看来,它的唯一用途是向程序员隐藏基本的 C 语法,以便产生更多的错误。

    【讨论】:

      【解决方案3】:

      查看非常重要的范围概念。参考这个页面http://www.cplusplus.com/doc/tutorial/variables/

      c++代码:

        case WM_CREATE:
      
        {
      
                HFONT hfDefault;
      
                HWND hEdit;
      
      
      
                hEdit = CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "",
      
                    WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL | ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL,
      
                    0, 0, 100, 100, hwnd, (HMENU)IDC_MAIN_EDIT, GetModuleHandle(NULL), NULL);
      
                if(hEdit == NULL)
      
                    MessageBox(hwnd, "Could not create edit box.", "Error", MB_OK | MB_ICONERROR);
      
      
      
                hfDefault = GetStockObject(DEFAULT_GUI_FONT);
      
                SendMessage(hEdit, WM_SETFONT, (WPARAM)hfDefault, MAKELPARAM(FALSE, 0));
      
            } 
      

      变量 hEdit 仅在声明它的块的持续时间内存在,在 WM_CREATE 案例的 {} 中。

      【讨论】:

      • 好的,所以我应该将 hEdit 声明为全局变量?
      • 可能不会。你的`hEdit`指的是窗口上的一个编辑框。你应该有一个用于窗口的 C++ 类;您的 hEdit 应该是该类的成员。
      • @mSalters:为什么我需要 C++ 类的编辑控件?我想我是对的。
      • @Karthikvasantham:英语中的“should”不如“need”或“must”强。使用 C++ 类很好,因为它允许您从许多 C++ 扩展中受益,例如私有成员 = 数据抽象。数据抽象意味着只有您的窗口控制hEdit,这使得寻找错误更加容易。需要检查的代码更少。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-03
      • 1970-01-01
      • 1970-01-01
      • 2015-07-18
      相关资源
      最近更新 更多