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; }
运行结果:
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; }
运行结果:
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消息发送到父窗口的窗口处理函数中