本來,mfc都已經是很落后的東西,現在寫窗體都用C#,提到vs的窗體大家都想到c#。雖然如此,但本來了解Windows窗體的編程機制,同時又本著vc6可以實現的東西,vs都可以實現而且更進步的理念,同時市面上大部分介紹win32窗體C++編程的書籍都是以VC6為版本的,所以開倒車也要在VS中實現win32窗體程序的了。
具體這樣做:
1、打開VS2010,廢話,如下圖,創建一個win32窗體程序。
2、點下一步,直接默認設置點完成,創建一個Windows應用程序
3、可以直接編譯,運行了,但是生成出來的東西并不能讓我們滿意,如下圖所示,有一個我們并不需要出現的菜單欄,我們還想在窗體中輸出一個Helloworld。
或許此刻,你覺得VC6沒有這么亂吧,或者認為VC6和VS2010差別很大?按照部分書上所示,在創建工程選擇第3項,編譯運行一勞永逸?
但其實并不是,在VC6同樣如此的。而且你還可以發現,其實VC6那些文件和這里VS2010文件也是差不多的。
實際上VS2010只是放了些兼容性文件上去而已。來來去去還是那一套,繪出一個窗體,然后在這個窗體有一個函數在不停地循環,就是為了讀鼠標或者鍵盤的響應信息。然后這些信息統統扔到LRESULT CALLBACK WndPRoc這個消息回調函數里面,你要弄什么就在這個函數里面寫吧。
就是個框架,沒有什么技術含量,和你改java web什么的,改win32窗體獨有的程序框架里面的東西,在里面加你自己的東西就行了。
好,說了這么多,到底怎么完成我們去掉菜單欄和輸出一個Helloworld文件的夢想呢?
4、直接對Win_Helloworld.cpp(文件名根據你第一步的工程名不同而不同)這個主cpp入手,進行修改。
(1)去掉菜單欄,對ATOM MyRegisterClass(HINSTANCE hInstance)函數,整個程序的第87行入手,如下圖修改,將其值換成NULL。
同時注釋或者刪去142-158行消息回調函數中關于菜單欄單機處理的case WM_COMMAND事件。
172-190行一大段關于“關于”對話框的函數。
(2)輸出Helloworld
接下我們需要對消息回調函數中的case WM_PAINT:這個所謂的“重繪事件”進行入手,就是你每次移動、最大化這個窗口,這個事件都會被觸發的,窗體會被重繪,人家vs2010也非常好心你就是應該在這里開始你的win32窗體程序的旅程,將case WM_PAINT:修改成如下所示,其實就是加了SetTextColor和TextOut兩個函數而已:
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,理解成在這個窗體畫東西的畫筆。然后呢,各個函數基本都是名副其實了,值得提醒在TextOut函數中,不像VC6,在VS2010中,所有那些LPCTSTR,不能直接放個字符串上去,要在前面加個大寫L,強行轉化一下。將一個普通字符串轉化為 系統中的窗體字符(大概就是這個意思)。所以你就知道C++各種各樣的變量是多么蛋疼,php等無變量類型的設計是多么偉大。
寫到這里就寫完了,運行結果如下圖所示:
最后,做個小終結吧。
寫C++的Win32窗體程序,別拿以前C語言那種,從0開始的思維往上面套。就是系統已經給你一個框架,你按照他的要求在這個框架上面改。
起步的時候,并不需要對這個框架有多熟悉,先從這個框架的一些基本東西入手,實現一些最基本的功能。
程序猿出來混也基本上是如此,很少讓你拿一門語言從0開始的,基本上都是在框架中修修補補,創造。
或者在了解Win32窗體程序的同時,Win32最基本的WIN API同時,能提高一下自己面對框架的能力。
新聞熱點
疑難解答