windows开发技术 mfc浅谈

本篇文章我们来介绍一下mfc相关领域的知识

MFC(Microsoft Foundation Classes)是微软公司提供的一套C++类库,用于开发基于Windows平台的桌面应用程序。它是建立在Windows API之上的一个封装层,旨在简化Windows应用程序的开发过程。

MFC提供了许多类和函数,用于处理窗口、消息循环、控件、对话框、菜单等常见的GUI操作。开发者可以使用MFC来创建具有图形界面的Windows应用程序,并通过响应用户输入和系统消息来实现交互和功能。

通过MFC,开发者可以利用封装好的类和函数快速搭建和管理Windows应用程序的各个组件,而无需直接调用底层API。MFC还提供了许多工具和辅助函数,方便进行资源管理、数据持久化、线程处理等操作。

需要注意的是,MFC主要适用于传统的桌面应用程序开发,在新兴的跨平台和移动开发领域,并不是首选框架。但对于仍然需要在Windows平台上进行桌面应用程序开发的项目,MFC仍然是一个成熟且可行的选择。

mfc基本对话框程序代码实例:

cpp 复制代码
// MyDialog.h

#pragma once

#include <afxwin.h>

class MyDialog : public CDialog {
public:
    MyDialog(CWnd* pParent = nullptr);

    // 对话框数据
    #ifdef AFX_DESIGN_TIME
        enum { IDD = IDD_MYDIALOG };
    #endif

protected:
    virtual void DoDataExchange(CDataExchange* pDX);  // DDX/DDV 支持

    // 消息映射函数
    afx_msg void OnButtonClicked();

    DECLARE_MESSAGE_MAP()
};

// MyDialog.cpp

#include "MyDialog.h"

IMPLEMENT_DYNAMIC(MyDialog, CDialog)

MyDialog::MyDialog(CWnd* pParent) : CDialog(IDD_MYDIALOG, pParent) {}

void MyDialog::DoDataExchange(CDataExchange* pDX) {
    CDialog::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(MyDialog, CDialog)
    ON_BN_CLICKED(IDC_BUTTON1, &MyDialog::OnButtonClicked)
END_MESSAGE_MAP()

void MyDialog::OnButtonClicked() {
    MessageBox(L"Hello, MFC!");
}

// Main.cpp

#include "MyApp.h"

CMyApp theApp;

BOOL CMyApp::InitInstance() {
   // 初始化 MFC 控制台
   if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0)) {
       return FALSE;
   }

   // 创建对话框并显示
   MyDialog dlg;
   m_pMainWnd = &dlg;
   INT_PTR nResponse = dlg.DoModal();

   return FALSE;
}

上述代码中,MyApp 类继承自 CWinApp,并在 InitInstance 方法中初始化 MFC 控制台。MyDialog 类继承自 CDialog,表示一个对话框窗口,并通过资源文件(如 IDD_MYDIALOG)进行界面布局。在对话框类中,我们定义了消息映射函数 OnButtonClicked(),它将在按钮被点击时触发,并显示一个消息框。

mfc常用的网络编程相关函数:

在MFC中进行网络编程时,可以使用以下一些常用的函数和类:

  1. CSocket 类:表示一个套接字,用于建立与服务器的连接、发送和接收数据等操作。

    • Create():创建一个套接字对象。
    • Connect():与指定的服务器建立连接。
    • Send():发送数据到已连接的套接字。
    • Receive():从已连接的套接字接收数据。
  2. CAsyncSocket 类:继承自CSocket,支持异步方式进行套接字操作。它提供了一组异步回调函数,以处理非阻塞的套接字通信。

  3. CInternetSession 类:用于创建与互联网之间的会话,并提供了许多函数来执行HTTP请求、FTP传输等操作。

  4. CHttpFile 类:通过HTTP协议进行文件传输时使用。可以打开远程文件、读取内容、写入内容等。

  5. CFtpConnection 类:通过FTP协议进行文件传输时使用。可以连接到FTP服务器、上传和下载文件等。

  6. CInternetFile 类:通过URL访问远程文件时使用。可以打开远程文件、读取内容等。

网络编程代码实例:

cpp 复制代码
// MySocketDlg.h

#pragma once

#include <afxsock.h>

class CMySocketDlg : public CDialogEx
{
public:
    CMySocketDlg(CWnd* pParent = nullptr);
    virtual ~CMySocketDlg();

protected:
    HICON m_hIcon;
    CSocket m_socket;

    // Generated message map functions
    virtual BOOL OnInitDialog();
    afx_msg void OnPaint();
    afx_msg HCURSOR OnQueryDragIcon();
    DECLARE_MESSAGE_MAP()

private:
    void ConnectToServer();
};

// MySocketDlg.cpp

#include "MySocketDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

CMySocketDlg::CMySocketDlg(CWnd* pParent /*=nullptr*/)
	: CDialogEx(IDD_MYSOCKET_DIALOG, pParent)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CMySocketDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CMySocketDlg, CDialogEx)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
END_MESSAGE_MAP()

BOOL CMySocketDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	return TRUE;  
}

void CMySocketDlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting
		
		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
		
		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;
		
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
        CDialogEx::OnPaint();
    }
}

HCURSOR CMySocketDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}

void CMySocketDlg::ConnectToServer()
{
    if (m_socket.Create())
    {
        if (m_socket.Connect(_T("127.0.0.1"), 12345)) // 这里替换成服务器的 IP 地址和端口号
        {
            CString strSend = _T("Hello, Server!");
            m_socket.Send(strSend.GetBuffer(), strSend.GetLength());

            char buffer[1024] = { 0 };
            int nReceived = m_socket.Receive(buffer, sizeof(buffer));

            if (nReceived > 0)
            {
                CString strReceived(buffer);

                // 处理接收到的数据
                
                AfxMessageBox(strReceived);
            }
        }
        else
        {
            AfxMessageBox(_T("Failed to connect to server!"));
        }

        m_socket.Close();
    }
    else
    {
        AfxMessageBox(_T("Failed to create socket!"));
    }
}

// 调用 ConnectToServer() 函数来进行连接和数据发送接收

好了 本篇文章就到这里 学无止境 祝大家最后都能拿到一个理想的offer

在这里小编想向大家推荐一篇文章:

https://xxetb.xetslk.com/s/2PjJ3T

祝大家胜过愉快!

相关推荐
梓仁沐白1 小时前
ubuntu+windows双系统切换后蓝牙设备无法连接
windows·ubuntu
‘’林花谢了春红‘’4 小时前
C++ list (链表)容器
c++·链表·list
九鼎科技-Leo5 小时前
什么是 WPF 中的依赖属性?有什么作用?
windows·c#·.net·wpf
机器视觉知识推荐、就业指导6 小时前
C++设计模式:建造者模式(Builder) 房屋建造案例
c++
Yang.998 小时前
基于Windows系统用C++做一个点名工具
c++·windows·sql·visual studio code·sqlite3
熬夜学编程的小王8 小时前
【初阶数据结构篇】双向链表的实现(赋源码)
数据结构·c++·链表·双向链表
zz40_8 小时前
C++自己写类 和 运算符重载函数
c++
我不瘦但很逗8 小时前
Windows下使用DBeaver连接云数据库(MySQL)
数据库·windows
六月的翅膀8 小时前
C++:实例访问静态成员函数和类访问静态成员函数有什么区别
开发语言·c++