第二十八篇 -- 写一个简陋的WIFI服务器界面
效果图:

Dlg.cpp
// WIFIWMITestDlg.cpp : implementation file
// #include "stdafx.h"
#include "WIFIWMITest.h"
#include "WIFIWMITestDlg.h"
#include "afxdialogex.h" #ifdef _DEBUG
#define new DEBUG_NEW
#endif // CAboutDlg dialog used for App About class CAboutDlg : public CDialogEx
{
public:
CAboutDlg(); // Dialog Data
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_ABOUTBOX };
#endif protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support // Implementation
protected:
DECLARE_MESSAGE_MAP()
}; CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX)
{
} void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
} BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP() // CWIFIWMITestDlg dialog CWIFIWMITestDlg::CWIFIWMITestDlg(CWnd* pParent /*=nullptr*/)
: CDialogEx(IDD_WIFIWMITEST_DIALOG, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
} void CWIFIWMITestDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_STATIC8, Icon_Static);
DDX_Control(pDX, IDC_STATIC9, Icon_Static_Green);
DDX_Control(pDX, IDC_STATIC1, Server_Status);
} BEGIN_MESSAGE_MAP(CWIFIWMITestDlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_COMMAND(ID_SERVER_START, &CWIFIWMITestDlg::OnServerStart)
ON_COMMAND(ID_SERVER_STOP, &CWIFIWMITestDlg::OnServerStop)
ON_UPDATE_COMMAND_UI(ID_SERVER_STOP, &CWIFIWMITestDlg::OnUpdateServerStop)
END_MESSAGE_MAP() // CWIFIWMITestDlg message handlers BOOL CWIFIWMITestDlg::OnInitDialog()
{
CDialogEx::OnInitDialog(); // Add "About..." menu item to system menu. // IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != nullptr)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
} // Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here
//添加menu菜单
m_Menu.LoadMenu(IDR_MENU1); // IDR_MENU1
SetMenu(&m_Menu);
//使菜单变灰
m_Menu.GetSubMenu(0)->EnableMenuItem(ID_SERVER_STOP, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); //添加红绿灰三种图标
DWORD dwStyle = WS_VISIBLE | WS_CHILD | SS_ICON;
::SetWindowLong(Icon_Static.m_hWnd, GWL_STYLE, dwStyle);
::SetWindowLong(Icon_Static_Green.m_hWnd, GWL_STYLE, dwStyle);
//HICON hIcon = ::LoadIcon(AfxGetResourceHandle(), MAKEINTRESOURCE(IDI_ICON1));
//((CStatic *)GetDlgItem(IDC_STATIC5))->SetIcon(hIcon);
HICON hIcon_red = (HICON)::LoadImage(AfxGetInstanceHandle(),
1 ? MAKEINTRESOURCE(IDI_ICON1) : MAKEINTRESOURCE(IDI_ICON2),
IMAGE_ICON, 16, 16, LR_SHARED);
HICON hIcon_gray = (HICON)::LoadImage(AfxGetInstanceHandle(),
0 ? MAKEINTRESOURCE(IDI_ICON1) : MAKEINTRESOURCE(IDI_ICON3),
IMAGE_ICON, 16, 16, LR_SHARED);
((CStatic *)GetDlgItem(IDC_STATIC8))->SetIcon(hIcon_red);
((CStatic *)GetDlgItem(IDC_STATIC9))->SetIcon(hIcon_gray); return TRUE; // return TRUE unless you set the focus to a control
} void CWIFIWMITestDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialogEx::OnSysCommand(nID, lParam);
}
} // If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework. void CWIFIWMITestDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2; // Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialogEx::OnPaint();
}
} // The system calls this function to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CWIFIWMITestDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
} void CWIFIWMITestDlg::OnServerStart()
{
// TODO: Add your command handler code here
CWnd* pWnd = GetDlgItem(IDC_STATIC1);
pWnd->SetWindowText(_T(" Server is online!")); HICON hIcon_green = (HICON)::LoadImage(AfxGetInstanceHandle(),
0 ? MAKEINTRESOURCE(IDI_ICON1) : MAKEINTRESOURCE(IDI_ICON2),
IMAGE_ICON, 16, 16, LR_SHARED);
((CStatic *)GetDlgItem(IDC_STATIC9))->SetIcon(hIcon_green); HICON hIcon_gray = (HICON)::LoadImage(AfxGetInstanceHandle(),
0 ? MAKEINTRESOURCE(IDI_ICON1) : MAKEINTRESOURCE(IDI_ICON3),
IMAGE_ICON, 16, 16, LR_SHARED);
((CStatic *)GetDlgItem(IDC_STATIC8))->SetIcon(hIcon_gray); //恢复菜单变亮
m_Menu.GetSubMenu(0)->EnableMenuItem(ID_SERVER_STOP, MF_BYCOMMAND | MF_ENABLED);
//使菜单变灰
m_Menu.GetSubMenu(0)->EnableMenuItem(ID_SERVER_START, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
//MessageBox((LPCTSTR)"Server Ready!");
} void CWIFIWMITestDlg::OnServerStop()
{
// TODO: Add your command handler code here
CWnd* pWnd = GetDlgItem(IDC_STATIC1);
pWnd->SetWindowText(_T(" Server is offline!")); HICON hIcon_red = (HICON)::LoadImage(AfxGetInstanceHandle(),
1 ? MAKEINTRESOURCE(IDI_ICON1) : MAKEINTRESOURCE(IDI_ICON2),
IMAGE_ICON, 16, 16, LR_SHARED);
((CStatic *)GetDlgItem(IDC_STATIC8))->SetIcon(hIcon_red); HICON hIcon_gray = (HICON)::LoadImage(AfxGetInstanceHandle(),
0 ? MAKEINTRESOURCE(IDI_ICON1) : MAKEINTRESOURCE(IDI_ICON3),
IMAGE_ICON, 16, 16, LR_SHARED);
((CStatic *)GetDlgItem(IDC_STATIC9))->SetIcon(hIcon_gray); //恢复菜单变亮
m_Menu.GetSubMenu(0)->EnableMenuItem(ID_SERVER_START, MF_BYCOMMAND | MF_ENABLED);
//使菜单变灰
m_Menu.GetSubMenu(0)->EnableMenuItem(ID_SERVER_STOP, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
} void CWIFIWMITestDlg::OnUpdateServerStop(CCmdUI *pCmdUI)
{
// TODO: Add your command update UI handler code here
}
Dlg.h
// WIFIWMITestDlg.h : header file
// #pragma once // CWIFIWMITestDlg dialog
class CWIFIWMITestDlg : public CDialogEx
{
// Construction
public:
CWIFIWMITestDlg(CWnd* pParent = nullptr); // standard constructor // Dialog Data
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_WIFIWMITEST_DIALOG };
#endif protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support // Implementation
protected:
HICON m_hIcon; // Generated message map functions
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP() public:
CMenu m_Menu;
afx_msg void OnServerStart();
CStatic Icon_Static;
CStatic Icon_Static_Green;
CStatic Server_Status;
afx_msg void OnServerStop();
afx_msg void OnUpdateServerStop(CCmdUI *pCmdUI);
};
菜单的模样

分隔符这个问题,看下面

将下拉菜单要添加分隔符的地方,把Separator设置为True就行了。
第二十八篇 -- 写一个简陋的WIFI服务器界面的更多相关文章
- Android UI开发第二十八篇——Fragment中使用左右滑动菜单
Fragment实现了Android UI的分片管理,尤其在平板开发中,好处多多.这一篇将借助Android UI开发第二十六篇——Fragment间的通信. Android UI开发第二十七篇——实 ...
- Python之路【第二十八篇】:django视图层、模块层
1.视图函数 文件在view_demo 一个视图函数简称视图,是一个简单的Python 函数,它接受Web请求并且返回Web响应.响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XM ...
- Python之路【第二十八篇】:生成器与迭代器
#!/usr/bin/env python # -*- coding:utf-8 -*- #只要函数的代码里面出现了yield关键字,这个函数就不再是一个普通的函数了,叫做生成器函数 #执行生成器函数 ...
- Python之路(第二十八篇) 面向对象进阶:类的装饰器、元类
一.类的装饰器 类作为一个对象,也可以被装饰. 例子 def wrap(obj): print("装饰器-----") obj.x = 1 obj.y = 3 obj.z = 5 ...
- 第二十八篇:SOUI中自定义控件开发过程
在SOUI中已经提供了大部分常用的控件,但是内置控件不可能满足用户的所有要求,因此一个真实的应用少不得还要做一些自定义控件. 学习一个新东西,最简单的办法就是依葫芦画瓢.事实上在SOUI系统中内置控件 ...
- 第二十八篇、自定义的UITableViewCell上有图片需要显示,要求网络网络状态为WiFi时,显示图片高清图;网络状态为蜂窝移动网络时,显示图片缩略图
1)SDWebImage会自动帮助开发者缓存图片(包括内存缓存,沙盒缓存),所以我们需要设置用户在WiFi环境下下载的高清图,下次在蜂窝网络状态下打开应用也应显示高清图,而不是去下载缩略图. 2)许多 ...
- 第二十八篇-Fragment静态用法
效果图: 首先,先大致布局成这个形状 看动画中,横看分为两个区域,所以整体是一个水平排列 设置外层LinearLayout的参数 android:orientation="horizonta ...
- 第二十八篇 玩转数据结构——堆(Heap)和有优先队列(Priority Queue)
1.. 优先队列(Priority Queue) 优先队列与普通队列的区别:普通队列遵循先进先出的原则:优先队列的出队顺序与入队顺序无关,与优先级相关. 优先队列可以使用队列的接口,只是在 ...
- 第二十八篇:关于node.js连接数据库
好家伙,这个不难,但是也不简单. $ cnpm install mysql 教程里是带美元符的,但是我打的时候加上美元符用不了,所以我就没用美元符了,一样能行. 还有,淘宝镜像,yyds, var m ...
随机推荐
- 俄罗斯方块(c++)
这个俄罗斯方块是用c++基于windows控制台制作的. 源码地址:https://github.com/Guozhi-explore 话不多说,先上图感受一下:(控制台丑陋的界面不是我的锅emmm) ...
- 618技术特辑(三)直播带货王,“OMG买它”的背后,为什么是一连串技术挑战?
[本期推荐]为什么一到大促,我们的钱包总是被掏空?是大家自制力不够,还是电商平台太会读懂人心,从技术维度,抽丝剥茧一探究竟. 摘要:动辄几十上百万人同时在线的直播间,让所有人能同时公平的去抢购,并且还 ...
- Spring Cloud Alibaba(15)---Sleuth+Zipkin
SpringCloudAlibaba整合Sleuth+Zipkin 有关Sleuth之前有写过两篇文章 Spring Cloud Alibaba(13)---Sleuth概述 Spring Cloud ...
- Pytest测试框架入门到精通(一)
Python测试框架之前一直用的是unittest+HTMLTestRunner,听到有人说Pytest很好用,所以这边给大家介绍一下Pytest的使用 pytest是一个非常成熟的全功能的Pytho ...
- 谷歌:python速成课程笔记
1.从用户那里获取信息 name = "Alex" print("hello" + name) 2.让python成为你的计算器 1 print(4+5) 2 ...
- ES6中的Module与Interator
小编今天在用Vue做项目的时候,发现组件中有import和export,刚好今天看到相关的语法介绍和一些实例,下面小编就和大家一起进步.对于模块化规范,在es6出现之前,有以下三种规范,分别是Comm ...
- Go语言深度比较值是否相等
Go语言深度比较值是否相等 需求描述: 我们在开发过程中经常会遇到一些需要比较值是否相等的场景,例如比较两个数组.结构体.Map.等,自己写这些代码比较繁琐,大部分时候这里都可以使用到反射reflec ...
- 【.NET 与树莓派】TM1638 模块的按键扫描
上一篇水文中,老周马马虎虎地介绍 TM1638 的数码管驱动,这个模块除了驱动 LED 数码管,还有一个功能:按键扫描.记得前面的水文中老周写过一个 16 个按键的模块.那个是我们自己写代码去完成键扫 ...
- Processing中PImage类和loadImage()、createImage()函数的相关解析
聊一聊Processing中PImage类和loadImage().createImage()函数.因为要借P5做多媒体创意展示,图片是一个很重要的媒体.有必要就图片的获取和展放作总结. 首先 有一点 ...
- 技术如何转产品01——1+1>2?
当业务复杂到一定阶段的时候,效率问题会首当其冲,基本解法是化整为零.分赛道,对应的产物可以是子公司>>事业部>业务单元>项目组. 好处是目标聚焦.所以问题也会聚焦,工作内容闭 ...