自己動手寫類似酷狗播放器(1)_建立一個基於對話方塊模板
學習 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字尾的檔案.
然後修改 檔案,新增個標頭檔案即可,然後執行。
然後將會在 新建 -工程中看見此嚮導了。 完畢.
相關文章
- 自己動手寫類似酷狗播放器(2)_音樂播放模組實現播放器
- 自己動手寫類似酷狗播放器(3)_Slider控制元件使用播放器IDE控制元件
- 自己動手寫類似酷狗播放器(4)_滑鼠右鍵選單的新增播放器
- 自己動手寫類似酷狗播放器(4)_系統托盤的顯示播放器
- 自己動手寫類似酷狗播放器(6)_UI初步改善_新增背景色播放器UI
- 自己動手寫類似酷狗播放器(5)_檔案的儲存和讀取播放器
- 類似QQ對話方塊上下部分可拖動程式碼
- 建立互動式shell指令碼對話方塊指令碼
- 一個Flex 對話方塊的坑Flex
- 用匯編輕鬆地寫基於對話方塊的程式 (轉)
- 自己動手寫一個 SimpleVueVue
- InstallShield自定義對話方塊模板程式碼(轉)
- Android實現類似QQ對話方塊的@他人的整體解決方案Android
- 【like-react】手寫一個類似 react 的框架React框架
- 不使用ATL嚮導,建立一個簡單的ATL對話方塊程式. (轉)
- 自己動手寫一個持久層框架框架
- 對話方塊函式函式
- 登入對話方塊
- 自定義一個簡單的載入對話方塊
- Android 官方推薦 : DialogFragment 建立對話方塊AndroidFragment
- 一個js編寫全選、彈出對話方塊、ajax-json的案例JSON
- c#中的模態對話方塊和非模態對話方塊C#
- [MFC]選擇目錄對話方塊和選擇檔案對話方塊
- MFC 對話方塊中動態建立N級選單以及響應事件事件
- JavaScript視窗功能指南之建立對話方塊 (轉)JavaScript
- flutter demo (四):對話方塊Flutter
- Javascript檔案對話方塊JavaScript
- Android自定義View(1):對話方塊-DialogAndroidView
- 基於JDBC寫一個和mybatis類似的對映框架—DBUtilsJDBCMyBatis框架
- 進一步學習對話方塊(轉)
- 自己動手寫一個Bug管理工具
- 自己動手寫一個簡單的MVC框架MVC框架
- 自己動手寫 PHP 框架(一)PHP框架
- 一個Delphi的序號產生器模板,沒有使用VCL,類似C/ASM使用對話方塊模板,編譯結果小,最方便的是可以使用Delphi的stri... (5千字)ASM編譯
- 手寫一個自己的PromisePromise
- 給應用程式加個彈出對話方塊
- 1分鐘實現Autodesk Vault登入對話方塊
- React中的模式對話方塊React模式