之前學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程序的入口,WinMain是Windows程序的入口。當用戶執行一個程序時,操作系統為程序分配地址空間,並加載程序,調用入口函數執行程序。
/*****
*其他內容,如程序如何運行的細節以及消息的處理機制等,就不列寫在此了(我也沒仔細看@_@),可參看“參考”或檢索其他資料
*****/
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文件指示連接程序如何產生最終的可執行文件。
各個文件里的內容
比如這樣一個計算圓面積的對話框程序,其ID為IDD_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定義了各控件的信息,至於文件中的其他內容應該也類似。
遺留的問題
源代碼的解釋,以及函數調用關系、執行過程等
參考
-
如鵬網C語言也能干大事http://rupeng.com/forum/forum-52-1.html
-
Win32編程入門 http://www.cnblogs.com/whyandinside/archive/2010/08/28/1811584.html
-
Win32開發http://www.cnblogs.com/whyandinside/archive/2009/09/05/1561082.html