проблема инициализации глобальных переменных - PullRequest
0 голосов
/ 24 февраля 2011

Я недавно начал изучать 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 arenне инициализирован.Я понимаю, почему pszText нет, и я попытался использовать new / delete, чтобы исправить это, но я не могу заставить его работать.Я понятия не имею о HEdit.Возможно, я неправильно использую функцию GetWindowText?Код предупреждения:

предупреждение C4700: используется неинициализированная локальная переменная 'pszText' предупреждение C4700: используется неинициализированная локальная переменная 'hEdit'

Ошибка проверки во время выполнения (появляется, когда я использую функциюи это только один из них) Код:

Ошибка проверки времени выполнения # 3 - переменная 'hEdit' используется без инициализации

Ответы [ 3 ]

1 голос
/ 24 февраля 2011

pszText - это тип указателя. Поэтому вам необходимо выделить для него память, прежде чем использовать ее.

Сделайте это:

wchar_t *pszText = new wchar_t[size]; //calculate or guess `size`
1 голос
/ 24 февраля 2011

Да, вы должны выделить буфер для GetWindowText () для хранения своих данных внутри.«LP» в LPWSTR означает, что переменная фактически является указателем, а не выделенным объектом.

Этот стиль называется "венгерской нотацией", и, по моему личному мнению, он используется только для того, чтобы скрыть фундаментальный синтаксис C от программиста, чтобы создавать больше ошибок.

0 голосов
/ 24 февраля 2011

Посмотрите на очень важную концепцию объема.см. эту страницу 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случай.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...