2011-02-24 6 views
0

나는 최근이 튜토리얼을 사용하여 Win32 API를 학습 시작했다 : 나는 현재 "편집 상자 실험있어 (나는 ++ 튜토리얼로하지 C를 C를 사용하고 있지만)문제 초기화 전역 변수

http://www.winprog.org/tutorial/을 "-function 여기서 편집 상자에 쓰여진 텍스트를 다른 줄의 문자와 비교하려고합니다. 코드 :

#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가'

을 사용

런타임 검사 실패 (I이 기능을 사용하고있을 때, 표시 및 이것은 단지 그들 중 하나)이다 코드 :

확인 실패 # 3 런타임 - 변수 'hEdit이'범위의 매우 중요한 개념으로

+0

어떻게 '비교'기능을 호출합니까? – Naveen

+2

C++에서는 초기 값을 가질 때까지 변수를 선언하지 않습니다. 예 : 'HFONT hfDefault = GetStockObject (...'.) 이것은 초기화하기 전에 변수를 사용할 수 없게하는데, 이는 C의 일반적인 버그입니다. – MSalters

답변

0

봐 initializ없이 사용하고 있습니다. 이 페이지를 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

1

pszText은 포인터 유형입니다. 따라서 메모리를 사용하기 전에 메모리를 할당해야합니다.

는이 작업을 수행 :

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

예이 문제를 해결합니다. – karthik

1

예, 내부 데이터를 저장하기 위해 et Wi ndow Te xt는위한 버퍼()을 할당해야합니다. LPWSTR의 "LP"는 변수가 실제로 포인터이고 할당 된 객체가 아니라는 것을 의미합니다.

이 스타일을 "헝가리 표기법"이라고하며, 개인적인 견해로는 더 많은 버그를 만들기 위해 프로그래머가 기본적인 C 구문을 숨기는 것입니다.