| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2124 人关注过本帖
标题:请教WIN32程序无法获取EDIT控件内容的问题
只看楼主 加入收藏
yuelaiyuehei
Rank: 2
等 级:论坛游民
威 望:1
帖 子:12
专家分:15
注 册:2008-4-17
收藏
 问题点数:0 回复次数:1 
请教WIN32程序无法获取EDIT控件内容的问题
WIN32窗口,
逻辑:通过EDIT编辑框控件输入一个数或一串字符,
再用SendMessage(edit1,WM_GETTEXT,10, (LPARAM)sss);获取输入的数据,存入SSS数组中;
再用TextOut将存入的数据显示出来。
但是无论如何都无法获取控件输入的内容,显示出来的始终屎乱码,感觉SendMessage(edit1,WM_GETTEXT,10, (LPARAM)sss);无效,
帮我看看那里错了?

代码:

程序代码:
#include <windows.h>
//回调函数.............................................................................

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    TCHAR sss[100];
    HWND edit1;    
    HWND an1;                                                        //定义输出设备句柄 
    switch(uMsg)                                                   //消息选择
    {                                                               
    case WM_COMMAND:
     {  
        switch(LOWORD(wParam))                                         //点击不同的控件显示,走不同的处理路径 
        {  
        case 101:           
            {
            MessageBox(hwnd,"提交成功","恭喜",MB_OK|MB_ICONINFORMATION);
            SendMessage(edit1,WM_GETTEXT,10, (LPARAM)sss);          //获取控件内容
            UpdateWindow(hwnd);
            break; 
            }
        default:  
            break;*/ 
        return 0;           
        } 
    return 0;     
    }  
    case WM_DESTROY:                                                     //当前窗口被销毁时
        PostQuitMessage(0);                                              //发出退出程序的消息
        return 0;                                                        //如果处理了该消息, 就返回 0 来告知 Windows
 
    case WM_CLOSE:                                                       //当用户点击窗口右上角的关闭按钮时
        DestroyWindow(hwnd);                                             //销毁窗口
        return 0; 
    case WM_CREATE:                                                      //按钮创建 
        {

        edit1 = CreateWindow("EDIT",NULL, WS_CHILD|WS_VISIBLE|WS_BORDER,  220, 30, 100,25,hwnd,(HMENU)201, NULL, NULL); //创建编辑框控件

        an1 = CreateWindow("button","提交",WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,340,30,50,25,hwnd,(HMENU)101,NULL,NULL);    //创建按钮控件 
        return 0;
        }

    case WM_PAINT:                                                       //当窗口需要重绘时
        {   
            //RECT rect;                                                 //定义一块显示区域,DrawText 函数需要的参数 
            PAINTSTRUCT ps = {0};                                        //定义一个 数组存放字符串 
            hdc = BeginPaint(hwnd,&ps);                                  //开始重绘
/******************************************核心程序代码区******************************************************************/        
        SetTextColor(hdc, RGB(255,0,0));                                 //设置字体颜色
        Rectangle(hdc,2,2,818,555);
        Rectangle(hdc,10,90,810,550);                                       //画框,必须在正文之前显示框,否则正文会被覆盖 
        Rectangle(hdc,10,10,810,80);                                     //画框 

        TextOut(hdc,100,30,TEXT("请输入参数A的值:"),16);                                  
        TextOut(hdc,450,30,sss,10);


 /******************************************核心程序代码区******************************************************************/           
            EndPaint(hwnd,&ps);                                         //结束重绘
            return 0;
        }
   
    default:
            return DefWindowProc(hwnd, uMsg, wParam, lParam);   

 }
}


运行结果
图片附件: 游客没有浏览图片的权限,请 登录注册

图片附件: 游客没有浏览图片的权限,请 登录注册

无论输入什么,显示出来都是乱码
搜索更多相关主题的帖子: 控件 HWND 显示 case return 
2019-09-17 22:57
yuelaiyuehei
Rank: 2
等 级:论坛游民
威 望:1
帖 子:12
专家分:15
注 册:2008-4-17
收藏
得分:0 
自己解决了,换了一个提取函数,修改了回调函数中的BREAK和RETURN.顺利运行

程序代码:
#include <windows.h>
//#include <stdlib.h>

#define IDC_EDIT1    201               //自定义控件识别号
#define IDC_EDIT2    202
#define IDC_STATIC   301
#define IDC_BTN1     101

//回调函数.............................................................................

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    
    static TCHAR sss[256];                  //不同的case分支之间传值一定要定义全局变量,否则会出错 
    static TCHAR sss1[256]; 
    static int len,size,i,j,x=10,y=200;
    static double sun;
    TCHAR  szText[256]; 
    HWND edit1,edit2;    
    HWND an1;
    HWND sta1;                                                    
    switch(uMsg)                          //消息分支选择,注意SWITCH-CASE结构中,BREAK代表跳出当前SWITCH,RETURN代表结束整个函数。 
    {                                                               
    case WM_COMMAND:
     {  
        switch(LOWORD(wParam))                                         //点击不同的控件显示,走不同的处理路径 
        {  
        case IDC_BTN1:                                              //点击按钮1触发消息         
            {
            //MessageBox(hwnd,"提交成功","提示",MB_OK|MB_ICONINFORMATION);
            len=GetDlgItemText(hwnd,IDC_EDIT1,sss,255);              //获取控件内容函数 ,返回值为控件文本字节长度 
            //MessageBox(hwnd,sss,"输入内容",MB_OK);
            GetDlgItemText(hwnd,IDC_EDIT2,sss1,255); 
            
            
            sun=atof(sss)+atof(sss1);                                       
/*处理数据输入和涉及到数字运算用这个函数转换数据类型:【atof()】是把字符串转换成整型数的一个函数,扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时('\0')才结束转换,并将结果返回.默认返回类型为double类型,包含在头文件stdlib.h中。反方向函数为itoa()将整数转换成字符串*/
            
            InvalidateRect(hwnd,NULL,TRUE);                             //发送刷新指令 ,这个很关键。要不然窗口不会及时显示结果。。 
            }
            break;
        default:  
            break;      
        } 
        break;     
    } 
    break;
    case WM_DESTROY:                                                     //当前窗口被销毁时
        PostQuitMessage(0);                                              //发出退出程序的消息
        break;                                                        

 
    case WM_CLOSE:                                                       //右上角关闭按钮消息 
        DestroyWindow(hwnd);                                             //销毁窗口
        break;
    case WM_CREATE:                                                      //控件创建消息 
        {
        edit1 = CreateWindow("EDIT",NULL, WS_CHILD|WS_VISIBLE|WS_BORDER,  220, 30, 100,25,hwnd,(HMENU)IDC_EDIT1, NULL, NULL);  //创建编辑框控件

        edit2 = CreateWindow("EDIT",NULL, WS_CHILD|WS_VISIBLE|WS_BORDER,  220, 60, 100,25,hwnd,(HMENU)IDC_EDIT2, NULL, NULL);  //创建编辑框控件

        an1 = CreateWindow("button","计算",WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,340,60,50,25,hwnd,(HMENU)IDC_BTN1,NULL,NULL);     //创建按钮控件 
    
        //sta1= CreateWindow("STATIC","+",WS_CHILD|WS_VISIBLE|SS_CENTER,70,10,300,200,hwnd,(HMENU)IDC_STATIC,NULL,NULL); //创建静态文本框控件,画布,美化作用,下一步再深入研究        
        }
        break;
    case WM_PAINT:                                                      //【重绘窗口函消息 】 
        {   
        HDC hdc;                                                        //定义输出设备句柄 
        //RECT rect;                                                    //定义一块显示区域,DrawText 函数需要的参数 
        PAINTSTRUCT ps = {0};                                           //定义一个 数组存放字符串 
        hdc = BeginPaint(hwnd,&ps);                                     //开始重绘

/******************************************核心程序代码区******************************************************************/        
        SetTextColor(hdc, RGB(255,0,0));                                //设置字体颜色
        Rectangle(hdc,2,2,818,555);
        Rectangle(hdc,10,190,810,550);                                  //画矩形,必须在正文之前显示框,否则正文会被覆盖 
        
        
        TextOut(hdc,350,200,TEXT("九九乘法表"),10);                     //直接文本显示                                              
        for(i=1;i<=9;i++)
            for(j=1;j<=i;j++) {                              
            size = wsprintf(szText,TEXT("%d×%d=%2d"),j,i,i*j);          //将变量S,I的值按照格式符号%s%d转换后存入缓冲区szText,返回值为字节长度 
            /*注意:因为 wsprintf不支持浮点数,所以处理高精度数据计算式要用 swprintf代替*/ 
            TextOut(hdc,x+j*80,y+i*25, szText,size);
            }
        
        TextOut(hdc,650,530,TEXT("小狗WINDOWS小程序"),17);    
        Rectangle(hdc,10,10,810,180);                                     //矩形(美化类函数,形成边框效果) 
        TextOut(hdc,450,30,TEXT("简单的WIN32窗口框架,能够实现输入和显示"),39);
        TextOut(hdc,100,30,TEXT("请输入参数A的值:"),16);
        TextOut(hdc,100,60,TEXT("请输入参数B的值:"),16);
        TextOut(hdc,100,90,TEXT("A+B=           :"),len);         
        /*显示数字用以下代码*/ 
        size = sprintf(szText,TEXT("%.4lf"),sun);
        TextOut(hdc,220,90,szText,size);          
        /*显示文字或字母用以下代码 
        TextOut(hdc,550,30,sss,len);*/

 /******************************************核心程序代码区******************************************************************/           
            EndPaint(hwnd,&ps);                                         //结束重绘        
        }
           break;
    default:
            return DefWindowProc(hwnd, uMsg, wParam, lParam);   

 }

 return 0;
}

/*********************************************以下为主窗口函数**********************************************************************/
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
WNDCLASSEX wzgwind = {0};                                                 //窗口类结构, 为注册窗口类作准备
    wzgwind.cbSize = sizeof(wzgwind);                                     //WNDCLASSEX结构的大小
    wzgwind.cbWndExtra = 0;                                               //窗口额外内存, 没有, 设为0
    wzgwind.hbrBackground = COLOR_WINDOW;                                 //使用系统默认背景 
    //wzgwind.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);         //窗口背景, 这里使用灰色背景(另一种表示法) 
    wzgwind.hCursor = LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW));       //应用程序使用的鼠标类型
    wzgwind.hIcon = LoadIcon(NULL, MAKEINTRESOURCE(IDI_APPLICATION));     //光标类型
    wzgwind.hIconSm = NULL;                                               //应用程序程序的小光标, 不管, 设为 NULL
    wzgwind.hInstance = hInstance;                                        //应用程序程序实例句柄, 由 WinMain 函数传递过来
    wzgwind.lpfnWndProc = WndProc;                                        //这个很重要, 就是当前窗口的消息处理函数, 传递 WndProc 的地址
    wzgwind.lpszClassName = "wzgwind";                                    //创建类时使用的类名, 可以自定义
    wzgwind.lpszMenuName = NULL;                                          //菜单, 没有, 就使用 NULL
    wzgwind.style = CS_HREDRAW | CS_VREDRAW;                              //类的风格, 垂直重绘, 水平重绘

ATOM nAtom = RegisterClassEx(&wzgwind);
    if (!nAtom )
    {
        MessageBox(NULL, "注册失败", "Infor", MB_OK);
        return 0;
    }

HWND hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,"wzgwind","win-gou",WS_VISIBLE|WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT,                                                     /* x */
        CW_USEDEFAULT,                                                     /* y */
        840,                                                               /* width */
        600,                                                               /* height */
        NULL,NULL,hInstance,NULL);



ShowWindow(hwnd,nCmdShow);

UpdateWindow(hwnd);

MSG msg = { 0 };                                                          //定义并初始化msg
    while( msg.message != WM_QUIT )                                          //使用while循环,如果消息不是WM_QUIT消息,就继续循环
    {
        if( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) )                      //查看应用程序消息队列,有消息时将队列中的消息派发出去。
        {
            TranslateMessage( &msg );                                      //将虚拟键消息转换为字符消息
            DispatchMessage( &msg );                                      //分发一个消息给窗口程序。
        }
    }

UnregisterClass("wzgwind", wzgwind.hInstance);
return 0;
} 

2019-09-18 23:55
快速回复:请教WIN32程序无法获取EDIT控件内容的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.044071 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved