窗口的三种风格

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

最后修改:2020 年 08 月 26 日
如果觉得我的文章对你有用,请随意赞赏