2012-11-28 106 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的未初始化的单独变量。

UPDATE:你更新的代码比原来的略有不同,但问题依然存在。 edit_1在WndProc中声明,但仅在WM_CREATE回调期间初始化。当发生WM_COMMAND回叫(对WndProc的单独呼叫)时,它将被初始化,因此您的SetWindowText呼叫将进入随机窗口,或更可能无处。

我建议你使用一个框架,它可以很容易地保持与窗口相关联的变量。明显的选择是MFC或ATL。您可能还需要在C++上进行一些辅导,以了解范围,本地变量和全局变量等。

使用框架的缺点,您可能通过使变量成为全局变量来工作,但不会扩展到比非常简单的程序更大

+0

我已经在CALLBACK函数之上声明了edit_1,我应该能够在交换机中使用该变量,我错了吗? – DomeWTF

+2

@DomeWTF,每次输入函数时都会重新初始化本地变量。如果这是一个消息循环,你永远不会离开它可能工作,但你说这是一个回调。你需要让变量成为一个类的成员,或者最坏的情况是静态的。 –

+0

它是WndProc,我不认为我永远不会离开它...我错了? – DomeWTF