窗口的三种风格
重叠窗口:WS_OVERLAPPEDWINDOW
一般是作为主窗口
弹出窗口:WS_POPUPWINDOW
一般是程序运行时的提示窗口,操作面板。。
子窗口:WS_CHILD
一般是控件
控件
创建控件CreateWindow(..WS_CHILD|WS_VISIABLE..,ID...);
标准控件:(简单一些的控件)按钮 复选框 单选框 文本框 下拉框 静态文本
当你点击了标准控件的时候,会给父窗口发送,WM_COMMAD事件,其中包含如下两个信息:ID:LOWORD(wParam)
Code:HIWORD(wParam)
控件句柄:lParam
通用控件:(扩展的控件,有比较复杂的)
树(tree) 列表(list view) 选项卡(tab)
当你点击了标准控件的时候,给父窗口发送:WM_NOTIFY
创建控件的示例代码:
case WM_CREATE://一般进行一些初始化的操作
{
//WM_CREATE的lParam参数携带的是创建窗口时的信息。
LPCREATESTRUCT pcs = (LPCREATESTRUCT)lParam;
//1 创建按钮
hButton1 = CreateWindow(
_T("button"),
_T("点我"),
BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE,
100, 100, 80, 30,
hWnd,
(HMENU)0x1001,
pcs->hInstance,
0
);
hButton2 = CreateWindow(
_T("button"),
_T("别点我"),
BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE,
190, 100, 80, 30,
hWnd,
(HMENU)0x1002,
pcs->hInstance,
0
);
hButton3 = CreateWindow(_T("button"), _T("获取文本"),
BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE,
100, 140, 80, 30, hWnd, (HMENU)0x1003, pcs->hInstance,
0);
hButton4 = CreateWindow(_T("button"), _T("设置文本"),
BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE,
190, 140, 80, 30, hWnd, (HMENU)0x1004, pcs->hInstance,
0);
//2 创建文本框
hText1 = CreateWindow(
_T("edit"),
_T(""),
WS_CHILD | WS_VISIBLE|WS_BORDER,
100, 180, 200, 30,
hWnd,
(HMENU)0x2001,
g_hInstance,
NULL
);
//3 创建。。。。
}
break;
控件响应的示例代码:
case WM_COMMAND:
{
int nCode = HIWORD(wParam);
int nId = LOWORD(wParam);
switch (nId)
{
case 0x1001://除了弹你好之外,再移动一下按钮2
if (nCode==BN_CLICKED)
{
MessageBox(0, L"你好啊", L"呵呵", 0);
MoveWindow(hButton2, 300, 100, 80, 80, TRUE);
}
break;
case 0x1002:
{
MessageBox(0, L"告诉你别点我", L"呵呵", 0);
static int n = 0;
if (n==0)
{
ShowWindow((HWND)0x00020206, SW_SHOW);
n = 1;
}
else
{
ShowWindow((HWND)0x00020206, SW_SHOW);
n = 0;
}
}
break;
case 0x1003://获取文本框文本
{
TCHAR buf[100] = {};
//GetWindowText(hWnd, buf, 100);
GetWindowText(hText1, buf, 100);
MessageBox(0, buf, _T("提示"), 0);
}
break;
case 0x1004://获取到文本,加个1,再设置回去
{
TCHAR buf[100] = {};
int nNum = 0;
//1 获取文本,转为数字
GetWindowText(hText1, buf, 100);
_stscanf_s(buf, _T("%d"), &nNum);
//2 自增之后,转为文本,设置到编辑框上
nNum++;
_stprintf_s(buf, _T("%d"), nNum);
SetWindowText(hText1, buf);
}
break;
default:
break;
}
}break;
资源
图标:IDI_ICON1
就是此图标资源的ID。
我们也可以导入光标资源:
wc.hIcon = LoadIcon(hInstance,MAKEINTRESOURCE( IDI_ICON1));
wc.hCursor = LoadCursor(hInstance, MAKEINTRESOURCE(IDC_CURSOR1));
菜单资源:
顶级菜单,是用于弹出下拉菜单的,没有其他的消息产生
下拉菜单,是有具体消息产生的
窗口类
wc.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1);
创建窗口的时候:
弹出菜单
主要需要使用:TrackPopupMenu
主要需要注意的2个点:
1 坐标要使用屏幕坐标
2 弹出的菜单,需要是下拉菜单,最好不是顶级菜单。
case WM_RBUTTONDOWN://鼠标右键单击
{
//这个坐标是相对于窗口的坐标
int x = LOWORD(lParam);
int y = HIWORD(lParam);
//弹出的时候,使用是相对于屏幕的坐标
//需要做一个转换
POINT pt = { x,y };
ClientToScreen(hWnd, &pt);
//弹出菜单
HMENU hMenu = LoadMenu(g_hInstance, MAKEINTRESOURCE(IDR_MENU1));
//获取下拉菜单的句柄
HMENU hSubMenu0 =GetSubMenu(hMenu, 0);
HMENU hSubMenu1 = GetSubMenu(hMenu, 1);
TrackPopupMenu(
hSubMenu1, //要弹出的菜单的句柄
TPM_LEFTALIGN,//对齐方式等属性
pt.x, pt.y, //弹出的坐标
0, //保留的参数 ,没有用
hWnd, //菜单的响应窗口是谁
NULL
);
}break;
对话框编程:
添加一个dlg资源: