Win32對話框程序(1)


之前學C語言是一直都是在控制台下面操作的,面對的都是黑框框,嚴重的打擊了學習的興趣。后來在TC下進行C語言課程設計,做了圖形界面編程,但都是點線面畫的…… 

中間隔了好長一段時間沒有碰過C語言,最近才開始往起撿,找到了如鵬網的《C語言也能干大事》教程,驚喜的發現上手即是對話框程序,想堅持學下來,奈何老師對涉及原理的地方有所略過,對我這個喜歡刨根問底凡事都想問個問什么的人來說,用着一個自己不了解的東西那真是渾身難受,所以就想一邊學着課程一邊自己一探究竟(至少要心里有底)~

*************************我是正文分割線***************************

 

干大事中,楊中科老師提供了對話框程序創建的向導http://rupeng.com/forum/thread-8798-1-1.html,只需按其一步步操作即可在file→new中創建Win32 DialogBased Application,並在視頻中演示了其在VS2008中手動創建的過程。

我動手實踐了一下 ,現將過程、體會以及疑問記錄如下。

 

對話框程序結構

VC6.0中,使用向導創建對話框程序后,文件視圖中包含

Source Files

Header Files

Resource Files

Main.cpp

MainDlg.h

icon1.ico

MainDlg.cpp

resource.h

 

resource.rc

StdAfx.h

 

StdAfx.cpp

   

Main.cpp中只包含一個函數

1
2
3
4
5
6
7
8
9
10
int APIENTRY WinMain(HINSTANCE hInstance,
                      HINSTANCE hPrevInstance,
                      LPSTR     lpCmdLine,
                      int       nCmdShow)
{
     //Enable IPAddress、Calendar.etc
     InitCommonControls();
     DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN), NULL, Main_Proc);
     return 0 ;
}

MainDlg.cpp中包含四個函數:

函數名

參數

函數體主要內容

Main_Proc

(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

switch(uMsg),HANDLE_MSG

Main_OnInitDialog

(HWND hwnd, HWND hwndFocus, LPARAM lParam)

return

Main_OnCommand

(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)

switch(ID),case

Main_OnClose

(HWND hwnd)

 EndDialog

/*****
*
因為並不清楚這些函數在干什么,我查閱了相關資料並總結,忽略了一些目前看來不需要了解的細節,需要了解時再去參考中查看。
*****/

 

Win32是如何運行的 

Win32程序是基於消息的(message based)、事件驅動的(event driven)。當win32程序運行時,程序不斷檢測外部的觸發(比如單擊按鈕、輸入等),即是否發生事件,這些輸入由操作系統捕捉后,以消息的形式進入程序中,然后根據不同的觸發進行不同的處理。因此Win32程序只需完成三件事:

1.      定義窗口外觀

2.      定義不同事件發生時程序如何處理(定義窗口處理函數) 

3.      不斷檢測是否有新事件發生,並將其交給相應的處理函數處理    

main函數是一般C程序的入口,WinMainWindows程序的入口。當用戶執行一個程序時,操作系統為程序分配地址空間,並加載程序,調用入口函數執行程序。

/*****
*
其他內容,如程序如何運行的細節以及消息的處理機制等,就不列寫在此了(我也沒仔細看@_@),可參看參考或檢索其他資料
*****/

 

Win32程序:資源和源代碼

此外,在VC6.0中可見資源視圖(ResourcceView)以及文件視圖(FileView),文件視圖下是源代碼文件,據http://msdn.microsoft.com/zh-cn/library/7zxb70x7.aspx 資源文件包括

1.      程序的資源腳本 (.rc) 文件

2.      資源模板 (.rct) 文件

3.      作為獨立文件存在的個別資源如從 .rc 文件引用的位圖、圖標或光標文件

4.      由開發環境生成的頭文件(如 Resource.h),它從 .rc 文件中引用

VC6.0中默認沒有.rc文件,需自己手動添加http://msdn.microsoft.com/zh-cn/library/vstudio/sxdy04be(v=vs.80).aspx

可見,Winows程序分為源程序和資源兩部分。源程序經由C/C++編譯器生成.obj文件;資源部分經由RC編譯器,讀取RC文件的描述后,將所有資源文件集中制作出一個.res文件,.res文件與.obj文件結合在一起,集成為一個完整的.exe可執行文件,該文件才是一個完整的Windows應用程序,流程圖如下: 

應用源程序編譯鏈接生成可執行文件之后,會在項目文件夾下生成一個Debug/Release文件夾,在該文件夾下面可以找到.obj文件、.exe文件等,.def文件指示連接程序如何產生最終的可執行文件。

 

各個文件里的內容

比如這樣一個計算圓面積的對話框程序,其IDIDD_MAIN

先看與資源相關的文件,resource.rc文件中有這樣一段代碼:

1
2
3
4
5
6
7
8
9
10
11
IDD_MAIN DIALOG DISCARDABLE  0, 0, 187, 98
STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "如鵬網 www.RuPeng.com 大學生計算機學習社區"
FONT 10, "System"
BEGIN
     DEFPUSHBUTTON   "確定" ,IDC_OK,7,77,50,14
     EDITTEXT        IDC_EDITR,50,16,40,14,ES_AUTOHSCROLL
     EDITTEXT        IDC_EDITS,49,37,40,14,ES_AUTOHSCROLL
     LTEXT           "半徑" ,IDC_STATIC,21,18,17,8
     LTEXT           "面積" ,IDC_STATIC,22,39,17,8
END

看樣子是對話框內容的定義,如對話框大小、各個控件的信息(位置、名稱……)、標題、字號等。

由開發環境生成的resource.h文件,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//{{NO_DEPENDENCIES}}
// Microsoft Developer Studio generated include file.
// Used by resource.rc
//
#define IDD_MAIN                        101
#define IDR_DEFAULT1                    103
#define IDC_OK                          1000
#define IDC_EDITR                       1004
#define IDC_EDITS                       1005
 
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE        104
#define _APS_NEXT_COMMAND_VALUE         40001
#define _APS_NEXT_CONTROL_VALUE         1006
#define _APS_NEXT_SYMED_VALUE           101
#endif
#endif

按照MSDN上的說法,上面的整數是“an integer value that specifies the resource identifier of the dialog box template”,而如IDD_OK等是各個控件的ID,IDD_MAIN是對話框的ID。下面的_APS的還不清楚是什么。 

所以,resource.h中定義了對話框各個控件的唯一標記號,resource.rc定義了各控件的信息,至於文件中的其他內容應該也類似。

 

遺留的問題

源代碼的解釋,以及函數調用關系、執行過程等       

 

參考

  1. 如鵬網C語言也能干大事http://rupeng.com/forum/forum-52-1.html

  2. Win32編程入門 http://www.cnblogs.com/whyandinside/archive/2010/08/28/1811584.html

  3. Win32開發http://www.cnblogs.com/whyandinside/archive/2009/09/05/1561082.html




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM