一、富文本编辑控件
二、公共控件
三、动画控件
四、测量条
五、日期时间控件
六、热键控件
七、链接控件
八、日历控件
九、进度条控件
十、列表视图控件
一、富文本编辑控件
1)什么是富文本编辑框
2)样式
3)注意事项
include
必须加载动态库LoadLibrary(L"Msftedit.dll");
4)CHARFORMAT结构体
5)WM_NOTIFY消息
6)代码实例
#include
#include
#include
//自定义的窗口过程
LRESULT CALLBACK MyWindowProc(HWND hWnd, UINT Msg,
WPARAM wParam, LPARAM lParam)
{
switch (Msg)
{
case WM_DESTROY:
PostQuitMessage(0);//可以使GetMessage返回0
return 0;
case WM_COMMAND:
{
WORD CtrlID = LOWORD(wParam);
HWND hCtrl = (HWND)lParam;
if (CtrlID == 111)
{
WORD code= HIWORD(wParam);
if (code == EN_CHANGE)
{
TCHAR buf[64];
GetWindowText(hCtrl, buf, 64);
MessageBox(NULL, buf,L"提示",MB_OK);
}
}
}break;
case WM_NOTIFY:
{
//先看公共头部
NMHDR *pHDR = (NMHDR *)lParam;
if (pHDR->code == EN_SELCHANGE)
{
SELCHANGE * pSC= (SELCHANGE *)lParam;
TCHAR buf[64];
wsprintf(buf, L"选择文本索引%d - %d\n", pSC->chrg.cpMin, pSC->chrg.cpMax);
OutputDebugString(buf);
}
}break;
case WM_CREATE:
{
LPCREATESTRUCT pcs = (LPCREATESTRUCT)lParam;
//必须加载动态库
LoadLibrary(L"Msftedit.dll");
HWND hRichEdit=CreateWindow(MSFTEDIT_CLASS, L"这是一个富文本编辑控件!!!",
WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_MULTILINE|ES_AUTOVSCROLL, 30, 30, 200, 200, hWnd, (HMENU)111, pcs->hInstance, NULL);
//选中索引2-7的文本
SendMessage(hRichEdit, EM_SETSEL, 2, 7);
//显示选择背景色
SendMessage(hRichEdit, EM_HIDESELECTION,0 , 0);
//先获取默认的字符格式
CHARFORMAT cf;
ZeroMemory(&cf, sizeof(CHARFORMAT));
cf.cbSize = sizeof(CHARFORMAT);
SendMessage(hRichEdit, EM_GETCHARFORMAT, SCF_DEFAULT, (LPARAM) &cf);
//让选择的文字加粗
cf.dwMask |= CFM_BOLD;
cf.dwEffects |= CFE_BOLD;
//设置下划线
cf.dwMask |= CFM_UNDERLINE;
cf.dwEffects |= CFE_UNDERLINE;
//设置字体大小
cf.dwMask |= CFM_SIZE;
cf.yHeight =20*20;
//设置字体
cf.dwMask |= CFM_FACE;
wcscpy(cf.szFaceName , L"楷体");
//设置字体颜色
cf.dwMask |= CFM_COLOR;
cf.dwEffects &= ~CFE_AUTOCOLOR;
cf.crTextColor = RGB(255, 0, 0);
//设置选择字符的格式
SendMessage(hRichEdit, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf);
//取消选择
SendMessage(hRichEdit, EM_SETSEL, -1, -1);
//设置富文本编辑框的背景色
SendMessage(hRichEdit, EM_SETBKGNDCOLOR, 0, (LPARAM) RGB(0,255,0));
//发送控件内容改变事件、选择改变事件掩码
SendMessage(hRichEdit, EM_SETEVENTMASK, 0, (LPARAM)ENM_CHANGE| ENM_SELCHANGE);
}break;
}
return DefWindowProc(hWnd, Msg, wParam, lParam);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nShowCmd)
{
//1.注册窗口类
WNDCLASS wnd;
wnd.cbClsExtra = 0;
wnd.cbWndExtra = 0;
wnd.hbrBackground = (HBRUSH)(GetStockObject(GRAY_BRUSH));//背景色
wnd.hCursor = LoadCursor(NULL, IDC_ARROW);//光标
wnd.hIcon = LoadIcon(NULL, IDI_APPLICATION);//图标
//wnd.lpfnWndProc = DefWindowProc;//默认窗口过程函数,用于处理消息
wnd.lpfnWndProc = MyWindowProc;//自定义的窗口过程函数
wnd.lpszClassName = L"MrHuang";//窗口类名
wnd.lpszMenuName = NULL;//菜单资源名称
wnd.style = CS_HREDRAW | CS_DBLCLKS;//窗口类、样式
wnd.hInstance = hInstance;//实例句柄
RegisterClass(&wnd);
//创建窗口(返回之前发送WM_CREATE)
HWND hWnd = CreateWindow(L"MrHuang", L"第一个窗口程序",
WS_OVERLAPPEDWINDOW, 100, 100, 300, 300, NULL, NULL, hInstance, NULL);
//显示窗口
ShowWindow(hWnd, nShowCmd);
//更新窗口(发送WM_PAINT)
UpdateWindow(hWnd);
//消息循环(收到WM_QUIT消息退出)
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);//翻译消息
DispatchMessage(&msg);//分发消息到窗口过程
}
}
二、公共控件
1)什么是公共控件
2)初始化公共控件库
3)公共控件结构体
4)公共控件有哪些
三、动画控件
1)什么是动画控件
2)样式
3)创建动画控件
4)相动画控件发送消息
例如:
5)代码实例
#include
#include
//自定义的窗口过程
LRESULT CALLBACK MyWindowProc(HWND hWnd, UINT Msg,
WPARAM wParam, LPARAM lParam)
{
switch (Msg)
{
case WM_DESTROY:
PostQuitMessage(0);//可以使GetMessage返回0
return 0;
case WM_CREATE:
{
//创建动画控件
HWND hAnimate= CreateWindow(ANIMATE_CLASS, L"XXX", WS_CHILD | WS_VISIBLE | ACS_CENTER,
10, 10, 350, 350, hWnd, (HMENU)111, ((LPCREATESTRUCT)lParam)->hInstance, NULL);
//打开一个AVI剪辑动画
SendMessage(hAnimate, ACM_OPEN, NULL, (LPARAM)L"C:\\Users\\35497\\Desktop\\code\\030\\Debug\\clock.avi");
//播放剪辑动画(wparam播放次数,-1循环播放, lparam 低字节开始,高字节结束 )
SendMessage(hAnimate, ACM_PLAY, -1 , MAKELPARAM(0,-1));
}break;
}
return DefWindowProc(hWnd, Msg, wParam, lParam);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nShowCmd)
{
//1.注册窗口类
WNDCLASS wnd;
wnd.cbClsExtra = 0;
wnd.cbWndExtra = 0;
wnd.hbrBackground = (HBRUSH)(GetStockObject(GRAY_BRUSH));//背景色
wnd.hCursor= LoadCursor(NULL, IDC_ARROW);//光标
wnd.hIcon = LoadIcon(NULL, IDI_APPLICATION);//图标
//wnd.lpfnWndProc = DefWindowProc;//默认窗口过程函数,用于处理消息
wnd.lpfnWndProc =MyWindowProc;//自定义的窗口过程函数
wnd.lpszClassName = L"MrHuang";//窗口类名
wnd.lpszMenuName = NULL;//菜单资源名称
wnd.style = CS_HREDRAW| CS_DBLCLKS;//窗口类、样式
wnd.hInstance = hInstance;//实例句柄
RegisterClass(&wnd);
//创建窗口(返回之前发送WM_CREATE)
HWND hWnd = CreateWindow(L"MrHuang",L"第一个窗口程序",
WS_OVERLAPPEDWINDOW,100,100,400 ,400,NULL,NULL, hInstance,NULL );
//显示窗口
ShowWindow(hWnd, nShowCmd);
//更新窗口(发送WM_PAINT)
UpdateWindow(hWnd);
//消息循环(收到WM_QUIT消息退出)
MSG msg;
while ( GetMessage(&msg, NULL, 0,0 ) )
{
TranslateMessage(&msg);//翻译消息
DispatchMessage(&msg);//分发消息到窗口过程
}
}
四、测量条
1)什么是测量条
2)样式
3)代码实例
#include
#include
//自定义的窗口过程
LRESULT CALLBACK MyWindowProc(HWND hWnd, UINT Msg,
WPARAM wParam, LPARAM lParam)
{
switch (Msg)
{
case WM_DESTROY:
PostQuitMessage(0);//可以使GetMessage返回0
return 0;
case WM_CREATE:
{
//创建刻度条控件
HWND hTackbar = CreateWindow(TRACKBAR_CLASS, L"XXX",
WS_CHILD | WS_VISIBLE| TBS_TOP|TBS_AUTOTICKS|TBS_ENABLESELRANGE, 30, 30, 200, 70, hWnd, (HMENU)111,
GetModuleHandle(NULL), NULL);
//设置测量条的范围
SendMessage(hTackbar, TBM_SETRANGE, TRUE, MAKELPARAM(0, 10));
//设置测量条的滑块位置
SendMessage(hTackbar, TBM_SETPOS, TRUE, 5 );
//设置滑块的选择区域
SendMessage(hTackbar, TBM_SETSEL, TRUE, MAKELPARAM(1,3));
}break;
case WM_HSCROLL:
{
WORD code = LOWORD(wParam);//指示用户的滚动行为
WORD value = HIWORD(wParam);//仅当code是TB_THUMBPOSITION或TB_THUMBTRACK ,HIWORD(wParam)指定在滚动框的当前位置,否则忽略!
HWND hCtrl =(HWND) lParam;//控件句柄
/* code的值:
#define TB_LINEUP 0
#define TB_LINEDOWN 1
#define TB_PAGEUP 2
#define TB_PAGEDOWN 3
#define TB_THUMBPOSITION 4
#define TB_THUMBTRACK 5
#define TB_TOP 6
#define TB_BOTTOM 7
#define TB_ENDTRACK 8
*/
UINT v = SendMessage(hCtrl, TBM_GETPOS, 0, 0);
TCHAR buf[64] = {0};
wsprintf(buf, L"当前位置: %d LOWORD: %d HIWORD: %d\n" , v, code ,value);
OutputDebugString(buf);
}break;
}
return DefWindowProc(hWnd, Msg, wParam, lParam);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nShowCmd)
{
//1.注册窗口类
WNDCLASS wnd;
wnd.cbClsExtra = 0;
wnd.cbWndExtra = 0;
wnd.hbrBackground = (HBRUSH)(GetStockObject(GRAY_BRUSH));//背景色
wnd.hCursor = LoadCursor(NULL, IDC_ARROW);//光标
wnd.hIcon = LoadIcon(NULL, IDI_APPLICATION);//图标
//wnd.lpfnWndProc = DefWindowProc;//默认窗口过程函数,用于处理消息
wnd.lpfnWndProc = MyWindowProc;//自定义的窗口过程函数
wnd.lpszClassName = L"MrHuang";//窗口类名
wnd.lpszMenuName = NULL;//菜单资源名称
wnd.style = CS_HREDRAW | CS_DBLCLKS;//窗口类、样式
wnd.hInstance = hInstance;//实例句柄
RegisterClass(&wnd);
//创建窗口(返回之前发送WM_CREATE)
HWND hWnd = CreateWindow(L"MrHuang", L"第一个窗口程序",
WS_OVERLAPPEDWINDOW, 100, 100, 400, 400, NULL, NULL, hInstance, NULL);
//显示窗口
ShowWindow(hWnd, nShowCmd);
//更新窗口(发送WM_PAINT)
UpdateWindow(hWnd);
//消息循环(收到WM_QUIT消息退出)
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);//翻译消息
DispatchMessage(&msg);//分发消息到窗口过程
}
}
五、日期时间控件
1)什么是日期时间控件
2)样式
3)向时间控件发送消息设置控件
4)格式字符串
5)设置时间格式字符串
6)控件向父窗口发送消息
7)代码实例
#include
#include
//#pragma comment(lib, "COMCTL32.LIB")
//自定义的窗口过程
LRESULT CALLBACK MyWindowProc(HWND hWnd, UINT Msg,
WPARAM wParam, LPARAM lParam)
{
switch (Msg)
{
case WM_DESTROY:
PostQuitMessage(0);//可以使GetMessage返回0
return 0;
case WM_NOTIFY:
{
NMHDR *pHDR = (NMHDR *)lParam;
if (pHDR->code == DTN_DATETIMECHANGE)
{
LPNMDATETIMECHANGE pDT = (LPNMDATETIMECHANGE)lParam;
SYSTEMTIME st = pDT->st;
TCHAR buf[64] = {0};
wsprintf(buf, L"%04d-%02d-%02d %02d:%02d:%02d ",
st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);
MessageBox(hWnd, buf, L"提示", MB_OK);
}
}break;
case WM_CREATE:
{
//创建一个日期时间选择控件
HWND hDatetime = CreateWindow(DATETIMEPICK_CLASS, L"XXX",
WS_CHILD | WS_VISIBLE| DTS_SHOWNONE, 30, 30, 200, 30, hWnd, (HMENU)111, ((LPCREATESTRUCT)lParam)->hInstance, NULL);
//设置控件的显示格式
SendMessage(hDatetime, DTM_SETFORMAT, 0, (LPARAM)L"yyyy-MM-dd hh:mm:ss tt");
//设置控件的显示时间
SYSTEMTIME st;
st.wYear = 1999;
st.wMonth = 8;
st.wDay = 7;
st.wHour = 6;
st.wMinute = 5;
st.wSecond = 4;
st.wMilliseconds = 3;
SendMessage(hDatetime, DTM_SETSYSTEMTIME, GDT_VALID, (LPARAM)&st);
//设置时间为无
//SendMessage(hDatetime, DTM_SETSYSTEMTIME, GDT_NONE, 0);
}break;
}
return DefWindowProc(hWnd, Msg, wParam, lParam);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nShowCmd)
{
//1.注册窗口类
WNDCLASS wnd;
wnd.cbClsExtra = 0;
wnd.cbWndExtra = 0;
wnd.hbrBackground = (HBRUSH)(GetStockObject(GRAY_BRUSH));//背景色
wnd.hCursor = LoadCursor(NULL, IDC_ARROW);//光标
wnd.hIcon = LoadIcon(NULL, IDI_APPLICATION);//图标
//wnd.lpfnWndProc = DefWindowProc;//默认窗口过程函数,用于处理消息
wnd.lpfnWndProc = MyWindowProc;//自定义的窗口过程函数
wnd.lpszClassName = L"MrHuang";//窗口类名
wnd.lpszMenuName = NULL;//菜单资源名称
wnd.style = CS_HREDRAW | CS_DBLCLKS;//窗口类、样式
wnd.hInstance = hInstance;//实例句柄
RegisterClass(&wnd);
//创建窗口(返回之前发送WM_CREATE)
HWND hWnd = CreateWindow(L"MrHuang", L"第一个窗口程序",
WS_OVERLAPPEDWINDOW, 100, 100, 400, 400, NULL, NULL, hInstance, NULL);
//显示窗口
ShowWindow(hWnd, nShowCmd);
//更新窗口(发送WM_PAINT)
UpdateWindow(hWnd);
//消息循环(收到WM_QUIT消息退出)
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);//翻译消息
DispatchMessage(&msg);//分发消息到窗口过程
}
}
六、热键控件
1)什么是热键控件
2)向控件发送消息
3)代码实例
#include
#include
//#pragma comment(lib, "COMCTL32.LIB")
//自定义的窗口过程
LRESULT CALLBACK MyWindowProc(HWND hWnd, UINT Msg,
WPARAM wParam, LPARAM lParam)
{
switch (Msg)
{
case WM_DESTROY:
PostQuitMessage(0);//可以使GetMessage返回0
return 0;
case WM_COMMAND:
{
HWND hCtrl = (HWND)lParam;
WORD CtrlID = LOWORD(wParam);
WORD code=HIWORD(wParam);
if (code == EN_CHANGE)
{
//获取组合键的内容
WORD key = SendMessage(hCtrl, HKM_GETHOTKEY, 0, 0);
BYTE l = LOBYTE(LOWORD(key));//字母等
BYTE h = HIBYTE(LOWORD(key));//CTRL | ALT |SHIFT
TCHAR buf[64] = { 0 };
wsprintf(buf, L"%c + %d + %d\n", l, bool(h & HOTKEYF_CONTROL), bool(h & HOTKEYF_ALT));
OutputDebugString(buf);
}
}break;
case WM_CREATE:
{
//创建热键控件
HWND hHotkey = CreateWindow(HOTKEY_CLASS,L"XXX",
WS_CHILD | WS_VISIBLE, 30, 30, 200, 30, hWnd, (HMENU)111, GetModuleHandle(NULL), NULL);
//设置组合键的内容(CTRL+ALT+A)
SendMessage(hHotkey, HKM_SETHOTKEY, MAKEWORD('A', HOTKEYF_ALT| HOTKEYF_CONTROL), 0);
//获取组合键的内容
WORD key=SendMessage(hHotkey, HKM_GETHOTKEY, 0, 0);
BYTE l = LOBYTE(LOWORD(key));//字母等
BYTE h =HIBYTE(LOWORD(key));//CTRL | ALT |SHIFT
TCHAR buf[64] = {0};
wsprintf(buf, L"%c + %d + %d\n", l, bool( h & HOTKEYF_CONTROL), bool(h & HOTKEYF_ALT));
OutputDebugString(buf);
}break;
}
return DefWindowProc(hWnd, Msg, wParam, lParam);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nShowCmd)
{
//1.注册窗口类
WNDCLASS wnd;
wnd.cbClsExtra = 0;
wnd.cbWndExtra = 0;
wnd.hbrBackground = (HBRUSH)(GetStockObject(GRAY_BRUSH));//背景色
wnd.hCursor = LoadCursor(NULL, IDC_ARROW);//光标
wnd.hIcon = LoadIcon(NULL, IDI_APPLICATION);//图标
//wnd.lpfnWndProc = DefWindowProc;//默认窗口过程函数,用于处理消息
wnd.lpfnWndProc = MyWindowProc;//自定义的窗口过程函数
wnd.lpszClassName = L"MrHuang";//窗口类名
wnd.lpszMenuName = NULL;//菜单资源名称
wnd.style = CS_HREDRAW | CS_DBLCLKS;//窗口类、样式
wnd.hInstance = hInstance;//实例句柄
RegisterClass(&wnd);
//创建窗口(返回之前发送WM_CREATE)
HWND hWnd = CreateWindow(L"MrHuang", L"第一个窗口程序",
WS_OVERLAPPEDWINDOW, 100, 100, 400, 400, NULL, NULL, hInstance, NULL);
//显示窗口
ShowWindow(hWnd, nShowCmd);
//更新窗口(发送WM_PAINT)
UpdateWindow(hWnd);
//消息循环(收到WM_QUIT消息退出)
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);//翻译消息
DispatchMessage(&msg);//分发消息到窗口过程
}
}
七、链接控件
1)什么是链接控件
2)样式
3)注意事项
4)控件向父窗口发送消息
5)LITEM结构体
6)代码实例
#include
#include
//指定清单依赖项,否则无法创建SysLink控件
#pragma comment(linker,"\"/manifestdependency:type='win32' name='Microsoft.Windows.Common-Controls' \
version = '6.0.0.0' processorArchitecture = '*' publicKeyToken = '6595b64144ccf1df' language = '*'\"")
//自定义的窗口过程
LRESULT CALLBACK MyWindowProc(HWND hWnd, UINT Msg,
WPARAM wParam, LPARAM lParam)
{
switch (Msg)
{
case WM_DESTROY:
PostQuitMessage(0);//可以使GetMessage返回0
return 0;
case WM_NOTIFY:
{
//WM_NOTIFY参数的公共头部
NMHDR *pHDR = (NMHDR*)lParam;
if ((pHDR->code == NM_CLICK) && ( pHDR->idFrom = 111))
{
PNMLINK pLink = (PNMLINK)lParam;
LITEM & item = pLink->item;
if (item.iLink == 0)//第一个标签
{
//打开网站item.szUrl;
ShellExecute(NULL, L"open", item.szUrl, NULL, NULL, SW_SHOW);
}
else if (item.iLink == 1)//第二个标签
{
ShellExecute(NULL, L"open", L"https://www.baidu.com", NULL, NULL, SW_SHOW);
}
}
}break;
case WM_CREATE:
{
//创建超链接控件
HWND hLink = CreateWindow(WC_LINK,
L"这是超链接我爱中国!这是第二个超链接", WS_CHILD | WS_VISIBLE,
30, 30, 200, 30, hWnd, (HMENU)111, GetModuleHandle(NULL), NULL);
}
break;
}
return DefWindowProc(hWnd, Msg, wParam, lParam);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nShowCmd)
{
//1.注册窗口类
WNDCLASS wnd;
wnd.cbClsExtra = 0;
wnd.cbWndExtra = 0;
wnd.hbrBackground = (HBRUSH)(GetStockObject(GRAY_BRUSH));//背景色
wnd.hCursor = LoadCursor(NULL, IDC_ARROW);//光标
wnd.hIcon = LoadIcon(NULL, IDI_APPLICATION);//图标
//wnd.lpfnWndProc = DefWindowProc;//默认窗口过程函数,用于处理消息
wnd.lpfnWndProc = MyWindowProc;//自定义的窗口过程函数
wnd.lpszClassName = L"MrHuang";//窗口类名
wnd.lpszMenuName = NULL;//菜单资源名称
wnd.style = CS_HREDRAW | CS_DBLCLKS;//窗口类、样式
wnd.hInstance = hInstance;//实例句柄
RegisterClass(&wnd);
//创建窗口(返回之前发送WM_CREATE)
HWND hWnd = CreateWindow(L"MrHuang", L"第一个窗口程序",
WS_OVERLAPPEDWINDOW, 100, 100, 400, 400, NULL, NULL, hInstance, NULL);
//显示窗口
ShowWindow(hWnd, nShowCmd);
//更新窗口(发送WM_PAINT)
UpdateWindow(hWnd);
//消息循环(收到WM_QUIT消息退出)
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);//翻译消息
DispatchMessage(&msg);//分发消息到窗口过程
}
}
八、日历控件
1)什么是日历控件
2)样式
3)向控件发送消息设置控件
4)控件向父窗口发送消息
5)代码实例
#include
#include
//自定义的窗口过程
LRESULT CALLBACK MyWindowProc(HWND hWnd, UINT Msg,
WPARAM wParam, LPARAM lParam)
{
switch (Msg)
{
case WM_DESTROY:
PostQuitMessage(0);//可以使GetMessage返回0
return 0;
case WM_NOTIFY:
{
//WM_NOTIFY参数的公共头部
NMHDR *pHDR = (NMHDR*)lParam;
if ((pHDR->code == MCN_SELCHANGE) && (pHDR->idFrom == 111))
{
LPNMSELCHANGE pSelect = (LPNMSELCHANGE)lParam;
SYSTEMTIME st0 = pSelect->stSelStart;
SYSTEMTIME st1 = pSelect->stSelEnd;
TCHAR buf[64] = { 0 };
wsprintf(buf, L"%04d-%02d-%02d %02d:%02d:%02d 至 %04d-%02d-%02d %02d:%02d:%02d",
st0.wYear, st0.wMonth, st0.wDay, st0.wHour, st0.wMinute, st0.wSecond,
st1.wYear, st1.wMonth, st1.wDay, st1.wHour, st1.wMinute, st1.wSecond);
MessageBox(hWnd, buf, L"提示", MB_OK);
}
}break;
case WM_CREATE:
{
//创建日历控件
HWND hCalendar = CreateWindow(MONTHCAL_CLASS,
L"XXX", WS_CHILD | WS_VISIBLE , 30, 30, 600, 600,
hWnd, (HMENU)111, ((LPCREATESTRUCT)lParam)->hInstance, NULL);
//设置可选择日期的范围
SYSTEMTIME st[2];//0放最小值,1放最大值
st[0].wYear = 2018;
st[0].wMonth = 1;
st[0].wDay = 1;
st[1].wYear = 2018;
st[1].wMonth = 1;
st[1].wDay = 7;
SendMessage(hCalendar, MCM_SETRANGE, GDTR_MAX | GDTR_MIN, (LPARAM)st);
//选择某个日期值20180107
SendMessage(hCalendar, MCM_SETCURSEL, 0 , (LPARAM)&st[1]);
}
break;
}
return DefWindowProc(hWnd, Msg, wParam, lParam);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nShowCmd)
{
//1.注册窗口类
WNDCLASS wnd;
wnd.cbClsExtra = 0;
wnd.cbWndExtra = 0;
wnd.hbrBackground = (HBRUSH)(GetStockObject(GRAY_BRUSH));//背景色
wnd.hCursor = LoadCursor(NULL, IDC_ARROW);//光标
wnd.hIcon = LoadIcon(NULL, IDI_APPLICATION);//图标
//wnd.lpfnWndProc = DefWindowProc;//默认窗口过程函数,用于处理消息
wnd.lpfnWndProc = MyWindowProc;//自定义的窗口过程函数
wnd.lpszClassName = L"MrHuang";//窗口类名
wnd.lpszMenuName = NULL;//菜单资源名称
wnd.style = CS_HREDRAW | CS_DBLCLKS;//窗口类、样式
wnd.hInstance = hInstance;//实例句柄
RegisterClass(&wnd);
//创建窗口(返回之前发送WM_CREATE)
HWND hWnd = CreateWindow(L"MrHuang", L"第一个窗口程序",
WS_OVERLAPPEDWINDOW, 100, 100, 400, 400, NULL, NULL, hInstance, NULL);
//显示窗口
ShowWindow(hWnd, nShowCmd);
//更新窗口(发送WM_PAINT)
UpdateWindow(hWnd);
//消息循环(收到WM_QUIT消息退出)
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);//翻译消息
DispatchMessage(&msg);//分发消息到窗口过程
}
}
九、进度条控件
1)什么是进度条控件
2)样式
3)向控件发送消息
4)代码实例
#include
#include
//依赖项指令
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
HWND hProgress = NULL;
//自定义的窗口过程
LRESULT CALLBACK MyWindowProc(HWND hWnd, UINT Msg,
WPARAM wParam, LPARAM lParam)
{
switch (Msg)
{
case WM_DESTROY:
PostQuitMessage(0);//可以使GetMessage返回0
return 0;
case WM_LBUTTONDOWN:
{
//让进度条移动一个步长
SendMessage(hProgress, PBM_STEPIT, 10, 0);
}break;
case WM_CREATE:
{
//创建进度条
hProgress = CreateWindow(PROGRESS_CLASS,L"XXX",
WS_CHILD | WS_VISIBLE ,
30, 30, 200,30, hWnd,(HMENU)111,GetModuleHandle(NULL),NULL);
//设置进度条的范围
SendMessage(hProgress, PBM_SETRANGE, 0, MAKELPARAM(1, 100));
//设置进度条的位置
SendMessage(hProgress, PBM_SETPOS, 40, 0);
//设置进度条步长
SendMessage(hProgress, PBM_SETSTEP, 10, 0);
//开启进度条左右重复滚动
//SendMessage(hProgress, PBM_SETMARQUEE, 1, 10);
}break;
}
return DefWindowProc(hWnd, Msg, wParam, lParam);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nShowCmd)
{
//1.注册窗口类
WNDCLASS wnd;
wnd.cbClsExtra = 0;
wnd.cbWndExtra = 0;
wnd.hbrBackground = (HBRUSH)(GetStockObject(GRAY_BRUSH));//背景色
wnd.hCursor = LoadCursor(NULL, IDC_ARROW);//光标
wnd.hIcon = LoadIcon(NULL, IDI_APPLICATION);//图标
//wnd.lpfnWndProc = DefWindowProc;//默认窗口过程函数,用于处理消息
wnd.lpfnWndProc = MyWindowProc;//自定义的窗口过程函数
wnd.lpszClassName = L"MrHuang";//窗口类名
wnd.lpszMenuName = NULL;//菜单资源名称
wnd.style = CS_HREDRAW | CS_DBLCLKS;//窗口类、样式
wnd.hInstance = hInstance;//实例句柄
RegisterClass(&wnd);
//创建窗口(返回之前发送WM_CREATE)
HWND hWnd = CreateWindow(L"MrHuang", L"第一个窗口程序",
WS_OVERLAPPEDWINDOW, 100, 100, 400, 400, NULL, NULL, hInstance, NULL);
//显示窗口
ShowWindow(hWnd, nShowCmd);
//更新窗口(发送WM_PAINT)
UpdateWindow(hWnd);
//消息循环(收到WM_QUIT消息退出)
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);//翻译消息
DispatchMessage(&msg);//分发消息到窗口过程
}
}
十、列表视图控件
1)什么是列表视图控件
2)样式
图标和列表视图的样式
报告视图的样式
3)向控件发送消息
4)图像列表(可以在资源中加载)
5)加载图像列表
6)控件向窗口发送消息
7)代码实例
①图标视图
#include
#include
#include"resource.h" //包含图标资源ID
#pragma comment(lib, "Comctl32.lib") //加入lib文件
//自定义的窗口过程
LRESULT CALLBACK MyWindowProc(HWND hWnd, UINT Msg,
WPARAM wParam, LPARAM lParam)
{
switch (Msg)
{
case WM_DESTROY:
PostQuitMessage(0);//可以使GetMessage返回0
return 0;
case WM_NOTIFY:
{
NMHDR *pHDR = (NMHDR*)lParam;
if ((pHDR->code == LVN_ITEMCHANGED) && (pHDR->idFrom == 111))
{
LPNMLISTVIEW pnmv = (LPNMLISTVIEW)lParam;
if (pnmv->uChanged == LVIF_STATE)//是不是选中状态改变了
{
if (pnmv->uNewState & LVIS_SELECTED)
{
//根据索引pnmv->iItem获取文本
LVITEM lv;
TCHAR buf[64] = {0};
lv.iSubItem = 0;
lv.pszText = buf; //向系统提供写入内存
lv.cchTextMax = sizeof(buf);//buf的长度
SendMessage(pHDR->hwndFrom, LVM_GETITEMTEXT, pnmv->iItem, (LPARAM)&lv);
MessageBox(hWnd, buf, L"提示", MB_OK);
}
}
}
}break;
case WM_CREATE:
{
//创建列表视图 LVS_ICON 图标视图
HWND hListView = CreateWindow(WC_LISTVIEW, L"XXX",
WS_CHILD | WS_VISIBLE | LVS_ICON, 30, 30, 300, 300, hWnd, (HMENU)111,
((LPCREATESTRUCT)lParam)->hInstance, NULL);
//创建Image Lists
UINT x = GetSystemMetrics(SM_CXICON);
UINT y = GetSystemMetrics(SM_CYICON);
HIMAGELIST hLarge= ImageList_Create(x, y, ILC_MASK, 3, 2);
//把图标加入到 ImageLists去
for (int i = 0; i < 3; ++i)
{
HICON hIcon = LoadIcon(((LPCREATESTRUCT)lParam)->hInstance, MAKEINTRESOURCE(IDI_ICON1+ i));
ImageList_AddIcon(hLarge, hIcon);
DestroyIcon(hIcon);
}
//把image Lists与 listView 相关联
SendMessage(hListView, LVM_SETIMAGELIST, LVSIL_NORMAL, (LPARAM)hLarge);
//插入项目
for (int i = 0; i < 3; ++i)
{
LVITEM lv;
lv.pszText = (i == 0) ? L"音乐" : ((i == 1) ? L"啤酒" : L"炸鸡");
lv.mask = LVIF_TEXT| LVIF_IMAGE| LVIF_STATE ; //哪些值有效的标记码
lv.iItem = i; //插入的位置
lv.iImage = i;//图像的索引
lv.state = (i == 2) ? LVIS_SELECTED:0; //是否选中
lv.iSubItem = 0;
SendMessage(hListView, LVM_INSERTITEM,0,(LPARAM) &lv);
}
//设置控件有焦点
SetFocus(hListView);
//设置文本颜色
SendMessage(hListView, LVM_SETTEXTCOLOR, 0, (LPARAM) RGB(255,0,0));
//设置背景颜色
SendMessage(hListView, LVM_SETBKCOLOR, 0, (LPARAM)RGB(0, 255, 0));
//设置文本背景颜色
SendMessage(hListView, LVM_SETTEXTBKCOLOR, 0, (LPARAM)RGB(0, 0, 255));
}break;
}
return DefWindowProc(hWnd, Msg, wParam, lParam);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nShowCmd)
{
//1.注册窗口类
WNDCLASS wnd;
wnd.cbClsExtra = 0;
wnd.cbWndExtra = 0;
wnd.hbrBackground = (HBRUSH)(GetStockObject(GRAY_BRUSH));//背景色
wnd.hCursor = LoadCursor(NULL, IDC_ARROW);//光标
wnd.hIcon = LoadIcon(NULL, IDI_APPLICATION);//图标
//wnd.lpfnWndProc = DefWindowProc;//默认窗口过程函数,用于处理消息
wnd.lpfnWndProc = MyWindowProc;//自定义的窗口过程函数
wnd.lpszClassName = L"MrHuang";//窗口类名
wnd.lpszMenuName = NULL;//菜单资源名称
wnd.style = CS_HREDRAW | CS_DBLCLKS;//窗口类、样式
wnd.hInstance = hInstance;//实例句柄
RegisterClass(&wnd);
//创建窗口(返回之前发送WM_CREATE)
HWND hWnd = CreateWindow(L"MrHuang", L"第一个窗口程序",
WS_OVERLAPPEDWINDOW, 100, 100, 400, 400, NULL, NULL, hInstance, NULL);
//显示窗口
ShowWindow(hWnd, nShowCmd);
//更新窗口(发送WM_PAINT)
UpdateWindow(hWnd);
//消息循环(收到WM_QUIT消息退出)
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);//翻译消息
DispatchMessage(&msg);//分发消息到窗口过程
}
}
②小图标以及列表视图
#include
#include
#include"resource.h" //包含图标资源ID
#pragma comment(lib, "Comctl32.lib") //加入lib文件
//自定义的窗口过程
LRESULT CALLBACK MyWindowProc(HWND hWnd, UINT Msg,
WPARAM wParam, LPARAM lParam)
{
switch (Msg)
{
case WM_DESTROY:
PostQuitMessage(0);//可以使GetMessage返回0
return 0;
case WM_NOTIFY:
{
NMHDR *pHDR = (NMHDR*)lParam;
if ((pHDR->code == LVN_ITEMCHANGED) && (pHDR->idFrom == 111))
{
LPNMLISTVIEW pnmv = (LPNMLISTVIEW)lParam;
if (pnmv->uChanged == LVIF_STATE)//是不是选中状态改变了
{
if (pnmv->uNewState & LVIS_SELECTED)
{
//根据索引pnmv->iItem获取文本
LVITEM lv;
TCHAR buf[64] = { 0 };
lv.iSubItem = 0;
lv.pszText = buf; //向系统提供写入内存
lv.cchTextMax = sizeof(buf);//buf的长度
SendMessage(pHDR->hwndFrom, LVM_GETITEMTEXT, pnmv->iItem, (LPARAM)&lv);
MessageBox(hWnd, buf, L"提示", MB_OK);
}
}
}
}break;
case WM_CREATE:
{
//创建列表视图 LVS_SMALLICON 小图标视图
/*HWND hListView = CreateWindow(WC_LISTVIEW, L"XXX",
WS_CHILD | WS_VISIBLE | LVS_SMALLICON, 30, 30, 300, 300, hWnd, (HMENU)111,
((LPCREATESTRUCT)lParam)->hInstance, NULL);*/
//创建列表视图 LVS_LIST 列表视图
HWND hListView = CreateWindow(WC_LISTVIEW, L"XXX",
WS_CHILD | WS_VISIBLE | LVS_LIST, 30, 30, 300, 300, hWnd, (HMENU)111,
((LPCREATESTRUCT)lParam)->hInstance, NULL);
//创建Image Lists (小图标SM_CXSMICON)
UINT x = GetSystemMetrics(SM_CXSMICON);
UINT y = GetSystemMetrics(SM_CXSMICON);
HIMAGELIST hSmall = ImageList_Create(x, y, ILC_MASK, 3, 2);
//把图标加入到 ImageLists去
for (int i = 0; i < 3; ++i)
{
HICON hIcon = LoadIcon(((LPCREATESTRUCT)lParam)->hInstance, MAKEINTRESOURCE(IDI_ICON1 + i));
ImageList_AddIcon(hSmall, hIcon);
DestroyIcon(hIcon);
}
//把image Lists与 listView 相关联 LVSIL_SMALL
SendMessage(hListView, LVM_SETIMAGELIST, LVSIL_SMALL, (LPARAM)hSmall);
//插入项目
for (int i = 0; i < 3; ++i)
{
LVITEM lv;
lv.pszText = (i == 0) ? L"音乐" : ((i == 1) ? L"啤酒" : L"炸鸡");
lv.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_STATE; //哪些值有效的标记码
lv.iItem = i; //插入的位置
lv.iImage = i;//图像的索引
lv.state = (i == 2) ? LVIS_SELECTED : 0; //是否选中
lv.iSubItem = 0;
SendMessage(hListView, LVM_INSERTITEM, 0, (LPARAM)&lv);
}
//设置控件有焦点
SetFocus(hListView);
//设置文本颜色
SendMessage(hListView, LVM_SETTEXTCOLOR, 0, (LPARAM)RGB(255, 0, 0));
//设置背景颜色
SendMessage(hListView, LVM_SETBKCOLOR, 0, (LPARAM)RGB(0, 255, 0));
//设置文本背景颜色
SendMessage(hListView, LVM_SETTEXTBKCOLOR, 0, (LPARAM)RGB(0, 0, 255));
}break;
}
return DefWindowProc(hWnd, Msg, wParam, lParam);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nShowCmd)
{
//1.注册窗口类
WNDCLASS wnd;
wnd.cbClsExtra = 0;
wnd.cbWndExtra = 0;
wnd.hbrBackground = (HBRUSH)(GetStockObject(GRAY_BRUSH));//背景色
wnd.hCursor = LoadCursor(NULL, IDC_ARROW);//光标
wnd.hIcon = LoadIcon(NULL, IDI_APPLICATION);//图标
//wnd.lpfnWndProc = DefWindowProc;//默认窗口过程函数,用于处理消息
wnd.lpfnWndProc = MyWindowProc;//自定义的窗口过程函数
wnd.lpszClassName = L"MrHuang";//窗口类名
wnd.lpszMenuName = NULL;//菜单资源名称
wnd.style = CS_HREDRAW | CS_DBLCLKS;//窗口类、样式
wnd.hInstance = hInstance;//实例句柄
RegisterClass(&wnd);
//创建窗口(返回之前发送WM_CREATE)
HWND hWnd = CreateWindow(L"MrHuang", L"第一个窗口程序",
WS_OVERLAPPEDWINDOW, 100, 100, 400, 400, NULL, NULL, hInstance, NULL);
//显示窗口
ShowWindow(hWnd, nShowCmd);
//更新窗口(发送WM_PAINT)
UpdateWindow(hWnd);
//消息循环(收到WM_QUIT消息退出)
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);//翻译消息
DispatchMessage(&msg);//分发消息到窗口过程
}
}
③报表视图
#include
#include
#include"resource.h" //包含图标资源ID
#pragma comment(lib, "Comctl32.lib") //加入lib文件
//加入指令改变控件的风格
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
//自定义的窗口过程
LRESULT CALLBACK MyWindowProc(HWND hWnd, UINT Msg,
WPARAM wParam, LPARAM lParam)
{
switch (Msg)
{
case WM_DESTROY:
PostQuitMessage(0);//可以使GetMessage返回0
return 0;
case WM_NOTIFY:
{
NMHDR *pHDR = (NMHDR*)lParam;
if ((pHDR->code == LVN_ITEMCHANGED) && (pHDR->idFrom == 111))
{
LPNMLISTVIEW pnmv = (LPNMLISTVIEW)lParam;
if (pnmv->uChanged == LVIF_STATE)//是不是选中状态改变了
{
if (pnmv->uNewState & LVIS_SELECTED)
{
//根据索引pnmv->iItem获取文本
LVITEM lv;
TCHAR buf[64] = { 0 };
lv.iSubItem = 2;
lv.pszText = buf; //向系统提供写入内存
lv.cchTextMax = sizeof(buf);//buf的长度
SendMessage(pHDR->hwndFrom, LVM_GETITEMTEXT, pnmv->iItem, (LPARAM)&lv);
MessageBox(hWnd, buf, L"提示", MB_OK);
}
}
}
}break;
case WM_CREATE:
{
//创建列表视图 LVS_REPORT 报表视图
HWND hListView = CreateWindow(WC_LISTVIEW, L"XXX",
WS_CHILD | WS_VISIBLE | LVS_REPORT, 30, 30, 300, 300, hWnd, (HMENU)111,
((LPCREATESTRUCT)lParam)->hInstance, NULL);
//创建Image Lists (小图标SM_CXSMICON)
UINT x = GetSystemMetrics(SM_CXSMICON);
UINT y = GetSystemMetrics(SM_CXSMICON);
HIMAGELIST hSmall = ImageList_Create(x, y, ILC_MASK, 3, 2);
//把图标加入到 ImageLists去
for (int i = 0; i < 3; ++i)
{
HICON hIcon = LoadIcon(((LPCREATESTRUCT)lParam)->hInstance, MAKEINTRESOURCE(IDI_ICON1 + i));
ImageList_AddIcon(hSmall, hIcon);
DestroyIcon(hIcon);
}
//把image Lists与 listView 相关联 LVSIL_SMALL
SendMessage(hListView, LVM_SETIMAGELIST, LVSIL_SMALL, (LPARAM)hSmall);
//设置控件的扩展样式
SendMessage(hListView, LVM_SETEXTENDEDLISTVIEWSTYLE, 0,
(LPARAM)(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES));
//插入列
for (int i = 0; i < 3; ++i)
{
LVCOLUMN lvc;
lvc.pszText = (i == 0 ? L"姓名" : (i == 1 ? L"性别" : L"年龄"));
lvc.mask= LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
lvc.iSubItem = 0; //第几列
lvc.cx = 100;//列的宽度
lvc.fmt = (i == 0 ? LVCFMT_LEFT : LVCFMT_CENTER); //文本对齐方式
SendMessage(hListView, LVM_INSERTCOLUMN, i , (LPARAM) &lvc );
}
//插入一行数据
for (int i = 0; i < 3; ++i)
{
LVITEM lv;
lv.pszText = (i == 0) ? L"张三" : ((i == 1) ? L"男" : L"13");
lv.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_STATE; //哪些值有效的标记码
lv.iItem = 0; //插入第0行
lv.iImage = i;//图像的索引
lv.state = (i == 2) ? LVIS_SELECTED : 0; //是否选中
lv.iSubItem = i; //第几列的文本
//表示插入一行
if(i==0) SendMessage(hListView, LVM_INSERTITEM, 0, (LPARAM)&lv);
//表示插入第几列的文本
else SendMessage(hListView, LVM_SETITEMTEXT, 0, (LPARAM)&lv);
}
//设置控件有焦点
SetFocus(hListView);
//设置文本颜色
//SendMessage(hListView, LVM_SETTEXTCOLOR, 0, (LPARAM)RGB(255, 0, 0));
//设置背景颜色
//SendMessage(hListView, LVM_SETBKCOLOR, 0, (LPARAM)RGB(0, 255, 0));
//设置文本背景颜色
//SendMessage(hListView, LVM_SETTEXTBKCOLOR, 0, (LPARAM)RGB(0, 0, 255));
}break;
}
return DefWindowProc(hWnd, Msg, wParam, lParam);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nShowCmd)
{
//1.注册窗口类
WNDCLASS wnd;
wnd.cbClsExtra = 0;
wnd.cbWndExtra = 0;
wnd.hbrBackground = (HBRUSH)(GetStockObject(GRAY_BRUSH));//背景色
wnd.hCursor = LoadCursor(NULL, IDC_ARROW);//光标
wnd.hIcon = LoadIcon(NULL, IDI_APPLICATION);//图标
//wnd.lpfnWndProc = DefWindowProc;//默认窗口过程函数,用于处理消息
wnd.lpfnWndProc = MyWindowProc;//自定义的窗口过程函数
wnd.lpszClassName = L"MrHuang";//窗口类名
wnd.lpszMenuName = NULL;//菜单资源名称
wnd.style = CS_HREDRAW | CS_DBLCLKS;//窗口类、样式
wnd.hInstance = hInstance;//实例句柄
RegisterClass(&wnd);
//创建窗口(返回之前发送WM_CREATE)
HWND hWnd = CreateWindow(L"MrHuang", L"第一个窗口程序",
WS_OVERLAPPEDWINDOW, 100, 100, 400, 400, NULL, NULL, hInstance, NULL);
//显示窗口
ShowWindow(hWnd, nShowCmd);
//更新窗口(发送WM_PAINT)
UpdateWindow(hWnd);
//消息循环(收到WM_QUIT消息退出)
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);//翻译消息
DispatchMessage(&msg);//分发消息到窗口过程
}
}