第一次写博客,见谅
注意:
- 真的从0开始,只有一点C/C++基础
- 之前的学习记录都在电脑里,之后有空慢慢传上来
- 学的是win32,用的是vs2013,看的视频里老师用的是vs2010
- 写这个的主要目的是怕自己之后忘了,方便捡起来
--学习内容:静态控件:windows标准控件,也是子窗口,窗口类名是static(之前按钮的类名是button) 可用于显示文本、图形、位图
1)控件样式
SS_SIMPLE//单行文本(超出范围的部分不显示;若控件尺寸设定超过显示文本所需,也只显示有文本的部分)
SS_CENTER/LEFT/RIGHT//文字相对于文本框居中或者靠左靠右,会被SS_SIMPLE覆盖
SS_LEFTNOWORDWRAP//靠左多行文字(遇到\n换行)
SS_NOTIFY//可以向父窗口传递点击信息,详见4)
SS_WHITEFRAME//白色边框,不能显示文本
SS_BLACKRECT//黑色矩形,不能显示文本
*:WS window style,所有窗口都适用,一般子窗口都需要设置WS_VISIBLE|WS_CHILD。SS只用于静态控件样式
2)创建控件:在窗口过程函数对于WM_CREATE消息的处理中使用CreateWindow函数
注意:1.lpWindowName指窗口标题,用于文本时填文本内容;*:SetWindowText(HWND hwnd,L"...");可用于设置窗口标题,对于文本控件即设置文本
2.父窗口的hInstance无法直接获取,需要通过传给窗口过程的lParam获取:LPCREATESTRUCT pcs=(LPCREATESTUCT)lParam//创建一个创建结构体指针,用lParam赋值,也可以直接用上节课的GetMoudule函数
3.如果遇到闪退,可以看看窗口过程中每个case下是否都写了return 0;没写会闪退
case WM_CREATE:
{
LPCREATESTRUCT pcs = (LPCREATESTRUCT)lParam;
//Static control
HWND hstac=CreateWindow(L"static",//窗口类名称
L"德莉莎世界第一可爱",//内容
WS_CHILD | WS_VISIBLE |SS_BLACKRECT,//样式
50, 50, 200, 30,//位置及尺寸
hwnd,//父窗口句柄
(HMENU)2,//随便设置的一个整数
pcs->hInstance,
NULL);
return 0;
}
3)静态控件显示位图
创建位图,加载位图,然后也是用SendMessage向Static控件发送消息与之关联,不过发的是STM_SETIMAGE/ICON
注:1.创建位图的时候可以先关闭一开始弹出的选项卡,再重新双击资源文件中的.bmp文件,这样作图界面会……工具丰富一点?
case WM_CREATE:
{
LPCREATESTRUCT pcs = (LPCREATESTRUCT)lParam;
//Static control
HWND hstac=CreateWindow(L"static", L"德莉莎世界第一可爱", WS_CHILD | WS_VISIBLE |SS_BITMAP,50, 50, 200, 30, hwnd, (HMENU)2, pcs->hInstance,NULL);//之前内容完全不改动
//加载位图
HBITMAP hbmp=LoadBitmap(pcs->hInstance,MAKEINTRESOURCE(101)); //见“资源”学习笔记
SendMessage(hstac, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hbmp);//*
return 0;
}
*:STM_SETIMAGE是被发送给控件的消息,意思是给控件设置图片;IMAGE_BITMAP是WPARAM参数,表示内容(吧……?)
4)向父窗口传递消息
当样式设置了SS_NOTIFY且控件与客户有交互(比如被点击),则会向父窗口过程发送WM_COMMAND消息。所以可以在窗口过程中写case WM_COMMAND来响应
case WM_COMMAND:
{
WORD id = LOWORD(wParam);//控件ID
WORD code = HIWORD(wParam);//消息码
HWND hctrl = (HWND)lParam;
if (id == 2&&code==STN_CLICKED){
MessageBox(NULL, L"飞起来咯~", L"Terriri:", MB_OK);//弹出消息窗口
}
}break;
5)美化--改变文字及其背景颜色:在父窗口过程中处理WM_CTLCOLORSTATIC
WM_CTLCOLORSTATIC是静态控件以及只读或者禁用状态的编辑栏控件在即将绘制时想父窗口过程发送的消息。对于静态控件,父窗口过程可以借此设置文本前/背景色
消息参数:WPARAM为设备环境句柄HDC; LPARAM为控件句柄hctrl;
case WM_CTLCOLORSTATIC:
{
HDC hdc = (HDC)wParam;//设备环境句柄,用于绘图
HWND hStatic = (HWND)lParam;
SetTextColor(hdc, RGB(255, 0, 0));//通过这个函数设置字体颜色为红色
SetBkColor(hdc, RGB(0, 0, 255));//设置文字背景色为蓝色
return (LRESULT)GetStockObject(BLACK_BRUSH);//通过返回一个画刷来把控件尺寸内非文本的部分填色为黑色
//return (LRESULT)CreateSolidBrush(RGB(x,y,z));自己整一个颜色
}break;
*:如果不想要文字背景颜色:SetBkMode(hdc,TRANSPARENT);(啊这配色,妙啊)
6)GetWindowLong函数
当有多个控件的时候,会发现被相同处理了:
这时候可以通过GetWindowLong函数获取控件ID+if来区分
LONG WINAPI GetWindowLongW( HWND hWnd, int nIndex);//第一个参数是控件句柄,第二个参数是消息索引。
可以通过这个函数获取消息索引中规定的控件信息。
消息索引(部分):
GWL_ID//控件ID
GWL_HINSTANCE//应用程序实例句柄
GWL_HWNDPARENT//父窗口句柄
case WM_CTLCOLORSTATIC:
{
HDC hdc = (HDC)wParam;//设备环境句柄,用于绘图
HWND hStatic = (HWND)lParam;
UINT ID = GetWindowLong(hStatic, GWL_ID);
if (ID==2)
SetTextColor(hdc, RGB(255, 0, 0));//德莉莎字体颜色为红色
else if (ID==3)
SetTextColor(hdc, RGB(255, 201, 14));//符华字体颜色为金色
SetBkMode(hdc, TRANSPARENT);
return (LRESULT)GetStockObject(BLACK_BRUSH);//通过返回一个画刷来把控件尺寸内非文本的部分填色为黑色
//return (LRESULT)CreateSolidBrush(RGB(x,y,z));自己整一个颜色
}break;