• 20.控件(二)


    1.编辑框

      (1)相关信息

         从风格可以将编辑框分成几类:

           单行编辑框 - 只能处理一行文字

           多行编辑框 - 可以显示多行文字

           密码编辑框 - 密码输入ES_PASSWORD

      (2)使用

         a.创建

           窗口类名称 - EDIT

         b.窗口消息

           设置编辑框的文本内容

           WM_SETTEXT:wPARAM - 不使用,必须为0

                   lPARAM - 准备设置的文本内容字符的缓冲区首地址

           获取编辑框的文本内容

                        WM_GETTEXT:wPARAM - 缓冲区大小

                                               lPARAM - 接手编辑框文本内容的容缓冲区首地址

           获取编辑框的文本长度

           WM_GETTEXTLENGTH:wPARAM/lPARAM  - 都没用,必须为0

           编辑框文本内容的长度通过SendMessage函数的返回值获取       

         c.通知消息

           EN_CHANGE - 当编辑框内的文字被修改,通知父窗口

      (3)练习

         添加两个菜单项,“保存” - 将编辑框中文本内容写入“c:/my.txt”,“打开” - 将“c:/my.txt”文件中内容显示到编辑框中,

         编辑框和主窗口的大小实时保持一致。

      相关代码:    

    #include "stdafx.h"
    #include "stdio.h"
    
    HINSTANCE g_hInstance = 0;  //接收当前程序实例句柄
    
    void OnCreate(HWND hWnd)
    {
        HWND hEdit = CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "", 
            WS_VISIBLE|WS_CHILD|ES_MULTILINE|ES_AUTOHSCROLL|ES_AUTOVSCROLL|WS_HSCROLL|WS_VSCROLL,
            0, 0, 200, 200, hWnd, (HMENU)1001, g_hInstance, NULL);
        HFONT hFont = CreateFont(30, 0, 0, 0, 900, 0, 0, 0, GB2312_CHARSET, 0, 0, 0, 0, "黑体");
        SendMessage(hEdit, WM_SETFONT, (WPARAM)hFont, 1);
    }
    void OnSize(HWND hWnd, LPARAM lParam)
    {
        int nWidth = LOWORD(lParam);
        int nHeight = LOWORD(lParam);
        HWND hEdit = GetDlgItem(hWnd, 1001);
        MoveWindow(hEdit, 0, 0, nWidth, nHeight, TRUE);
    }
    void OnSave(HWND hWnd)
    {
        HWND hEdit = GetDlgItem(hWnd, 1001);
        LRESULT nLen = SendMessage(hEdit, WM_GETTEXTLENGTH, 0, 0);
        char *pszText = (char*)malloc(nLen + 1);
        memset(pszText, 0, nLen + 1);
        SendMessage(hEdit, WM_GETTEXT, nLen + 1, (LPARAM)pszText);
        
        FILE *pFile = NULL;
        fopen_s(&pFile, "d:/my.txt", "w");
        fwrite(pszText, 1, nLen, pFile);
        fclose(pFile);
    
        free(pszText);
    
        SetWindowText(hWnd, "window");
    }
    void OnOpen(HWND hWnd)
    {
        FILE *pFile = NULL;
        fopen_s(&pFile, "d:/my.txt", "r");
        fseek(pFile, 0, SEEK_END);
        long nLen = ftell(pFile);
        char *pszText = (char*)malloc(nLen + 1);
        memset(pszText, 0, nLen + 1);
        fseek(pFile, 0, SEEK_SET);
        fread(pszText, 1, nLen, pFile);
        fclose(pFile);
        HWND hEdit = GetDlgItem(hWnd, 1001);
        SendMessage(hEdit, WM_SETTEXT, 0, (LPARAM)pszText);
        free(pszText);
    }
    void OnCommand(HWND hWnd, WPARAM wParam)
    {
        switch (LOWORD(wParam))
        {
        case 1001:
            if (EN_CHANGE == HIWORD(wParam))  //文本内容改变,产生EN_CHANGE通知消息
            {
                SetWindowText(hWnd, "window *");
            }
            break;
        case ID_SAVE:
            OnSave(hWnd);//保存功能
            break;
        case ID_OPEN:
            OnOpen(hWnd);//打开功能
            break;
        }
    }
    //窗口处理函数
    LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
        switch (msg)
        {
        case WM_CTLCOLOREDIT:
            {
                HDC hdcEdit = (HDC)wParam;  //wParam就是编辑框的绘图设备
                SetTextColor(hdcEdit, RGB(255, 0, 0));
                SetBkColor(hdcEdit, RGB(0,255, 0));
                return (LRESULT)CreateSolidBrush(RGB(0,255, 0));
            }    
            break;
        case WM_COMMAND:
            OnCommand(hWnd, wParam);
            break;
        case WM_SIZE:
            OnSize(hWnd, lParam);
            break;
        case WM_CREATE:
            OnCreate(hWnd);
            break;
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        }
        return DefWindowProc(hWnd, msg, wParam, lParam);
    }
    //注册窗口类
    BOOL Register(LPSTR lpClassName, WNDPROC wndProc)
    {
        WNDCLASSEX wce = { 0 };
    
        wce.cbSize = sizeof(wce);
        wce.cbClsExtra = 200;
        wce.cbClsExtra = 200;
        wce.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
        wce.hCursor = NULL;
        wce.hIcon = NULL;
        wce.hIconSm = NULL;
        wce.hInstance = g_hInstance;
        wce.lpfnWndProc = wndProc;
        wce.lpszClassName = lpClassName;
        wce.lpszMenuName = NULL;
        wce.style = CS_HREDRAW | CS_VREDRAW;
    
        ATOM nAtom = RegisterClassEx(&wce);
        if (0 == nAtom)
        {
            return FALSE;
        }
        return TRUE;
    }
    //创建主窗口
    HWND CreateMainWindow(LPSTR lpClassName, LPSTR lpWndName)
    {
        HMENU hMenu = LoadMenu(g_hInstance, MAKEINTRESOURCE(IDR_MENU1));
        HWND hWnd = CreateWindowEx(0, lpClassName, lpWndName, WS_OVERLAPPEDWINDOW,
            CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
            NULL, hMenu, g_hInstance, NULL);
        return hWnd;
    }
    //显示窗口
    void Display(HWND hWnd)
    {
        ShowWindow(hWnd, SW_SHOW);
        UpdateWindow(hWnd);
    }
    //消息循环
    void Message()
    {
        MSG nMsg = { 0 };
        while (GetMessage(&nMsg, NULL, 0, 0))
        {
            TranslateMessage(&nMsg);
            DispatchMessage(&nMsg);
        }
    }
    
    int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
    {
        g_hInstance = hInstance;
        Register("Main", WndProc);
        HWND hWnd = CreateMainWindow("Main", "window");
        Display(hWnd);
        Message();
    
        return 0;
    }
    View Code

      运行结果:

        

    2.组合框(窗口类COMBOBOX)

      (1)分类

         简单组合框:CBS_SIMPLE

         下拉式组合框:可以输入,CBS_DROPDOWN

         下拉列表式组合框:只能从选项中选择,CBS_DROPDOWNLIST

      (2)使用

         a.创建

         b.添加选项

           CB_ADDSTRING:wPARAM - 不使用

                     lPARAM - 字符指针

           CB_INSERTSTRING   

         c.删除选项

           CB_DELETESTRING:删除指定项,wPARAM - 选项索引

                            lPARAM - 字符串指针      

           CB_RESETCONTENT:清除所有选项

         d.获取和设置选项

           CB_GETCURSEL:获取选择项索引

                     wPARAM/lPARAM都没有用,选择项索引通过SendMessage函数的返回值获取

           CB_SETCURSEL:设置当前被选择项

         e.匹配查找选项

           CB_FINDSTRING:根据字符串查找选择项,从选项的起始字符查找包含字符串

           CB_FINDSTRINGEXACT:匹配查找的字符串

           CB_SELECTSTRING:查找并设置成当前被选择项

         f.获取选项的字符

           CB_GETLBTEXTLEN:获取选项字符串的长度

           CB_GETLBTEXT:获取选项的内容,wPARAM - 选项索引

                                                                        lPARAM - 接受文本内容的buff的首地址

           WM_GETTEXT

         g.目录的显示

           CB_DIR:在组合框中显示指定路径下的文件和子目录

         h.选项的附加数据

           在每个选项中,可以保存自定义的数据

           CB_SETITEMDATA:将数据保存到指定项,wPARAM - 选项索引

                                lPARAM - 具体的附加数据

           CB_GETITEMDATA:从指定项获取数据,wPARAM - 选项索引

                                lPARAM - 没用

             附加数据通过SendMessage函数的返回值获取

      (3)通知消息

         CBN_SELCHANGE:当前选择项发生变化后,通知父窗口

         CBN_EDITCHANGE:当输入发生变化后

      相关代码: 

    #include "stdafx.h"
    #include "stdio.h"
    
    HINSTANCE g_hInstance = 0;  //接收当前程序实例句柄
    
    void OnCreate(HWND hWnd)
    {
        CreateWindowEx(0, "COMBOBOX", "simple", 
            WS_CHILD|WS_VISIBLE|CBS_SIMPLE|WS_VSCROLL,
            50, 50, 200, 200, hWnd, (HMENU)1001, g_hInstance, NULL);
    
        CreateWindowEx(0, "COMBOBOX", "Dropdown", 
            WS_CHILD | WS_VISIBLE | CBS_DROPDOWN|WS_VSCROLL,
            260, 50, 200, 200, hWnd, (HMENU)1002, g_hInstance, NULL);
    
        CreateWindowEx(0, "COMBOBOX", "DropdownList", 
            WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST|WS_VSCROLL,
            470, 50, 200, 200, hWnd, (HMENU)1003, g_hInstance, NULL);
    }
    void OnAddItem(HWND hWnd)
    {
        HWND hSimple = GetDlgItem(hWnd, 1001);
        HWND hDropdown = GetDlgItem(hWnd, 1002);
        HWND hDropdownList = GetDlgItem(hWnd, 1003);
        
        for (int i = 0; i < 20; i++)
        {
            char szItem[256] = { 0 };
            sprintf_s(szItem, "Item%d", i);
            //添加选项
            //wParam没用,lParam表示要添加的选项字符串
            SendMessage(hSimple, CB_ADDSTRING, 0, (LPARAM)szItem);
            SendMessage(hDropdown, CB_ADDSTRING, 0, (LPARAM)szItem);
            SendMessage(hDropdownList, CB_ADDSTRING, 0, (LPARAM)szItem);
    
            //设置附加数据
            SendMessage(hSimple, CB_SETITEMDATA, i, 1000+i);
        }
        //设置选项
        //wParam表示要设置的选项索引,lParam没用
        SendMessage(hSimple, CB_SETCURSEL, 0, 0);
        SendMessage(hDropdown, CB_SETCURSEL, 1, 0);
        SendMessage(hDropdownList, CB_SETCURSEL, 2, 0);
    }
    
    void OnCleanItem(HWND hWnd)
    {
        HWND hSimple = GetDlgItem(hWnd, 1001);
        HWND hDropdown = GetDlgItem(hWnd, 1002);
        HWND hDropdownList = GetDlgItem(hWnd, 1003);
        //清空选项
        //wParam和lParam都没用
        SendMessage(hSimple, CB_RESETCONTENT, 0, 0);
        SendMessage(hDropdown, CB_RESETCONTENT, 0, 0);
        SendMessage(hDropdownList, CB_RESETCONTENT, 0, 0);
    }
    
    void OnDelItem(HWND hWnd)
    {
        HWND hSimple = GetDlgItem(hWnd, 1001);
        HWND hDropdown = GetDlgItem(hWnd, 1002);
        HWND hDropdownList = GetDlgItem(hWnd, 1003);
        //获得当前选项
        //wParam/lParam都没用,返回值为当前的选中项
        LRESULT nSimple = SendMessage(hSimple, CB_GETCURSEL, 0, 0);
        LRESULT nDropdown = SendMessage(hDropdown, CB_GETCURSEL, 0, 0);
        LRESULT nDropdownList = SendMessage(hDropdownList, CB_GETCURSEL, 0, 0);
        //删除指定的选项
        //wParam为要删除的选项索引,lParam没用
        SendMessage(hSimple, CB_DELETESTRING, nSimple, 0);
        SendMessage(hDropdown, CB_DELETESTRING, nDropdown, 0);
        SendMessage(hDropdownList, CB_DELETESTRING, nDropdownList, 0);
    }
    
    void OnMatch(HWND hWnd)
    {
        HWND hSimple = GetDlgItem(hWnd, 1001);
        char szText[] = "Item10";
    
        /*
        CB_FINDSTRING - 非精确匹配查找,可以不全,但不能错
        CB_FINDSTRINGEXACT - 精确匹配查找,必须完全正确
        CB_SELECTSTRING - 非精确匹配,并把匹配到的选项设置为当前选择项
        */
        //wParam表示从哪个选项之后开始匹配,lParam表示要匹配的字符串
        //成功返回选项的索引,失败返回CB_ERR(-1)
        LRESULT nMatched = SendMessage(hSimple, CB_FINDSTRING, -1, (LPARAM)szText);
        if (CB_ERR != nMatched)
        {
            char szMatched[256] = { 0 };
            sprintf_s(szMatched, "匹配到的选项:%d", nMatched);
            MessageBox(hWnd, szMatched, "Info", MB_OK);
        }
        else
        {
            MessageBox(hWnd, "匹配失败", "Info", MB_OK);
        }
    }
    
    void OnText(HWND hWnd)
    {
        HWND hSimple = GetDlgItem(hWnd, 1001);
        LRESULT nSelected = SendMessage(hSimple, CB_GETCURSEL, 0, 0);
        char szText[256] = { 0 };
        SendMessage(hSimple, CB_GETLBTEXT, nSelected, (LPARAM)szText);
        MessageBox(hWnd, szText, "Info", MB_OK);
    
        char szInput[256] = { 0 };
        SendMessage(hSimple, WM_GETTEXT, 256, (LPARAM)szInput);
        MessageBox(hWnd, szInput, "Info", MB_OK);
    }
    
    void OnData(HWND hWnd)
    {
        HWND hSimple = GetDlgItem(hWnd, 1001);
        LRESULT nSelected = SendMessage(hSimple, CB_GETCURSEL, 0, 0);
        LRESULT nData = SendMessage(hSimple, CB_GETITEMDATA, nSelected, 0);
        char szData[256] = { 0 };
        sprintf_s(szData, "附加数据:%d", nData);
        MessageBox(hWnd, szData, "Info", MB_OK);
    }
    
    void OnCommand(HWND hWnd, WPARAM wParam)
    {
        switch (LOWORD(wParam))
        {
        case 1001:
            if (CBN_SELCHANGE == HIWORD(wParam))
            {
                HWND hSimple = GetDlgItem(hWnd, 1001);
                HWND hDropdown = GetDlgItem(hWnd, 1002);
                HWND hDropdownList = GetDlgItem(hWnd, 1003);
                LRESULT nSelectd = SendMessage(hSimple, CB_GETCURSEL, 0, 0);
                SendMessage(hDropdown, CB_SETCURSEL, nSelectd, 0);
                SendMessage(hDropdownList, CB_SETCURSEL, nSelectd, 0);
            }
            if (CBN_EDITCHANGE == HIWORD(wParam))
            {
                MessageBox(hWnd, "内容有变化", "Info", MB_OK);
            }
            break;
        case ID_ADDITEM:
            OnAddItem(hWnd);//添加选项
            break;
        case ID_CLEAN:
            OnCleanItem(hWnd);//清空选项
            break;
        case ID_DELITEM:
            OnDelItem(hWnd);//删除选项
            break;
        case ID_MATCH:
            OnMatch(hWnd);//匹配选项
            break;
        case ID_TEXT:
            OnText(hWnd);//选项内容
            break;
        case ID_DATA:
            OnData(hWnd);//附加数据
            break;
        }
    }
    
    //窗口处理函数
    LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
        switch (msg)
        {
        case WM_COMMAND:
            OnCommand(hWnd, wParam);
            break;
        case WM_CREATE:
            OnCreate(hWnd);
            break;
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        }
        return DefWindowProc(hWnd, msg, wParam, lParam);
    }
    
    //注册窗口类
    BOOL Register(LPSTR lpClassName, WNDPROC wndProc)
    {
        WNDCLASSEX wce = { 0 };
    
        wce.cbSize = sizeof(wce);
        wce.cbClsExtra = 200;
        wce.cbClsExtra = 200;
        wce.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
        wce.hCursor = NULL;
        wce.hIcon = NULL;
        wce.hIconSm = NULL;
        wce.hInstance = g_hInstance;
        wce.lpfnWndProc = wndProc;
        wce.lpszClassName = lpClassName;
        wce.lpszMenuName = NULL;
        wce.style = CS_HREDRAW | CS_VREDRAW;
    
        ATOM nAtom = RegisterClassEx(&wce);
        if (0 == nAtom)
        {
            return FALSE;
        }
        return TRUE;
    }
    
    //创建主窗口
    HWND CreateMainWindow(LPSTR lpClassName, LPSTR lpWndName)
    {
        HMENU hMenu = LoadMenu(g_hInstance, MAKEINTRESOURCE(IDR_MENU1));
        HWND hWnd = CreateWindowEx(0, lpClassName, lpWndName, WS_OVERLAPPEDWINDOW,
            CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
            NULL, hMenu, g_hInstance, NULL);
        return hWnd;
    }
    
    //显示窗口
    void Display(HWND hWnd)
    {
        ShowWindow(hWnd, SW_SHOW);
        UpdateWindow(hWnd);
    }
    
    //消息循环
    void Message()
    {
        MSG nMsg = { 0 };
        while (GetMessage(&nMsg, NULL, 0, 0))
        {
            TranslateMessage(&nMsg);
            DispatchMessage(&nMsg);
        }
    }
    
    int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
    {
        g_hInstance = hInstance;
        Register("Main", WndProc);
        HWND hWnd = CreateMainWindow("Main", "window");
        Display(hWnd);
        Message();
    
        return 0;
    }
    View Code

      运行结果:

      

    3.列表框

      (1)分类

         单列列表框 - 默认

         多列列表框 - LBS_MULTCOLUMN

      (2)使用

         a.创建

           窗口类 - LISTBOX

         b.添加选项

           LB_ADDSTRING - 追加

           LB_INSERTSTRING - 按指定位置添加

         c.删除选项

           LB_DELETESTRING - 删除指定项

           LB_RESETCONTENT - 清空所有项

         d.获取和设置选择项

           LB_GETCURSEL - 获取选择项索引

           LB_SETCURSEL - 设置选择项

         e.匹配查找

           LB_FINDSTRING - 非精确匹配

           LB_FINDSTRINGEXACT - 精确匹配

           LB_SELECTSTRING - 非精确匹配,并把匹配到的选项设置为当前选择项

         f.获取选项文本内容

           LB_GETTEXT - 获得选项文本

           LB_GETTEXTLEN - 获取选项文本内容长度

         g.附加数据

           LB_SETITEMDATA - 设置附加数据

           LB_GETITEMDATA - 获得附加数据

      (3)通知消息

         LB_SELCHANGE - 当选择项发生变化后,依附于WM_COMMAND消息发送到父窗口的窗口处理函数中

           

           

  • 相关阅读:
    linux内核系统调用和标准C库函数的关系分析
    Linux下内存映射文件的用法简介
    Hi35xx 通用GPIO 使用篇(板子3G电源控制脚说明)
    关于Linux用户名
    关于ARGB_8888、ALPHA_8、ARGB_4444、RGB_565的理解
    PixelFormat 图像颜色的数据格式
    Ubuntu 搭建svn服务器 ,以及常见错误解决方案
    安装VisualSVN Server 报错The specified TCP port is occupied
    SVN服务器搭建和使用(三)
    SVN服务器搭建和使用(二)
  • 原文地址:https://www.cnblogs.com/csqtech/p/5651692.html
Copyright © 2020-2023  润新知