自己動手寫類似酷狗播放器(1)_建立一個基於對話方塊模板

YunShell發表於2013-08-10
	學習 C語言也有兩個多月了,現在在看的書籍是<windows程式設計>和網友系列文章。自動動手寫了音樂播放器,仿照酷狗介面做的,只實現了主要功能。這個會做個連載,主要針對那些剛學習windows程式的同學,有個參考和思路,同時自己也做個總結和展望,以便進一步學習。歡迎同學們留言探討...

       環境:vc++6.0  SDK編寫   作業系統 :winxp sp3    語言:C 語言  待學習完C++後,將全部用C++重寫.

(1).理解windows訊息機制

    什麼叫做windows訊息機制?在windows系統中,一切都是操作都是以訊息的形式給出,這是作業系統完成的,不用我們管,應用程式就是跑在OS上面的,所以一切的響應操作都是OS和應用程式互相互動,一句話解釋就是:作業系統告訴應用程式發生了什麼事。然後應用程式接著去做什麼
   舉個例子: 你媽喊你回家吃飯。這裡你媽就是作業系統,喊你就是給你(應用程式)發個訊息(快回家)。然後你(應用程式)接收到了這個訊息(哦!我媽喊我回家吃飯了)。然後對於你(應用程式)做一列的處理工作來響應訊息(就是往回家的路上走這件事).

(2).進一步從程式碼角度來理解訊息機制

   下面就帶大家來建立一個簡單的視窗,來體會下windows的訊息機制。
    目標:彈出一個對話方塊視窗,當你按下確定鍵,彈出"你按下了確定鍵"。
先上一個效果圖:

步驟:1.先建立個工程 

下面就進入程式碼區域了:

    建立一個對話方塊,可以用資源的方式和 純程式碼的方式,這裡為了方便體驗訊息機制,就用資源的方式來建立對話方塊。
如何建立資源,請接著往下看:
點選新建->new
   就可以在上面區域拖動控制元件了,實現其實做了這麼多就是為了 插入一個對話方塊資源,當然在資源插入的時候,可以插入很多資源,比如選單,點陣圖什麼的。

2.程式碼實現部分了 

新增標頭檔案,在建立完資源後,可以到你工程所在的目錄看,有個.rc字尾的檔案。找到resource.h檔案新增入工程中,這個.h檔案就是資源的ID號什麼的.

最後完整工程就是這樣

接下就是程式碼部分了:

// DialogBased APP.cpp : Defines the entry point for the application.
//


#include "stdafx.h"
#include <windows.h>  //標頭檔案
#include  "resource.h" //資源標頭檔案
//#include <windowsx.h>  //	HANDLE_MSG()巨集定義在此檔案中定義


BOOL WINAPI Main_PRCO(HWND hwnd,UINT Msg,WPARAM wParam,LPARAM lParam) //對話方塊處理程式
{	
	switch(Msg)
	{
		case WM_INITDIALOG:
			{	
				return TRUE;
			}
		case WM_COMMAND:  //命令
			{
				switch(wParam)
				{
					case IDOK:
						{	MessageBox(NULL,TEXT("你按下了確定按鈕"),TEXT("提示"),MB_OK);
							break;
						}
					default:
						break;
				}
				break;
			}
		case WM_CLOSE: //關閉
			{	
				EndDialog(hwnd,0);
				break;
			}
	}
	return FALSE;
}
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
 	// TODO: Place code here.
	DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL,Main_PRCO);//建立一個模態對話方塊 (自己可以完全處理訊息流)
	return 0;
}


上面就是完整的程式碼部分。你執行下看,就可以看到目標的效果。

(3).程式碼分析

    在C語言的控制檯程式中,我們都知道,入口就是main()函式。同樣在windows程式中,也必須有個入口函式,這裡就是WinMain函式。所有一些的訊息都是從這個入口給到應用程式中的。
int APIENTRY WinMain(HINSTANCE hInstance, //程式例項 就是一個應用程式的程式
                     HINSTANCE hPrevInstance, //32位windows中以拋棄
                     LPSTR     lpCmdLine,  //傳送的命令
                     int       nCmdShow) //程式顯示的方式,最大化,最小化
{
 	// TODO: Place code here.
	DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL,Main_PRCO);//建立一個模態對話方塊 (自己可以完全處理訊息流)具體的引數 自行查詢資料 最後一個引數視窗處理函式
	return 0;
}
結論:OS通過該入口,啟動應用程式,並且互動。下面 介紹視窗處理函式
BOOL CALLBACK Main_PRCO(HWND hwnd,UINT Msg,WPARAM wParam,LPARAM lParam) //對話方塊處理程式
{	
	switch(Msg)
	{
		case WM_INITDIALOG: //初始化事件
			{	
				//這裡新增初始化程式碼
				return TRUE;
			}
		case WM_COMMAND:  //命令事件 用於響應控制元件等的事件 
			{	
				switch(wParam)//當發生wm_command事件後,wPararm和lParam就攜帶訊息的資料引數
				{	//這裡wParam就是控制元件的ID號了
					case IDOK:
						{	MessageBox(NULL,TEXT("你按下了確定按鈕"),TEXT("提示"),MB_OK);
							break;
						}
					default:
						break;
				}
				break;
			}
		case WM_CLOSE: //關閉事件
			{	
				EndDialog(hwnd,0);//結束對話方塊函式 
				break;
			}
	}
	return FALSE;
}
   返回值型別:BOOL (其實就是int) 可以檢視定義 WINAPI  CALLBACK都是一種呼叫方式。具體可以網路查詢。然後就是四個引數:1是視窗控制程式碼,2是windows訊息(wm開頭的) 3.4都是訊息附帶的引數。至於是什麼引數,表示什麼,查閱MSDN了。
    上面程式碼中 有三類最常見的windows訊息。WM_INITDIALOG初始化事件,WM_COMMAND命令事件,就是響應各種控制元件的操作時發生的事件,比如你按下了個按鈕,將傳送此類事件。WM_CLOSE結束對話方塊時,發生的事件。
下面這張圖 ,就很清楚反應了訊息機制的原理。

    進一步理解訊息機制,當我們雙擊了該應用程式,從WinMain入口啟動了應用程式,直到我們點選右上角的X來關閉應用程式時,這個程式就一直執行著,並且在一直接受作業系統傳來的訊息,我們的Dialogbox函式就是完全代替了While(GetMessage(&msg)...)訊息迴圈。所以只要訊息一直都在,就都會傳給視窗處理過程來處理訊息。直到結束視窗.那麼看來一切的根源都是不斷的獲取訊息了。對,就是這個由Whlie控制的GetMessage函式就是個系統的API函式,一直會從系統的訊息佇列中提取訊息,不管有沒有用使用者的任何操作,都會成為一個事件,傳送給應用程式,然後應用程式通知視窗過程函式來處理訊息,直到應用程式關閉,退出了,也就不呼叫了GetMessage函式,這就是訊息處理機制。

(3).如何建立SDK對話方塊模板嚮導

	上面的例項程式就是一個最小模組的程式碼,以後任何程式都要用到,所以將其變為一個嚮導,在每次新建一個應用程式的時候,可以不必每次都去手動建立,做重複的工作,但是第一次最好自己建立下,從無到有 的體會下.
	下面就帶大家一起來建立個基於SDK 對話方塊的模板嚮導,該向導建立完畢後會在新建-工程中出現。
	首先重新雙擊VC 啟動。然後在新建
然後 查詢上面例項工程中的 .dsp字尾的檔案.
 	然後修改 檔案,新增個標頭檔案即可,然後執行。
然後將會在 新建 -工程中看見此嚮導了。																						完畢.

相關文章