2011-02-24 185 views
0

我最近開始使用本教程學習的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

回答

0

查找到的範圍非常重要的概念使用。參照當前頁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

是的,你必須分配的GetWindowText函數)的緩衝(以店內它的數據。 LPWSTR中的「LP」意味着變量實際上是一個指針而不是分配的對象。

這種風格被稱爲「匈牙利符號」,並且我個人認爲它的唯一用途是將程序員的基本C語法隱藏起來,以便創建更多的錯誤。