本來,mfc都已經(jīng)是很落后的東西,現(xiàn)在寫窗體都用C#,提到vs的窗體大家都想到c#。雖然如此,但本來了解Windows窗體的編程機制,同時又本著vc6可以實現(xiàn)的東西,vs都可以實現(xiàn)而且更進步的理念,同時市面上大部分介紹win32窗體C++編程的書籍都是以VC6為版本的,所以開倒車也要在VS中實現(xiàn)win32窗體程序的了。
具體這樣做:
1、打開VS2010,廢話,如下圖,創(chuàng)建一個win32窗體程序。

2、點下一步,直接默認設置點完成,創(chuàng)建一個Windows應用程序

3、可以直接編譯,運行了,但是生成出來的東西并不能讓我們滿意,如下圖所示,有一個我們并不需要出現(xiàn)的菜單欄,我們還想在窗體中輸出一個Helloworld。

或許此刻,你覺得VC6沒有這么亂吧,或者認為VC6和VS2010差別很大?按照部分書上所示,在創(chuàng)建工程選擇第3項,編譯運行一勞永逸?

但其實并不是,在VC6同樣如此的。而且你還可以發(fā)現(xiàn),其實VC6那些文件和這里VS2010文件也是差不多的。

實際上VS2010只是放了些兼容性文件上去而已。來來去去還是那一套,繪出一個窗體,然后在這個窗體有一個函數(shù)在不停地循環(huán),就是為了讀鼠標或者鍵盤的響應信息。然后這些信息統(tǒng)統(tǒng)扔到LRESULT CALLBACK WndPRoc這個消息回調函數(shù)里面,你要弄什么就在這個函數(shù)里面寫吧。
就是個框架,沒有什么技術含量,和你改java web什么的,改win32窗體獨有的程序框架里面的東西,在里面加你自己的東西就行了。
好,說了這么多,到底怎么完成我們去掉菜單欄和輸出一個Helloworld文件的夢想呢?
4、直接對Win_Helloworld.cpp(文件名根據(jù)你第一步的工程名不同而不同)這個主cpp入手,進行修改。
(1)去掉菜單欄,對ATOM MyRegisterClass(HINSTANCE hInstance)函數(shù),整個程序的第87行入手,如下圖修改,將其值換成NULL。

同時注釋或者刪去142-158行消息回調函數(shù)中關于菜單欄單機處理的case WM_COMMAND事件。

172-190行一大段關于“關于”對話框的函數(shù)。

(2)輸出Helloworld
接下我們需要對消息回調函數(shù)中的case WM_PAINT:這個所謂的“重繪事件”進行入手,就是你每次移動、最大化這個窗口,這個事件都會被觸發(fā)的,窗體會被重繪,人家vs2010也非常好心你就是應該在這里開始你的win32窗體程序的旅程,將case WM_PAINT:修改成如下所示,其實就是加了SetTextColor和TextOut兩個函數(shù)而已:
case WM_PAINT: hdc = BeginPaint(hWnd, &ps); // TODO: 在此添加任意繪圖代碼... SetTextColor(hdc,RGB(0,0,0));//黑色的畫筆 TextOut(hdc,100,100,L"Helloworld",strlen("Helloworld"));//在(100,100)這個文件,輸出Helloworld。 EndPaint(hWnd, &ps); break;即:
你可以將這個hdc,理解成在這個窗體畫東西的畫筆。然后呢,各個函數(shù)基本都是名副其實了,值得提醒在TextOut函數(shù)中,不像VC6,在VS2010中,所有那些LPCTSTR,不能直接放個字符串上去,要在前面加個大寫L,強行轉化一下。將一個普通字符串轉化為 系統(tǒng)中的窗體字符(大概就是這個意思)。所以你就知道C++各種各樣的變量是多么蛋疼,php等無變量類型的設計是多么偉大。
寫到這里就寫完了,運行結果如下圖所示:

最后,做個小終結吧。
寫C++的Win32窗體程序,別拿以前C語言那種,從0開始的思維往上面套。就是系統(tǒng)已經(jīng)給你一個框架,你按照他的要求在這個框架上面改。
起步的時候,并不需要對這個框架有多熟悉,先從這個框架的一些基本東西入手,實現(xiàn)一些最基本的功能。
程序猿出來混也基本上是如此,很少讓你拿一門語言從0開始的,基本上都是在框架中修修補補,創(chuàng)造。
或者在了解Win32窗體程序的同時,Win32最基本的WIN API同時,能提高一下自己面對框架的能力。
新聞熱點
疑難解答