2012-11-28 7 views
0

텍스트 상자의 텍스트를 변경하려고하는데 코드가 작동하지 않는 것 같습니다. SetWindowText (hwnd, lpcstr)를 사용하고 있습니다; 그리고 문제가C++ SetWindowText가 작동하지 않습니다.

될 일을 전혀 생각이 난 내 모든 코드를 게시 한

#include <iostream> 
#include <string> 
#include <fstream> 
#include <windows.h> 
#include <tchar.h> 

using namespace std; 

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); 
enum { ID_LABEL = 1,ID_LONG_TEXT,ID_EDIT,ID_EDIT_1,ID_BUTTON }; 

int WINAPI WinMain(HINSTANCE hInstance, 
       HINSTANCE hPrevInstance, 
       LPSTR lpCmdLine, 
       int nCmdShow) 
{ 
// Creo la finestra 

static TCHAR szWindowClass[] = _T("Draw"); 
static TCHAR szTitle[] = _T("Draw"); 

WNDCLASSEX wcex; 

wcex.cbSize  = sizeof(WNDCLASSEX); 
wcex.style  = CS_HREDRAW | CS_VREDRAW; 
wcex.lpfnWndProc = WndProc; 
wcex.cbClsExtra = 0; 
wcex.cbWndExtra = 0; 
wcex.hInstance = hInstance; 
wcex.hIcon  = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION)); 
wcex.hCursor  = LoadCursor(NULL, IDC_ARROW); 
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); 
wcex.lpszMenuName = NULL; 
wcex.lpszClassName = szWindowClass; 
wcex.hIconSm  = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_APPLICATION)); 

if(!RegisterClassEx(&wcex)) 
{ 
    MessageBox(NULL, 
       _T("Call to RegisterClassEx failed!"), 
       _T("Win32 Guided Tour"), 
       NULL); 

    return 1; 
} 

HWND hWnd = CreateWindow(
    szWindowClass, 
    szTitle, 
    WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX, 
    CW_USEDEFAULT, CW_USEDEFAULT, 
    450, 600, 
    NULL, 
    NULL, 
    hInstance, 
    NULL); 

if(!hWnd) 
{ 
    MessageBox(NULL, 
       _T("Call to CreateWindow failed!"), 
       _T("Win32 Guided Tour"), 
       NULL); 

    return 1; 
} 

ShowWindow(hWnd, nCmdShow); 
UpdateWindow(hWnd); 

MSG msg; 

while(GetMessage(&msg, NULL, 0, 0)) 
{ 
    TranslateMessage(&msg); 
    DispatchMessage(&msg); 
} 

return (int) msg.wParam; 
} 

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 
{ 
TCHAR primo[] = _T("Inserisci la lunghezza della parola da indovinare:"); 
TCHAR secondo[] = _T("Inserisci le lettere (una dopo l'altra senza ne spazi ne invii):"); 
HDC hdc; 
//HFONT hFont; 
HWND button; 
HWND edit; 
HWND edit_1; 
HWND long_edit; 
HINSTANCE g_hInst; 

switch(uMsg) 
{ 
    case WM_CREATE: 
    { 
     edit = CreateWindow("Edit", "1h2f3d4", 
          WS_BORDER |WS_CHILD | WS_VISIBLE, 
          5, 30, 23, 20, hWnd, (HMENU) ID_EDIT, NULL, NULL); 

     edit_1 = CreateWindow("Edit", "sdgf", 
           WS_BORDER | WS_CHILD | WS_VISIBLE, 
           5, 85, 250, 20, hWnd, (HMENU) ID_EDIT_1, NULL, NULL); 

     // Creo il pulsante 

     button = CreateWindow("Button","Calcola", 
           BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE, 
           260, 85, 150, 20,hWnd,(HMENU) ID_BUTTON,NULL,NULL); 

     long_edit = CreateWindow("Edit", "kjvh", 
           WS_BORDER | WS_CHILD | WS_VISIBLE, 
           5, 125, 250, 300, hWnd, (HMENU) ID_LONG_TEXT, NULL, NULL); 
    } 

    case WM_PAINT: 
    { 
     PAINTSTRUCT ps; 

     hdc = BeginPaint(hWnd, &ps); 

     SetTextColor(hdc, RGB(0,0,0)); 
     SetBkColor(hdc, RGB(255,255,255)); 

     TextOut(hdc, 5, 5, primo, sizeof(primo)); 
     TextOut(hdc, 5, 60, secondo, sizeof(secondo)); 

     EndPaint(hWnd, &ps); 

     break; 
    } 
    case WM_COMMAND: 
    { 
     if(edit_1 == NULL) 
     { 
      MessageBox(hWnd, "Errore", "Errore", uMsg); 
     } 

     if(LOWORD(wParam) == ID_BUTTON) 
     { 
      MessageBox(hWnd, "sgf", "ghgfrore", uMsg); 
      SetWindowText(edit_1, "lool"); 
     } 
     break; 
    } 
    case WM_DESTROY: 
     PostQuitMessage(0); 
     break; 
    default: 
     return DefWindowProc(hWnd, uMsg, wParam, lParam); 
     break; 
} 

return 0; 
} 

내 마음에 온 모든 노력을하지 가지고, 당신은 직접 볼 수 있지만, 나는 어떤 문제를 찾을 수없는 그 안에

+0

귀하의 질문에 분명한 것이 없습니다. 어떻게 선언하고 'edit_1'을 구합니까? –

+0

죄송합니다,이 포럼은 전체 파일을 게시 나에게 몇 가지 문제를했다지만, 그러나 edit_1 = CreateWindow 함수 ("편집", "sdgf" \t \t \t \t \t \t WS_BORDER | WS_CHILD | WS_VISIBLE는 \t \t \t \t \t \t 5, 85, 250, 20, hWnd, (HMENU) ID_EDIT_1, NULL, NULL); – DomeWTF

+2

1.'CreateWindow'가 성공 했습니까? 2.'SetWindowText'를 호출하는 경로를 사용하고 있습니까? 3. SetWindowText가 실패를 반환하는지 여부와 오류 코드를 설정하는지 여부를 확인 했습니까? – jamesdlin

답변

4

당신은 edit_1이 하나 이상의 범위에서 선언 된 것처럼 보입니다. 버튼을 만들 때 로컬을 선언하지만 참조와 다른 중괄호 블록에 있음을 알 수 있습니다. 따라서 초기화되지 않은 별도의 변수 edit_1이있을 수 있습니다.

업데이트 : 업데이트 된 코드는 원본과 약간 다르지만 문제는 여전히 존재합니다. edit_1은 WndProc에서 선언되었지만 WM_CREATE 콜백 중에 만 초기화됩니다. WM_COMMAND 콜백이 발생하면 (WndProc으로 별도의 호출) 초기화되지 않으므로 SetWindowText 호출이 임의의 창으로 이동하거나 더 이상 존재하지 않을 수 있습니다.

변수를 윈도우와 쉽게 연관시킬 수있는 프레임 워크를 사용하는 것이 좋습니다. 확실한 선택은 MFC 또는 ATL입니다. 범위, 지역 변수 또는 전역 변수 등을 이해하기 위해서는 C++에 대한 과외 학습이 필요합니다.

프레임 워크를 사용하지 않으면 변수를 전역으로 만들어이 코드를 사용할 수 있지만 그럴 수는 없습니다. 매우 단순한 프로그램보다 큰 규모로 확장 할 수 있습니다.

+0

CALLBACK 함수 위에 edit_1을 선언했습니다. 스위치에서 그 변수를 사용할 수 있습니까? – DomeWTF

+2

@DomeWTF, 지역 변수는 함수를 입력 할 때마다 다시 초기화됩니다. 이 메시지 루프를 떠나지 않으면 메시지가 작동하지만 콜백이라고 말할 수 있습니다. 변수를 클래스의 멤버로 만들거나 최악의 경우 정적으로 만들어야합니다. –

+0

WndProc인데, 나는 그걸두고 가지 않을 것이라고 생각합니다 ... 나는 틀렸어? – DomeWTF

관련 문제