Как получить текст из Text Box в Win32 C ++ по нажатию кнопки?

0

Я очень новичок в win32 gui applications. Я пытаюсь создать приложение простого калькулятора. В том, что я разработал графический интерфейс для калькулятора. Теперь я хочу получить текст текстового поля, введенный пользователем, а также хочу установить текст при нажатии любой кнопки, которую я создал от 0 до 9.

Для целей тестирования я написал код для получения текста из текстового поля и попытался отобразить его в окне сообщений. Но мой почтовый ящик показывает пустое сообщение. Ниже приведен мой код в WinProc:

LRESULT CALLBACK WinProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
    HDC hdc;
        PAINTSTRUCT ps;
        HWND B[16];// these are the saperate handles to each button in the main window.
        HWND hEditA,hEditB,hEditC;//handle for text box.
        char c[16][2]={"1","2","3","4","5","6","7","8","9","0","+","-","*","/",".","="};
        int i=0,j,x=100,y=130;
        int id[15]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
        int cnt;
        //char val[20];
        TCHAR val[30] = {0};
        int len;


        switch(msg)
        {
            case WM_PAINT:
                hdc=BeginPaint(hWnd,&ps);
                TextOut(hdc,10,12,"Number 1:",strlen("Number 1:")+1);
                TextOut(hdc,10,47,"Number 2:",strlen("Number 2:")+1);
                TextOut(hdc,10,87,"Result  :",strlen("Result  :")+1);
                //  TextOut(hdc,10,100,"hellow sachin",strlen("hello sachin")+1);
                EndPaint(hWnd,&ps);
                break;

            case WM_DESTROY:
                PostQuitMessage (0);
                break;

            case WM_CREATE:

                            hEditA=CreateWindow(TEXT("Edit"), TEXT(""), WS_CHILD | WS_VISIBLE | WS_BORDER|ES_NUMBER|ES_RIGHT, 100, 10, 150, 25, hWnd, NULL, NULL, NULL);
                            hEditB=CreateWindow(TEXT("Edit"), TEXT(""), WS_CHILD | WS_VISIBLE | WS_BORDER|ES_NUMBER|ES_RIGHT, 100, 45, 150, 25, hWnd, NULL, NULL, NULL);
                            hEditC=CreateWindow(TEXT("Edit"), TEXT(""), WS_CHILD | WS_VISIBLE | WS_BORDER|ES_NUMBER|ES_RIGHT, 100, 85, 150, 25, hWnd, NULL, NULL, NULL);
                            cnt=0;
                            for(i=0;i<16;i++)
                            {
                                if(cnt==4)
                                {
                                    y=y+40;
                                    x=100;
                                    cnt=0;


                                }

                                if(cnt<4)
                                {
                                    B[i] =   CreateWindow(TEXT("button"), TEXT(c[i]),    
                                         WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,
                                         x, y, 30, 30,        
                                         hWnd, (HMENU) id[i], NULL, NULL);
                                    x=x+40;
                                    //y=y+30;
                                    cnt++;

                                }
                            }

            case WM_COMMAND:

                    switch(LOWORD(wParam))
                    {
                        case 1:
                                len=GetWindowText( hEditA,val,10);
                               MessageBox(hWnd,(LPSTR)val, "Info", MB_OK); 
                                SetWindowText( hEditB,val);




                               break;
                                    }
    }
}

B. Я также хочу отобразить заголовок кнопки, нажатой в текстовом поле.

Поэтому, пожалуйста, кто-нибудь может помочь мне найти способ исправить это.

спасибо заранее.

  • 0
    Определены ли эти дескрипторы окна в области действия оконной процедуры или глобально? Если они определены в области действия оконной процедуры, они будут освобождены после того, как WM_CREATE вернет управление операционной системе.
  • 0
    Да, я написал эти дескрипторы текстовых полей в методе WinProc, и они не были статичными. ,
Теги:
winapi
win32com

1 ответ

2
Лучший ответ

Это должно получить текст для вас:

SendMessage(hEditA, WM_GETTEXT, (WPARAM)10, (LPARAM)val);

Являются ли эти дескрипторы окон определенными в области оконной процедуры или глобальными? Если они определены в области оконной процедуры, они будут забыты после того, как WM_CREATE вернет управление операционной системе.

Если они определены в процедуре окна, попробуйте:

static HWND hEditA, ...

РЕДАКТИРОВАТЬ: вы также должны выйти из вашего обработчика WM_CREATE, так как он попадет на ваш обработчик WM_COMMAND.

  • 0
    Нет, сэр . До сих пор это не работает. . пока он показывает мне пустую msgbox. ,
  • 0
    Даааааа. , Спасибо, сэр. Это сработало, когда я сделал дескрипторы этих текстовых полей статическими. , Но это заставило задать вопрос, почему мы должны объявлять эти дескрипторы как статические?
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню