窗口有三大风格:

重叠窗口: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

创建控件的示例代码:

  1. case WM_CREATE://一般进行一些初始化的操作
  2. {
  3. //WM_CREATE的lParam参数携带的是创建窗口时的信息。
  4. LPCREATESTRUCT pcs = (LPCREATESTRUCT)lParam;
  5. //1 创建按钮
  6. hButton1 = CreateWindow(
  7. _T("button"),
  8. _T("点我"),
  9. BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE,
  10. 100, 100, 80, 30,
  11. hWnd,
  12. (HMENU)0x1001,
  13. pcs->hInstance,
  14. 0
  15. );
  16. hButton2 = CreateWindow(
  17. _T("button"),
  18. _T("别点我"),
  19. BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE,
  20. 190, 100, 80, 30,
  21. hWnd,
  22. (HMENU)0x1002,
  23. pcs->hInstance,
  24. 0
  25. );
  26. hButton3 = CreateWindow(_T("button"), _T("获取文本"),
  27. BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE,
  28. 100, 140, 80, 30, hWnd, (HMENU)0x1003, pcs->hInstance,
  29. 0);
  30. hButton4 = CreateWindow(_T("button"), _T("设置文本"),
  31. BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE,
  32. 190, 140, 80, 30, hWnd, (HMENU)0x1004, pcs->hInstance,
  33. 0);
  34. //2 创建文本框
  35. hText1 = CreateWindow(
  36. _T("edit"),
  37. _T(""),
  38. WS_CHILD | WS_VISIBLE|WS_BORDER,
  39. 100, 180, 200, 30,
  40. hWnd,
  41. (HMENU)0x2001,
  42. g_hInstance,
  43. NULL
  44. );
  45. //3 创建。。。。
  46. }
  47. break;

控件响应的示例代码:

  1. case WM_COMMAND:
  2. {
  3. int nCode = HIWORD(wParam);
  4. int nId = LOWORD(wParam);
  5. switch (nId)
  6. {
  7. case 0x1001://除了弹你好之外,再移动一下按钮2
  8. if (nCode==BN_CLICKED)
  9. {
  10. MessageBox(0, L"你好啊", L"呵呵", 0);
  11. MoveWindow(hButton2, 300, 100, 80, 80, TRUE);
  12. }
  13. break;
  14. case 0x1002:
  15. {
  16. MessageBox(0, L"告诉你别点我", L"呵呵", 0);
  17. static int n = 0;
  18. if (n==0)
  19. {
  20. ShowWindow((HWND)0x00020206, SW_SHOW);
  21. n = 1;
  22. }
  23. else
  24. {
  25. ShowWindow((HWND)0x00020206, SW_SHOW);
  26. n = 0;
  27. }
  28. }
  29. break;
  30. case 0x1003://获取文本框文本
  31. {
  32. TCHAR buf[100] = {};
  33. //GetWindowText(hWnd, buf, 100);
  34. GetWindowText(hText1, buf, 100);
  35. MessageBox(0, buf, _T("提示"), 0);
  36. }
  37. break;
  38. case 0x1004://获取到文本,加个1,再设置回去
  39. {
  40. TCHAR buf[100] = {};
  41. int nNum = 0;
  42. //1 获取文本,转为数字
  43. GetWindowText(hText1, buf, 100);
  44. _stscanf_s(buf, _T("%d"), &nNum);
  45. //2 自增之后,转为文本,设置到编辑框上
  46. nNum++;
  47. _stprintf_s(buf, _T("%d"), nNum);
  48. SetWindowText(hText1, buf);
  49. }
  50. break;
  51. default:
  52. break;
  53. }
  54. }break;

资源:
图标:
image.png

image.png

image.png

IDI_ICON1就是此图标资源的ID。
我们也可以导入光标资源:

  1. wc.hIcon = LoadIcon(hInstance,MAKEINTRESOURCE( IDI_ICON1));
  2. wc.hCursor = LoadCursor(hInstance, MAKEINTRESOURCE(IDC_CURSOR1));

菜单资源:
顶级菜单,是用于弹出下拉菜单的,没有其他的消息产生
下拉菜单,是有具体消息产生的
image.png

窗口类:

  1. wc.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1);

创建窗口的时候:
image.png

弹出菜单:
主要需要使用:
TrackPopupMenu
主要需要注意的2个点:
1 坐标要使用屏幕坐标
2 弹出的菜单,需要是下拉菜单,最好不是顶级菜单。

  1. case WM_RBUTTONDOWN://鼠标右键单击
  2. {
  3. //这个坐标是相对于窗口的坐标
  4. int x = LOWORD(lParam);
  5. int y = HIWORD(lParam);
  6. //弹出的时候,使用是相对于屏幕的坐标
  7. //需要做一个转换
  8. POINT pt = { x,y };
  9. ClientToScreen(hWnd, &pt);
  10. //弹出菜单
  11. HMENU hMenu = LoadMenu(g_hInstance, MAKEINTRESOURCE(IDR_MENU1));
  12. //获取下拉菜单的句柄
  13. HMENU hSubMenu0 =GetSubMenu(hMenu, 0);
  14. HMENU hSubMenu1 = GetSubMenu(hMenu, 1);
  15. TrackPopupMenu(
  16. hSubMenu1, //要弹出的菜单的句柄
  17. TPM_LEFTALIGN,//对齐方式等属性
  18. pt.x, pt.y, //弹出的坐标
  19. 0, //保留的参数 ,没有用
  20. hWnd, //菜单的响应窗口是谁
  21. NULL
  22. );
  23. }break;

对话框编程:

添加一个dlg资源:
image.png