作为一个初学者,我这样认为。搞windows程序设计,自然C/C++是不二之选,windows的API函数都是C的形式。一种方法是使用纯C语言,利用winSDK开发,另一种是使用C++语言,利用MFC框架开发。前者就称作SDK编程,后者就称作MFC编程吧。SDK编程在做大的程序项目时会显得很繁琐,而MFC封装了winAPI,大大简化了开发过程,提高了效率。而且我们可以发现SDK编程中,做一个仅有一个窗口的hellow world程序也要长篇的代码。下面就是一个简单的WIN32程序代码:
#include <windows.h> #pragma comment(lib,"winmm.lib") LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd) { //variable static TCHAR szAppName[] = TEXT("HelloWin32!"); WNDCLASS wc; HWND hwnd; MSG msg; //SET WNDCLASS wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hInstance = hInstance; wc.lpfnWndProc = WndProc; wc.lpszClassName = szAppName; wc.lpszMenuName = NULL; wc.style = CS_HREDRAW | CS_VREDRAW; //REGISTER WNDCLASS if(!RegisterClass(&wc)) { MessageBox(NULL,TEXT("The program require NT system!"),szAppName,MB_ICONERROR); return 0; } //CREATE WINDOW hwnd = CreateWindow(szAppName,TEXT(" HELLO WIN32 "),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL); //SHOW WINDOW ShowWindow(hwnd,SW_SHOWNORMAL); //UPDATE WINDOW UpdateWindow(hwnd); //MSG CIRCLE while(GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } //CALLBACK FUNCTION LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam) { //Handle to a device context (DC) HDC hdc; //PAINT STRUCT PAINTSTRUCT ps; //RECT STRUCT RECT rect; switch(message) { case WM_CREATE: PlaySound(TEXT("tx.wav"), NULL, SND_FILENAME | SND_ASYNC | SND_LOOP); return 0 ; case WM_PAINT: hdc = BeginPaint (hwnd, &ps); GetClientRect (hwnd, &rect); DrawText (hdc, TEXT (" Hello, Win32 !"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); EndPaint (hwnd, &ps); return 0; case WM_DESTROY: PostQuitMessage (0); return 0; } return DefWindowProc(hwnd, message, wParam, lParam); }
可以发现,我们要手动填写窗口的属性并注册窗口并手动启动消息循环。
如果每写一个小程序我们都要一开始就写这么多,显得很麻烦。
于是很多人在C++基本入门后就直接进军MFC了。
当他们在用MFC时会发现,他们只知道要这么用,而不知道为什么这么用,不知道他是怎么实现的。
作为正在学习windows编程的新手,我们应该在学习完C++基本的东西后,着手学习SDK编程,了解一些常用winAPI的用法。等对win32程序的运行机制等等有了一个比较深刻的理解后,再接触MFC。
到时候MFC也非常容易上手,何况我们在日后的编程中,经常在MFC项目开发的代码中直接用winAPI。
CSDN上最近比较火的博客博主段伏沥也是这么认为的,所以他一直坚持用SDK编程而不用MFC。
我认为如果SDK和MFC都深入了解了的话,自然会知道,该用什么的地方就用什么。
有两本书我非常推荐,一本是《windows程序设计》第五版,一本是《MFC windows程序设计》第二版。
虽然这两本书都是1999年就出的了,那时候用的是WIN98的系统,XP都还没面世。有人会觉得有点过时了,但其实这两本是windows程序设计的圣经,经典中的经典。里面的技术一点都不过时。
还有一本《深入浅出MFC》,也是经典中的经典,剖析了MFC的原理(这是很重要的,不能只会用而不知道原理),不过不适合初学者,应该在有一定基础后再看。虽然这本书也比较老,同样是1999年出版的,其中的编译器还在使用Viaual C++ 5.0,但经典的东西不会过时。
这三本书都是windows程序设计的圣经。我都已经收入了我的书架。
在网上一搜,不难发现,现在书名里还有MFC这个字眼的书,几乎绝迹了。很多新出版的书,大多打上Visual C++ 云云的各种称号,其实里面已经包含了MFC编程。薄薄的一本500多页的书,开头略讲C++语法基础,然后就讲MFC,然后就讲多线程,讲视频音频处理。初学者若是真的通过这薄薄的书,从不懂C++到熟练使用多线程,真是逆天了!
在学windows程序设计过程中,会遇到很多抽象概念,什么消息循环,消息队列等等,一开始可能难以理解,放一边,继续往下看,慢慢的再回过头来看,自然就慢慢的懂了。比如在汇编程序设计中,还有很多更抽象的概念呢,堆栈、寄存器、寻址方式等等更难以理解。很多人都是通过反复的看,慢慢的就理解了。编程的书,不是小说,看一遍就完事,往往是,我们如果要想学会里面的东西,至少是完完全全的看了好几遍了,有的章节的纸张甚至翻烂了。
学编程需要记忆,但不是死记硬背,而是在反复的开发实践、练习,反复的翻书过程中记住的。
奋斗吧骚年!