#include<Windows.h>
#include<CommCtrl.h>
#include"resource.h"
#pragma comment(lib,"Comctl32.lib")
BOOL CALLBACK ControlDlg(HWND, UINT, WPARAM, LPARAM);
BOOL CALLBACK TabPageDlg(HWND, UINT, WPARAM, LPARAM);
HINSTANCE hInst;
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
hInst = hInstance;
return DialogBox(hInstance, TEXT("CTLTest"), NULL, ControlDlg);
}
BOOL CALLBACK ControlDlg(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
static HWND hTab, hTabPage[2], hCombo, hProgress, hTree, hListBox, hSlider, hList, hListIcon, hAnimate, hPicture;
LPNMHDR lpHd;
static int n = 0;
static HIMAGELIST hImageList;
switch (msg)
{
case WM_INITDIALOG:
SetTimer(hwnd, 1, 1000, NULL);
//Animation Control控件,没有真正实现,因为找不到合适的播放文件,但基本原理已经包含在里面了
hAnimate = GetDlgItem(hwnd, IDC_ANIMATE1);
//Tab Control控件
TCITEM tcItem;
RECT rc;
hTab = GetDlgItem(hwnd, IDC_TAB1);
tcItem.mask = TCIF_TEXT;
tcItem.pszText = TEXT("页面1");
SendMessage(hTab, TCM_INSERTITEM, 0, (LPARAM)&tcItem);
tcItem.pszText = TEXT("页面2");
SendMessage(hTab, TCM_INSERTITEM, 1, (LPARAM)&tcItem);
GetClientRect(hTab, &rc);
rc.top += 20;
rc.left += 4;
rc.right -= 1;
rc.bottom -= 2;
hTabPage[0] = CreateDialog(hInst, MAKEINTRESOURCE(IDD_TABPAGE1), hTab, TabPageDlg);
hTabPage[1] = CreateDialog(hInst, MAKEINTRESOURCE(IDD_TABPAGE2), hTab, TabPageDlg);
MoveWindow(hTabPage[0], rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, TRUE);
MoveWindow(hTabPage[1], rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, TRUE);
ShowWindow(hTabPage[0], SW_SHOW);
ShowWindow(hTabPage[1], SW_HIDE);
//Combo控件
hCombo = GetDlgItem(hwnd, IDC_COMBO1);
SendMessage(hCombo, CB_ADDSTRING, 0, (LPARAM)TEXT("First"));//注意在开始之前,到可视化界面向下拉ComboBox的显示区域
SendMessage(hCombo, CB_ADDSTRING, 0, (LPARAM)TEXT("Second"));
//Progress Control控件
hProgress = GetDlgItem(hwnd, IDC_PROGRESS1);
SendMessage(hProgress, PBM_SETRANGE32, 0, 100);
SendMessage(hProgress, PBM_SETPOS, 0, 0);
SendMessage(hProgress, PBM_SETBARCOLOR, 0, (LPARAM)RGB(125, 91, 179));
//Tree View控件,需要将TREEVIEW属性的Has Buttons、Has Lines和Lines At Boot设置为TRUE
hTree = GetDlgItem(hwnd, IDC_TREE1);
HTREEITEM hTreeDir[2];
TVITEM tvItem;
TV_INSERTSTRUCT tvIt;
tvItem.mask = TVIF_TEXT;
tvItem.pszText = TEXT("目录1");
tvIt.hParent = NULL;
tvIt.hInsertAfter = TVI_SORT;
tvIt.item = tvItem;
hTreeDir[0] = (HTREEITEM)SendMessage(hTree, TVM_INSERTITEM, 0, (LPARAM)&tvIt);
tvItem.pszText = TEXT("目录2");
tvIt.hParent = NULL;
tvIt.hInsertAfter = TVI_SORT;
tvIt.item = tvItem;
hTreeDir[1] = (HTREEITEM)SendMessage(hTree, TVM_INSERTITEM, 0, (LPARAM)&tvIt);
tvItem.pszText = TEXT("子目录1");
tvIt.hParent = hTreeDir[0];
tvIt.hInsertAfter = TVI_SORT;
tvIt.item = tvItem;
SendMessage(hTree, TVM_INSERTITEM, 0, (LPARAM)&tvIt);
tvItem.pszText = TEXT("子目录2");
tvIt.hParent = hTreeDir[1];
tvIt.hInsertAfter = TVI_SORT;
tvIt.item = tvItem;
SendMessage(hTree, TVM_INSERTITEM, 0, (LPARAM)&tvIt);
//ListBox控件
hListBox = GetDlgItem(hwnd, IDC_LIST1);
SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)TEXT("List1"));
SendMessage(hListBox, LB_INSERTSTRING, 0, (LPARAM)TEXT("List2"));
SendMessage(hListBox, LB_ADDFILE, 0, (LPARAM)TEXT("D:\\test.txt"));//不过是去掉路径而已
SendMessage(hListBox, LB_SETCOLUMNWIDTH, 40, 0);
//Slider Control控件TrackBar
hSlider = GetDlgItem(hwnd, IDC_SLIDER1);
SendMessage(hSlider, TBM_SETRANGE, TRUE, (LPARAM)MAKELONG(0,100));
SendMessage(hSlider, TBM_SETPOS, TRUE, (LPARAM)50);
//ListControl控件report类型
hList = GetDlgItem(hwnd, IDC_LIST2);
LVITEM lvItem;
LVCOLUMN lvc;
hImageList = ImageList_Create(16, 16, ILC_COLOR, 0, 0); //创建一个ImageList
ImageList_Add(hImageList, LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BITMAP1)), NULL);//加入图片
ImageList_Add(hImageList, LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BITMAP2)), NULL);
SendMessage(hList, LVM_SETIMAGELIST, LVSIL_SMALL, (LPARAM)hImageList);//将ImageList映射进窗口
lvc.mask = LVCF_WIDTH|LVCF_TEXT;
lvc.cx = 50;
lvc.pszText = TEXT("列1");
SendMessage(hList, LVM_INSERTCOLUMN, 0, (LPARAM)&lvc);
lvc.cx = 50;
lvc.pszText = TEXT("列2");
SendMessage(hList, LVM_INSERTCOLUMN, 1, (LPARAM)&lvc);
lvc.mask = LVCF_WIDTH | LVCF_IMAGE;
lvc.cx = 50;
lvc.iImage = 1;
SendMessage(hList, LVM_INSERTCOLUMN, 2, (LPARAM)&lvc); //第三列用图标显示
ListView_SetExtendedListViewStyleEx(hList, 0, LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_HEADERDRAGDROP | LVS_EX_SUBITEMIMAGES);//显示表格和图像,最后一个参数时显示图像用的
lvItem.mask = LVIF_TEXT | LVIF_IMAGE;//这里注意不要使用LVFIF_*
lvItem.iItem = 0;
lvItem.iSubItem = 0;
lvItem.iImage = 0;
lvItem.pszText = TEXT("数据1");
SendMessage(hList, LVM_INSERTITEM, 0, (LPARAM)&lvItem);//用LVM_INSERTITEM插入元祖,即一行
lvItem.iItem = 0;
lvItem.iSubItem = 1;
lvItem.iImage = 1;
lvItem.pszText = TEXT("内容1");
SendMessage(hList, LVM_SETITEM, 0, (LPARAM)&lvItem);//用LVM_SETITEM设置数据
lvItem.iItem = 1;
lvItem.iSubItem = 0;
lvItem.iImage = 1;
lvItem.pszText = TEXT("数据2");
SendMessage(hList, LVM_INSERTITEM, 0, (LPARAM)&lvItem);//用LVM_INSERTITEM插入元祖,即一行
lvItem.mask = LVIF_TEXT;
lvItem.iItem = 1;
lvItem.iSubItem = 1;
lvItem.pszText = TEXT("内容2");//这个单元没有设置图标
SendMessage(hList, LVM_SETITEM, 0, (LPARAM)&lvItem);//用LVM_SETITEM设置数据
//ListControl ICON 控件使用 LVM_INSERTITEM,
hListIcon = GetDlgItem(hwnd, IDC_LIST3);
lvItem.mask = LVIF_IMAGE | LVIF_TEXT;
SendMessage(hListIcon, LVM_SETIMAGELIST, LVSIL_NORMAL, (LPARAM)hImageList);
lvItem.iImage = 0;
lvItem.pszText = TEXT("ICON1");
lvItem.iItem = 0; //这个可以不用设置
lvItem.iSubItem = 0; //这个是必须的,并且为0,否则显示不出来,目前原因不明
SendMessage(hListIcon, LVM_INSERTITEM, 0, (LPARAM)&lvItem);
lvItem.iImage = 1;
lvItem.pszText = TEXT("ICON3");
lvItem.iItem = 0;
lvItem.iSubItem = 0;
SendMessage(hListIcon, LVM_INSERTITEM, 0, (LPARAM)&lvItem);
lvItem.iImage = 1;
lvItem.pszText = TEXT("ICON2");
lvItem.iItem = 0;
lvItem.iSubItem = 0;
SendMessage(hListIcon, LVM_INSERTITEM, 0, (LPARAM)&lvItem);
//Picturn Control控件,隶属于Static Control,所以用的是同一类消息
hPicture = GetDlgItem(hwnd, IDC_STATIC1);
SendMessage(hPicture, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BITMAP1)));
break;
case WM_TIMER:
if (n <= 10)
{
SendMessage(hProgress, PBM_SETPOS, 10 * n, 0);
n++;
}
else
KillTimer(hwnd, 1);
break;
case WM_NOTIFY: //一般情况下,容器型的控件会发送这个消息,如果没有这个消息可以设置控件的notify属性来接受这个消息,当然也可以用控件常用的WM_COMMAND消息
lpHd = (LPNMHDR)lParam;
//MessageBox(hwnd, "d", TEXT("当前位置"), MB_OK);
if (lpHd->code == TCN_SELCHANGE&&lpHd->hwndFrom==hTab)//Tab Control控件消息
{
int iSelect = SendDlgItemMessage(hwnd, IDC_TAB1, TCM_GETCURSEL, 0, 0);
switch (iSelect)
{
case 0:
ShowWindow(hTabPage[0], SW_SHOW);
ShowWindow(hTabPage[1], SW_HIDE);
break;
case 1:
ShowWindow(hTabPage[0], SW_HIDE);
ShowWindow(hTabPage[1], SW_SHOW);
break;
default:
break;
}
}
else if (lpHd->hwndFrom== hSlider)//code只有一个-12 Slider消息
{
int iPos = SendMessage(hSlider, TBM_GETPOS, 0, 0);
TCHAR szTmp[30];
wsprintf(szTmp, TEXT("%d"), iPos);
//MessageBox(NULL, szTmp, TEXT("当前位置"), MB_OK);
}
else if (lpHd->hwndFrom == hList&&lpHd->code == NM_CLICK) //ListView消息
{
int iSelect = ListView_GetSelectionMark(hList);
TCHAR szItem[100];
LVITEM lvItem;
//ListView_GetItemText(hList, iSelect, 1, szItem, 100)
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
设计了Windows基本控件的使用,本程序使用C语言写的,主要是为了帮助大家理解这些控件的原理,同时为哪些想要学习C语言界面编程的人提供一些提示。MFC、C#的编程者也可以查看。里面的控件介绍包括TREEVIEW、Tab Control、Animation Control、Picture Control、Slider Control、List Control、ListView、Combo Box Control等
资源推荐
资源详情
资源评论
收起资源包目录
ControlTest.zip (30个子文件)
ControlTest
Debug
ControlTest.pdb 667KB
ControlTest.exe 677KB
ControlTest.ilk 341KB
ControlTest
resource.h 3KB
Debug
ControlTest.tlog
cl.command.1.tlog 574B
rc.command.1.tlog 458B
CL.read.1.tlog 18KB
link.read.1.tlog 3KB
rc.read.1.tlog 2KB
link.write.1.tlog 580B
CL.write.1.tlog 464B
link.command.1.tlog 1KB
ControlTest.lastbuildstate 165B
rc.write.1.tlog 258B
vc120.pdb 172KB
ControlTest.res 3KB
ControlTest.log 1KB
Դ.obj 49KB
vc120.idb 507KB
ControlTest.rc 9KB
bitmap2.bmp 246B
ControlTest.vcxproj 4KB
icon1.ico 1KB
ControlTest.vcxproj.filters 1KB
Դ.cpp 9KB
ControlTest.aps 17KB
bitmap1.bmp 246B
ControlTest.v12.suo 20KB
ControlTest.sln 979B
ControlTest.sdf 28.44MB
共 30 条
- 1
资源评论
- bjyqtx2016-04-14谢谢楼主的分享,对我很有帮助
youyuerlang
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功