cmfc編程
學習C語言不需要先學MFC,因為C語言不是以MFC為基礎,相反MFC是用C/C++寫的
如果你要用VC來開發window程序,一般要學點MFC,雖然不會MFC照樣可以開發window程序,不過MFC可以讓window開發更方便快速
B. windows編程,MFC編程,C語言編程,三者有什麼關系
打個比方。
C語言是漢語,MFC是一些優美的句子,Windows編程是寫一篇文章。
文章你可以用英語、漢語、日語等等,Windows編程也是一樣,C語言只是一種選擇,其他的C++等也可以。
MFC是WindowsAPI的C++封裝,相當於一些句子,需要時直接使用,而不用你一個一個去想。也就是說,本來開發Windows應用都需要API,但是有了MFC之後,某種程度上你甚至可以不了解具體API了。比如我要實現某個功能,需要這個API,那個API,一個個的編寫,而mfc也許就是點幾下滑鼠而已。
當然,對於一個Windows程序員來說API是必須要精通的,我這么說只是說明mfc的作用。
C. 我現在學了c語言,想用vc的MFC編程,可是覺得很難啊 ,是不是我還要有什麼要學的沒學啊
在回答樓主的問題之前,首先希望樓主明確這樣幾個問題.
1.學習了C語言,那麼你的C語言已經學到了什麼程度?如果你的水平僅僅是能把譚浩強的<C程序設計>弄懂,那麼不建議你立即學VC,尤其是裡面的MFC;
2.想用VC的MFC編程,這裡面有一個問題.目前比較流行的觀點是先將C++學明白,然後再接觸相應的C++開發工具.但是從我個人的經驗來看,我的一些同事(搞數學的大學講師)在沒有學習C++基礎的前提下也能直接學習VC++並做一些基礎方面的應用程序開發.這就看你的電腦知識及數學基礎了.
3.如果樓主真的十分希望學習VC,那麼我建議你先好好學學C++,把基礎打好,然後再適當學一些windows編程方面的知識,最後再學VC++.
4.個人不建議樓主學VC++,因為windows編程是一個非常龐大復雜的系統.它需要深厚的計算機理論基礎.建議樓主先把C語言學透,然後再認真學習C++,在打牢基礎的前提下最後學VC++;
5.教材推薦:
a.<C++ Primer> 這本被公認為C++的經典教材,如果樓主能把這本大厚書吃透的話,那麼你也就不會問上述的問題了;學習此書的缺陷是它並不是按照完全的"一步步"來的(這點與譚浩強老師的教材有很大不同),但它確實能給你提供一定的思路.究其好壞,還需自己去品味;
b.<數據結構>,雖然不是講C++的,但這絕對是基礎中的基礎.學習本書需要樓主有一定的數學基礎,最好是學習過高等數學,擁有高中以上的數學知識;
這里我只推薦了兩本.主要是考慮到樓主的基礎,所以沒有列舉太多.最後我想提醒樓主的是,如果真心想學好編程,最好先踏踏實實地把DOS編程學好.目前VC++,VB等雖然可視化編程效率很高,但大多掩蓋了很多技術細節,一旦深入學習,會發現很多技術上的不足.所以,我建議樓主先將精力和時間放在C語言,計算機基礎,演算法,數據結構這些基礎課程上.當以上知識都能融會貫通以後,再學習VC++等就能觸類旁通,得心應手了.
D. MFC 編程
MFC是微軟的VC++帶的視窗用的基本庫。
MFC編程就是調用這個基本庫,寫出類似於IE瀏覽器這種程序,就是用滑鼠,鍵盤為工具的人機會話式的程序。
學MFC的要點是會用visual Studio 建程序框架,用VC++語言添加程序內容,編譯和運行。關鍵要會VC++。
專門討論MFC的專業論壇:
microsoft.public.vc.mfc
comp.os.ms-windows.programmer.tools.mfc
microsoft.public.vc.mfc.docview
請採納答案,支持我一下。
E. 在C語言中,能簡單介紹一下MFC是干什麼的么
用c語言開發windows程序,一般都叫做win32編程。後來出現了C++,微軟把C++進入開發windows程序,如果有C++基礎的就知道,用C++編寫的程序需要很多的類,為了方便開發,微軟預定義了很多類供開發者使用。這些類的就是所謂的MFC,即微軟基礎類庫。MFC實現了大部分用功能,程序員在MFC基礎上用C++開發windows程序就省事很多。
F. 如何用MFC實現網路編程
一.客戶端
1.創建一個DialogBased項目:CSockClient。
2.設計對話框
去掉Ok和Cancle兩個按鈕,增加ID_Connect(連接)、ID_Send(發送)、ID_Exit(關閉)按鈕,增加ListBox控制項IDC_LISTMSG和Edit控制項IDC_EDITMSG,並按下表在ClassWizard中為CCSockClientDlg類添加變數。
ControlIDTypeMember
IDC_EDITMSGCEditm_MSG
IDC_LISTMSGClistBoxm_MSGS
3.CAsyncSocket類用DoCallBack函數處理MFC消息,當一個網路事件發生時,DoCallBack函數按網路事件類型:FD_READ、FD_WRITE、FD_ACCEPT、FD_CONNECT分別調用OnReceive、OnSend、OnAccept、OnConnect函數。
由於MFC把這些事件處理函數定義為虛函數,所以要生成一個新的C++類,以重載這些函數,做法如下:以Public方式繼承CAsyncSocket類,生成新類MySock;為MySock類添加虛函數OnReceive、OnConnect、OnSend。
4.在MySock.ccp中添加以下代碼
#include"CSockClient.h"
#include"CSockClientDlg.h"
5.在MySock.h中添加以下代碼
public:
BOOLm_bConnected;//是否連接
UINTm_nLength;//消息長度
charm_szBuffer[4096];//消息緩沖區
6.在MySock.ccp中重載各函數
MySock::MySock()
{
m_nLength=0;
memset(m_szBuffer,0,sizeof(m_szBuffer));
m_bConnected=FALSE;
}
MySock::~MySock()
{
//關閉套接字
if(m_hSocket!=INVALID_SOCKET)
Close();
}
voidMySock::OnReceive(intnErrorCode)
{
m_nLength=Receive(m_szBuffer,sizeof(m_szBuffer),0);
//下面兩行代碼用來獲取對話框指針
CCSockClientApp*pApp=(CCSockClientApp*)AfxGetApp();
CCSockClientDlg*pDlg=(CCSockClientDlg*)pApp->m_pMainWnd;
pDlg->m_MSGS.InsertString(0,m_szBuffer);
memset(m_szBuffer,0,sizeof(m_szBuffer));
CAsyncSocket::OnReceive(nErrorCode);
}
voidMySock::OnSend(intnErrorCode)
{
Send(m_szBuffer,m_nLength,0);
m_nLength=0;
memset(m_szBuffer,0,sizeof(m_szBuffer));
//繼續提請一個「讀」的網路事件,接收Server消息
AsyncSelect(FD_READ);
CAsyncSocket::OnSend(nErrorCode);
}
voidMySock::OnConnect(intnErrorCode)
{
if(nErrorCode==0)
{
m_bConnected=TRUE;
CCSockClientApp*pApp=(CCSockClientApp*)AfxGetApp();
CCSockClientDlg*pDlg=(CCSockClientDlg*)pApp->m_pMainWnd;
memcpy(m_szBuffer,"Connectedto",13);
strncat(m_szBuffer,pDlg->m_szServerAdr,
sizeof(pDlg->m_szServerAdr));
pDlg->m_MSGS.InsertString(0,m_szBuffer);
AsyncSelect(FD_READ);////提請一個「讀」的網路事件,准備接收
}
CAsyncSocket::OnConnect(nErrorCode);
}
7.新建對話框IDD_Addr,用來輸入IP地址和Port;生成新類CAddrDlg。增加兩個Edit控制項:IDC_Addr、IDC_Port按下表在ClassWizard中為CAddrDlg類添加變數。
ControlIDTypeMember
IDC_AddrCStringm_Addr
IDC_PortIntm_Port
8.在CSockClientDlg.ccp中添加代碼:
#include"AddrDlg.h"
protected:
intTryCount;
MySockm_clientSocket;
UINTm_szPort;
public:
charm_szServerAdr[256];
9.雙擊IDD_CSOCKCLIENT_DIALOG對話框中的「連接」按鈕,添加以下代碼:
voidCCSockClientDlg::OnConnect()
{
m_clientSocket.ShutDown(2);
m_clientSocket.m_hSocket=INVALID_SOCKET;
m_clientSocket.m_bConnected=FALSE;
CAddrDlgm_Dlg;
//默認埠1088
m_Dlg.m_Port=1088;
if(m_Dlg.DoModal()==IDOK&&!m_Dlg.m_Addr.IsEmpty())
{
memcpy(m_szServerAdr,m_Dlg.m_Addr,sizeof(m_szServerAdr));
m_szPort=m_Dlg.m_Port;
//建立計時器,每1秒嘗試連接一次,直到連上或TryCount>10
SetTimer(1,1000,NULL);
TryCount=0;
}
}
10.添加Windows消息WM_TIMER響應函數OnTimer
voidCCSockClientDlg::OnTimer(UINTnIDEvent)
{
if(m_clientSocket.m_hSocket==INVALID_SOCKET)
{
BOOLbFlag=m_clientSocket.Create(0,SOCK_STREAM,FD_CONNECT);
if(!bFlag)
{
AfxMessageBox("SocketError!");
m_clientSocket.Close();
PostQuitMessage(0);
return;
}
}
m_clientSocket.Connect(m_szServerAdr,m_szPort);
TryCount++;
if(TryCount>=10||m_clientSocket.m_bConnected)
{
KillTimer(1);
if(TryCount>=10)
AfxMessageBox("ConnectFailed!");
return;
}
CDialog::OnTimer(nIDEvent);
}
11.雙擊IDD_CSOCKCLIENT_DIALOG對話框中的「發送」按鈕,添加以下代碼:
voidCCSockClientDlg::OnSend()
{
if(m_clientSocket.m_bConnected)
{
m_clientSocket.m_nLength=m_MSG.GetWindowText
(m_clientSocket.m_szBuffer,sizeof(m_clientSocket.m_szBuffer));
m_clientSocket.AsyncSelect(FD_WRITE);
m_MSG.SetWindowText("");
}
}
12.雙擊IDD_CSOCKCLIENT_DIALOG對話框中的「關閉」按鈕,添加以下代碼:
voidCCSockClientDlg::OnExit()
{
//關閉Socket
m_clientSocket.ShutDown(2);
//關閉對話框
EndDialog(0);
}
12.運行此項目,連接時輸入主機名或IP均可,CAsyncSocket類會自動處理。
二.服務端
Server端的編程與Client端的類似,下面主要介紹他的Listen及Accept函數。
1.建立一個CNewSocket類,重載CAsyncSocket類的OnReceive、OnSend函數,如何進行信息的顯示和發送可以參考Client程序。本例中採用將收到信息原封不動發回的方法來實現Echo功能,代碼如下:
CNewSocket::OnReceive(intnErrorCOde)
{
m_nLength=Receive(m_szBuffer,sizeof(m_szBuffer),0);
//直接轉發消息
AsyncSelect(FD_WRITE);
}
CNewSocket::OnSend(intnErrorCode)
{
Send(m_szBuffer,m_nLength,0);
}
2.建立一個CMyServerSocket類,重載CAsyncSocket類的OnAccept函數代碼如下
在MyServerSocket.h中聲明變數
public::
CNewSocket*m_pSocket;
voidCMyServerSocket::OnAccept(intnErrorCode)
{
//偵聽到連接請求,調用Accept函數
CNewSocket*pSocket=newCNewSocket();
if(Accept(*pSocket))
{
pSocket->AsyncSelect(FD_READ);
m_pSocket=pSocket;
}
else
deletepSocket;
}
3.為對話框添加一個「偵聽」按鈕,添加如下代碼:
在CsockServerDlg.ccp中聲明變數
public:
CMyServerSocketm_srvrSocket;
voidCCSockServerDlg::OnListen()
{
if(m_srvrSocket.m_hSocket==INVALID_SOCKET)
{
BOOLbFlag=m_srvrSocket.Create
(UserPort,SOCK_STREAM,FD_ACCEPT);
if(!bFlag)
{
AfxMessageBox(「SocketError!」);
M_srvrSocket.Close();
PostQuitMessage(0);
Return;
}
}
//「偵聽」成功,等待連接請求
if(!m_srvrSocket。Listen(1))
{
intnErrorCode=m_srvrSocket.GetLastError();
if(nError!=WSAEWOULDBLOCK)
{
AfxMessageBox(「SocketError!」);
M_srvrSocket.Close();
G. 學了C也是用C++的MFC進行編程的嗎
額,這個...C++是C的擴展,C++兼容C,但其實他們還是有很多不同的,而且其實你可以把它們看成是兩種編程語言...
MFC只是微軟開發出來的一套類庫,只是C++的一個應用方面,它主要是用來開發windows桌面程序的。但事實上,C++的應用面遠不止windows桌面程序,比如嵌入式編程、通信編程、網路編程等等...
而C雖然使用起來沒有C++方便(因為C++實現了更多的類/庫供程序員調用),但C比C++更"短小精悍",它的效率比C++還要好,它是介於匯編語言和高級語言中的一種語言(但我們一般把C劃為高級語言),它可以作為工作系統設計語言,編寫系統應用程序,也可以作為應用程序設計語言,編寫不依賴計算機硬體的應用程序。ps:現在的Linux/Unix系統的絕大部分模塊都是用C編寫的,Windows系統的核心部分也是用C編寫的。
所以...可以說MFC只是C++一個應用方面(或者說是一個分支),當然如果你搞懂了MFC,那C++你也就差不多通了,編程語言嘛,觸類旁通的。至於C和C++前面也說到了,其實你可以把它們看成是兩種編程語言,用一個不太恰當的詞來形容它們的關系---"藕斷絲連"...C還是運用在嵌入式編程方面比較多的。
H. 什麼是MFC編程
MFC(Microsoft Foundation class)微軟基本類(庫),它是一個面向對象的應用程序架構。程序員利用它可以很方便搭建應用程序框架。
MFC結合了面向對象的編程技術和WINDOWS消息驅動的編程技術,並封裝了WIN32API,其設計好處是:消除了WIN32API的復雜性,封裝了WIN32API,統一了程序的概念,而且可擴展。
MFC實際上是微軟提供的,用於在C++環境下編寫應用程序的一個框架和引擎。VC++是Windows下開發人員使用的專業C++SDK,MFC就是掛在它之上的一個輔助軟體開發包。
(8)cmfc編程擴展閱讀
MFC編程優勢
面對底層程序,它能很輕松的與Windows API或驅動程序結合,就是在自己的代碼中直接使用API函數,而API和驅動程序的資料都是以C語言為基礎的,這使得VC程序員能夠更輕松的使用Windows API。
這樣造成了一個很有意思的現象,即入門時VC程序員要付出更多的努力來學習,但是一旦掌握後,開發其他領域的程序或使用第三方軟體時,如工業控制類的程序,由於底層的程序都是用C語言編寫,反倒是VC程序員能夠更快的掌握該領域的編程技術。而很多其他的編程語言甚至找不到相關的資料。
這就說明VC(MFC)實際上是一種入門困難,但是擴展學習卻很輕松的語言框架。
I. 如何學習MFC編程
MFC是基於 C C++ 開發一個 類庫。如果你不懂MFC,我猜你是不是 還沒有學習 C C++。
我建議你網路搜索這篇文章
網路搜索: csdn 編程是什麼,什麼是編程
看這篇文章 先了解編程一個輪廓。看看自己是不是合適。
然後覺得自己合適編程,在搜索如下文章看看,注意最好找到原文地址,不然排版很亂。
如何正確入門Windows系統下C/C++學習領域?
掌握C/C++後,如何在Windows系統下開發有界面的程序?
如何正確入門Windows系統下驅動開發領域?
如何正確進入基於x86-64Bit Windows系統商業軟體破解領域?
如何正確的待匯編學習和反匯編學習?
成為VC++程序員,我需要學會哪些東西?
J. c語言的mfc怎麼編程計算器,急用,有詳細步驟截圖代碼。謝謝。幫幫忙。
#include <stdio.h>
void main(){
int a , b;
char cOperator;
int x;
printf("請輸入兩個整數的運算式:\n");
scanf("%d%c%d",&a,&cOperator,&b);
if(cOperator=='+')x=(a + b);
else if(cOperator=='-')x=(a - b);
else if(cOperator=='*')x=(a * b);
else if(cOperator=='/')x=(a / b);
else printf("符號輸入錯誤!\n");
printf("%d%c%d",a,cOperator,b);
printf("=%d\n",x);
}
(1)不知道樓主為什麼要用"while",但個人認為沒有必要.
(2)樓主所有的if語句都存在問題,例如:if(cOperator='+')這句,應改為if(cOperator=='+'),因為C語言中的"="不是代表"等於",而是"賦值".