在一个含有很多静态控件的Dialog中,是各控件先构造还是dialog先?各个控件的构造顺序如何安排?

tbwisess 2004-07-31 04:41:57
是不是dialog先??
各个其他控件呢?
一般Dialog构造函数和initdialog分别做什么?
(initdialog用于初始化控件?)
...全文
138 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
wqfclz 2004-07-31
  • 打赏
  • 举报
回复
OnInitDialog函数用来初始化"需要初始化"的对话框控件,以设定控件的参数,动作,和初始状态.
当然是先构造对话框(包容器),再构造控件对象了.
楼上的繁体文本是从哪本书上拷来的,怎么那么乱?
Kudeet 2004-07-31
  • 打赏
  • 举报
回复
繁体啊,看的头晕哦 我也是啊!


肯定是先有父窗口对话框,才有儿子窗口的。^_^

构造函数就是对这个对象操作,能完成基本的操作,很多时候我们重载ONINITDIALOG函数来做些自己需要的事情
RockHwnd 2004-07-31
  • 打赏
  • 举报
回复
繁体啊,看的头晕哦
tbwisess 2004-07-31
  • 打赏
  • 举报
回复
那么一般Dialog构造函数和initdialog分别做什么?
wenxi2004 2004-07-31
  • 打赏
  • 举报
回复
应当先有父后有子吧
maxcode 2004-07-31
  • 打赏
  • 举报
回复
这是Windows产生对话框的原理:
函式原型:
HWND CreateDialogIndirectParam(HINSTANCE hinst, PCDLGTEMPLATEEX pDlgTemplate,
HWND hwndOwner, DLGPROC pfnDlgProc, LPARAM lParamInit);
第二個參數pDlgTemplate ,必須指向對話盒面板的二進位碼。CreateDialogIndirectParam
會開始剖析這塊記憶體,動作如下:
1. 將任何DS_* 型態轉換為WS_* 型態。例如DS_MODALFRAME 轉換為
WS_EX_DLGMODALFRAME ,DS_CONTEXTHELP 轉換為WS_EX_CON
TEXTHELP ,WS_DLGFRAME 轉換為 WS_EX_WINDOWEDGE 3 。
2. 如果DS_FONT 被指定,CreateFontIndirect 會根據記憶體區塊中的FONTINFOEX
結構內容,產生一種邏輯字型。
3. 對話盒的寬度和高度可經由MapDialogRect 函式轉換成以圖素(pixel )為單位
的值。
4. 呼叫CreateWindowEx 並使用DLGTEMPLATEEX 結構內的欄位來產生父視
窗。就這父視窗而言,其擴充風格、類別名稱、標題文字、視窗風格、x 座標、
y 座標、寬度、高度和選單資訊都已記錄在DLGTEMPLATEEX 結構之中,而
產生對話盒主視窗時,不論 DS_CONTROL 是否被指定,CreateDialogIndirectParam 總是都會內含
視窗擴充風格 WS_EX_CONTROLPARENT 。

CreateWindowEx 的hInstance 參數和hwndParent 參數(是的,父視窗也可以有
擁有者或是父視窗),將使用CreateDialogIndirectParam 所獲得的hinst 和
hwndOwner 參數。
當我們使用Visual C++ 來設計對話盒時,大部份時候我們並不會自己指定視窗類別
名稱。如果沒有指定視窗類別名稱,當CreateDialogIndirectParam 呼叫CreateWindowEx
時,會傳入內建的對話盒視窗類別名稱。對話盒類別是一個 “system global” 視窗類
別,但卻不像其它 “system global” 視窗類別一樣有一個優雅的名稱(如ListBox 或
Edit 等等)。這個類別沒有名稱,只有一個代碼:#32770 ,那也就是此一類別的 atom
值。由於這是一個 “system global” 視窗類別,微軟也為它提供了一個視窗函式,放
在 User32.DLL 之中,其視窗函式名為 DefDlgProc ,下一節我們將詳加討論之。
5. 如果面板的help ID 不為0 ,SetWindowContextHelpId 函式會被呼叫,並傳入父
視窗代碼及help ID :
BOOL SetWindowContextHelpId(HWND hwnd, DWORD dwContextHelpId);
如果使用者在對話盒中要求 Help ,視窗函式會收到一個 WM_HELP 訊息,其lParam
參數指向一個 HELPINFO 結構,結構中的dwContextId 欄位將擁有對話盒的help
ID 。
6. 如果DS_SETFONT 被指定,父視窗會收到一個 WM_SETFONT 訊息。
至此,父視窗已經產生出來並初始化了。CreateDialogIndirectParam 會再根據每一個
DLGITEMTEMPLATEEX 結構,產生一個子視窗:
7. 每一個子視窗的產生,都是靠DLGITEMTEMPLATEEX 結構以及呼叫
CreateWindowEx 函式來完成的。每一個子視窗的擴充風格4 、類別名稱、標題
文字、視窗風格以及ID 資訊都已記錄在記憶體中。x 座標、y 座標、寬度和高
度首先會被轉換為以圖素為單位(原本是所謂的對話盒單位)。至於
CreateDialogIndirectParam 函式當欲產生子視窗時,總是會包含WS_EX_NOPARENTNOTIFY 延伸
視窗型態。

CreateDialogIndirectParam 所獲得的 hinst 值以及才剛被產生的父視窗代碼,將
分別做為CreateWindowEx 的hInstance 和hwndParent 參數。
8. 如果子視窗不能產生,CreateDialogIndirectParam 函式會摧毀父視窗和所有已經
產生出來的子視窗,並傳回NULL 。然而,藉由DS_NOFAILCREATE 的指定,
你可以改變這種預設行為。假如指定了DS_NOFAILCREATE 給父視窗,則
CreateDialogIndirectParam 函式會繼續產生其餘子視窗並傳回其視窗代碼給父
視窗,再傳回給呼叫者。
9. 如果子視窗有一個help ID ,而且不是0 ,那麼SetWindowContextHelpId 會被呼
叫,並傳入子視窗代碼和help ID 。如果使用者在子視窗中要求help 功能,對
話盒視窗函式會收到一個WM_HELP 訊息,其lParam 參數指向一個HELPINFO
結構,結構中的dwContextId 欄位表現出子視窗的help ID 。
10. WM_SETFONT 訊息會被送往子視窗,告訴子視窗應使用何種字型來顯示文
字。
現在,在父視窗及其所有子視窗都已產生之後,CreateDialogIndirectParam 送出一個
WM_INITDIALOG 訊息給父視窗。而此訊息的lParam 參數值就是
CreateDialogIndirectParam 的 lParamInit 參數值。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧