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消息发送到父窗口的窗口处理函数中

       

       

原文地址:https://www.cnblogs.com/csqtech/p/5651692.html