如何在按钮单击时从win32 c ++中的文本框获取文本?

Posted

技术标签:

【中文标题】如何在按钮单击时从win32 c ++中的文本框获取文本?【英文标题】:How to get text from Text Box in win32 c++ on button click? 【发布时间】:2014-02-28 07:02:57 【问题描述】:

我对 win32 gui 应用程序非常陌生。我正在尝试创建简单的计算器应用程序。 我为计算器设计了一个 GUI。现在我想获取用户输入的文本框的文本,并且还想在单击我设计的任何按钮时设置文本从 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.我还想在文本框中显示按下按钮的标题。

所以请任何人帮助我找到纠正它的方法。

提前谢谢..

【问题讨论】:

这些窗口句柄是在窗口过程的范围内定义的,还是全局定义的?如果它们被定义在窗口过程的范围内,它们将在WM_CREATE 将控制权交还给操作系统后被释放。 是的,我在 WinProc 方法中编写了那些文本框句柄,这些句柄不是静态的。 . 【参考方案1】:

这应该会为您获取文本:

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

这些窗口句柄是在窗口过程的范围内定义的,还是全局定义的?如果它们被定义在窗口过程的范围内,在 WM_CREATE 将控制权交还给操作系统后,它们就会被遗忘。

如果它们是在窗口过程中定义的,请尝试:

static HWND hEditA, ...

编辑: 您还应该从WM_CREATE 处理程序中中断,因为它会落入您的WM_COMMAND 处理程序。

【讨论】:

不,先生。 . 还是不行。 . 仍然向我显示空的 msgbox。 . 耶耶耶。 . .谢谢先生。 .当我将这些文本框的句柄设置为静态时,它起作用了。 .但它提出了一个问题,为什么我们应该将这些句柄声明为静态的? @Sachin Ware 如果您希望它们在下次调用函数时保持其值,则当它们在函数范围内时,您将它们定义为静态。如果它们在全局范围内,则无需将它们声明为静态。这样做的原因是,当函数返回时,它们会释放所有本地定义的变量,除非它们被声明为静态的。 谢谢。 .我明白了。 .

以上是关于如何在按钮单击时从win32 c ++中的文本框获取文本?的主要内容,如果未能解决你的问题,请参考以下文章

在Win32(c ++)中的另一个进程中写入文本框

没有访问C:WINDOWSsystem32的权限

win32 C++上的按钮样式

如何在 Kivy 的相应文本输入区域中获取输出?

如何在 Access 2007 的窗体中实现点击按钮打开另一个窗体???

如何在单击按钮时暂停读取文本文件并在 mfc vc++ 中的单击按钮时恢复它?