问题初始化的全局变量

问题描述:

我最近开始使用本教程学习的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不是,我已经尝试使用新的/删除来解决它,但我不明白它的工作。我不知道hEdit。我可能使用GetWindowText函数错误? 警告 代码:

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

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

运行时检查失败#3 - 变量“hEdit”被而不initializ

+0

你是怎么调用'compare'函数的? – Naveen

+2

在C++中,除非有初始值,否则不要声明变量。例如。 'HFONT hfDefault = GetStockObject(...'。这会阻止你在初始化它之前使用一个变量,这是C中的一个常见bug。 – MSalters

查找到的范围非常重要的概念使用。参照当前页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仅存在用于块的持续时间,其中它被声明,也就是内的{} S为WM_CREATE情况。

+1

好的,所以我应该声明hEdit为全局变量吗? – karthik

+0

是的,你是对的 – karthik

+0

可能不是你的'hEdit'指的是一个窗口上的编辑框,你应该有一个C++类的窗口,你的'hEdit'应该是该类的成员 – MSalters

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

这样做:

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

是的,我解决了这个问题 – karthik

是的,你必须分配的GetWindowText函数)的缓冲(以店内它的数据。 LPWSTR中的“LP”意味着变量实际上是一个指针而不是分配的对象。

这种风格被称为“匈牙利符号”,并且我个人认为它的唯一用途是将程序员的基本C语法隐藏起来,以便创建更多的错误。