界面展示
我们利用前面所学的知识做一个图形界面的通信录,如下所示
利用listview做通信录信息的显示
然后添加4个按钮,添加,删除,修改和查询
点击添加和修改按钮会弹出 dialog窗口,进行编辑
输入信息后,
点击确定,则完成操作
代码实例
主要界面代码实例
//主窗口回调函数
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
/*回调函数
参数:
hwnd : 窗口句柄
message : 消息ID
wParam和lParam:消息参数*/
HDC hdc;
static TCHAR szBuffer[128];
static HWND childHwnd; //子窗口句柄
static HWND hBtn, hBtn2, hBtn3, hBtn4;
static int i,szlist;
PAINTSTRUCT ps;
static HWND hListview;
static LV_COLUMN lvc;//LVCOLUMN结构体,定义listview的列属性
static LVITEM vitem;//LVITEM结构体,定义listview的项的数据属性
static int idComboBox;
int n,wmId, wmEvent;
//static int nSelectItem;
int nSelectIndex;
init(&contactlist);//初始化通信录
switch (message)
{
case WM_SIZE:
{
hdc = GetDC(hWnd);
cxClient = LOWORD(lParam);//当前x像素
cyClient = HIWORD(lParam);//当前y像素
//wsprintf(szBuffer, TEXT("%d,%d"), cxClient, cyClient);
ReleaseDC(hWnd, hdc);
return 0;
}
//定义父窗口回调函数 WndProc, 在处理 WM_CREATE 消息时创建子窗口:
case WM_CREATE: //在接收到 WM_CREATE 消息时创建一个子窗口
{
//创建逻辑字体
hFont = CreateFont(
-18/*高度*/, -9/*宽度*/, 0, 0, 400 /*一般这个值设为400*/,
FALSE/*不带斜体*/, FALSE/*不带下划线*/, FALSE/*不带删除线*/,
DEFAULT_CHARSET, //使用默认字符集
OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS, //这行参数不用管
DEFAULT_QUALITY, //默认输出质量
FF_DONTCARE, //不指定字体族*/
TEXT("微软雅黑")); //字体名
//创建listview子窗口
hListview = CreateWindow(TEXT("SysListView32"), TEXT("LISTVIEW"),
WS_VISIBLE | WS_CHILD | WS_BORDER | LVS_REPORT | LVS_SHOWSELALWAYS,
/*WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN
| LVS_REPORT | LVS_AUTOARRANGE | LVS_SHOWSELALWAYS
| LVS_SHAREIMAGELISTS | LVS_SINGLESEL,*/
10, 10, 550, 490,
hWnd, NULL, hInst, NULL);
ListView_SetExtendedListViewStyle(hListview, LVS_EX_FULLROWSELECT | LVS_EX_CHECKBOXES | LVS_EX_GRIDLINES);
/*
LVS_EX_FULLROWSELECT 选中高亮,可以进行整行选中
LVS_EX_CHECKBOXES 勾选框
LVS_EX_GRIDLINES 网格线
*/
lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;//指定哪些成员包含有效信息的变量。该成员可以是零
lvc.fmt = LVCFMT_CENTER; //列标题与列中子项文本的对齐方式。最左边一列的对齐方式始终是 LVCFMT_LEFT;
lvc.pszText = TEXT("ID");//列的名称,如果正在设置列信息,则此成员是包含列标题文本的以空字符结尾的字符串的地址
lvc.cx = 0;//设置列的宽度 ,这样就不会显示第一列
SendMessage(hListview, LVM_INSERTCOLUMN, 0, (LPARAM)&lvc); //LVM_INSERTCOLUMN表示添加列表示添加列,给第1列添加标体
lvc.pszText = TEXT("姓名");//列的名称,如果正在设置列信息,则此成员是包含列标题文本的以空字符结尾的字符串的地址
lvc.cx = 100;//设置列的宽度
SendMessage(hListview, LVM_INSERTCOLUMN, 1, (LPARAM)&lvc); //LVM_INSERTCOLUMN表示添加列表示添加列,给第1列添加标体
lvc.pszText = TEXT("年龄");
lvc.cx = 100;
SendMessage(hListview, LVM_INSERTCOLUMN, 2, (LPARAM)&lvc);
lvc.pszText = TEXT("电话");
lvc.cx = 100;
SendMessage(hListview, LVM_INSERTCOLUMN, 3, (LPARAM)&lvc);
lvc.pszText = TEXT("地址");
//lvc.cx = cxClient - 400;
SendMessage(hListview, LVM_INSERTCOLUMN, 4, (LPARAM)&lvc);
ListView_SetColumnWidth(hListview,4, LVSCW_AUTOSIZE_USEHEADER);
//SendMessage(hListview, LVM_SETTEXTCOLOR, 0, RGB(255, 255, 255));//设置文字颜色
//SendMessage(hListview, LVM_SETTEXTBKCOLOR, 0, RGB(100, 0, 200));//设置文字背景颜色
//SendMessage(hListview, LVM_SETBKCOLOR, 0, RGB(150, 255, 50));//设置控件背景颜色
vitem.mask = LVIF_TEXT;
szlist = contactlist.size;//获得通信录大小
for (i = 0; i < szlist; i++)
{
//先添加项再设置子项内容
//插入第一行数据,这一段代码是不可以少的。
vitem.iItem = i;//第几行的数据
vitem.iSubItem = 0;//第1列
SendMessage(hListview, LVM_INSERTITEM, 0, (LPARAM)&vitem);//第一列为空数据,不添加数据。
vitem.iSubItem = 1;//第2列
vitem.cchTextMax = 20;
vitem.pszText = contactl