• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            Windows 對(duì)話框
              顧名思義,對(duì)話框是應(yīng)用程序創(chuàng)建的一個(gè)窗口,給出用戶一些信息或者接收用戶的輸入。Delphi 中沒有創(chuàng)建對(duì)話框的 模板(除了通用的對(duì)話框如打開對(duì)話框、字體對(duì)話框、顏色對(duì)話框等)。Delphi 本身使用 TForm 創(chuàng)建對(duì)話框。對(duì)話框可以使得臨時(shí)輸入的窗口創(chuàng)建 更加容易。不用 CreateWindow( ) 創(chuàng)建一個(gè)彈出窗口然后在上面添加控件,你只要制作一個(gè)資源模板,然后調(diào)用 DialogBox 就可以 了。本例中我們創(chuàng)建并使用資源模板,然后調(diào)用 Windows DialogBox( ) 函數(shù)。你可以參考 Win32 API 幫助的 “Dialog Boxes”部分。在程序示例里我使用 DialogBox( ) 創(chuàng)建了一個(gè)模式對(duì)話框。你需要為它準(zhǔn)備好一個(gè)對(duì)話框資源文件 “Dlg1.RES”。 


            對(duì)話框資源的創(chuàng)建
              你需要使用 brcc32.exe 編譯對(duì)話框資源。這在 Delphi 幫助文檔中沒有詳細(xì)說明。下面我們開始創(chuàng)建一個(gè)非常簡(jiǎn)單的對(duì)話框資源 .RC 文件。

            First DIALOG  12, 10, 206, 86
                 STYLE WS_POPUP | WS_DLGFRAME | WS_CAPTION
                 CAPTION " A Dialog Form"
                 FONT 10, "MS Sans Serif"
                 {
                 LTEXT "Simple Dialog"  200, 8, 6, 196, 8
                 PUSHBUTTON "OK"   IDOK, 48, 71,  32, 12
                 }

              這是 C 語言代碼,不是 Pascal 代碼。第一個(gè)“First”是資源名字,就像下面一行的“MyIcon”。

            MyIcon  ICON  Floppy.ico

            對(duì)于 .RC 文件內(nèi)的圖標(biāo),DIALOG 是一種資源,12、10、206、86 是對(duì)話框的標(biāo)準(zhǔn)的上、左、寬、高參數(shù)(單位不是像素,對(duì)話框單位參 見 Win32 API 幫助的“GetDialogBaseUnits”)。上和左與它的父窗體的上和左相關(guān),以父窗體為參考原點(diǎn)。接下里來 是:STYLE WS_POPUP | WS_DLGFRAME | WS_CAPTION ,這些設(shè)置了對(duì)話框窗體的創(chuàng)建風(fēng)格( C 語言中 的 | 和 Pascal 語言中的 or 一樣)。還有一些其他的對(duì)話框風(fēng)格:

            DS_LOCALEDIT -指定編輯框控件在對(duì)話框上 使用程序數(shù)據(jù)模塊的內(nèi)存。默認(rèn)情況下,對(duì)話框上的編輯框控件是使用應(yīng)用程序數(shù)據(jù)模塊之外的內(nèi)存的。如果沒有使用這個(gè)標(biāo)志,那么不要向編輯框發(fā) 送 EM_GETHANDLE 和 EM_SETHANDLE 消息,因?yàn)榭丶]有存儲(chǔ)在程序的數(shù)據(jù)模塊。

            DS_MODALFRAME -創(chuàng)建一個(gè)模式對(duì)話框,對(duì)話框可以通過指定 WS_CAPTION 和 WS_SYSMENU 結(jié)合標(biāo)題欄和系統(tǒng)菜單。

            DS_NOIDLEMSG -禁止 Windows 或其它程序在對(duì)話框顯示時(shí)向它的 owner 窗體發(fā)送 WM_ENTERIDLE 消息。

            DS_SYSMODAL -創(chuàng)建一個(gè)系統(tǒng)的模式對(duì)話框。

            如果你使用了 WS_CAPTION 風(fēng)格,那么“CAPTION " A Dialog Form"”這行將在對(duì)話框標(biāo)題上放上這個(gè)字符 串,“FONT 10, "MS Sans Serif"”將會(huì)設(shè)置對(duì)話框內(nèi)所有控件字體和尺寸。{ 和 } 對(duì)應(yīng) Pascal 中 的 begin 和 end ,在 { } 之間你可以放置希望出現(xiàn)在對(duì)話框上的控件,PUSHBUTTON 是一個(gè)按鈕,參數(shù)跟 在 PUSHBUTTON 之后,形式如:
            PUSHBUTTON "Text on Control" IDNUMBER, Left, Top, Width, Height 后面的參數(shù)為對(duì)話框單位而不是像素。這里創(chuàng)建的對(duì)話框 206 單位寬、86 單位高、左側(cè)距父窗體 12 單位、頂部距父窗體 10 單位,對(duì)話框 上有靜態(tài)文本框和按鈕兩個(gè)控件。

            其他對(duì)話框控件
              對(duì)話框控件的語法形式為:
            controlName text, IDnumber, Left, Top, Width, Height, style, extended-style

            DEFPUSHBUTTON "Cancel" IDCANCEL, 8, 67,  32, 12
            LTEXT "Static Text Left aligned"  201, 5, 21, 196, 24
            CTEXT "Static Text Centered"     202, 18, 12, 170, 8
            ICON  "Icon" -1, 1,1,0,0
            EDITTEXT 300, 9, 47, 180, 50, ES_MULTILINE, WS_EX_CLIENTEDGE
            CHECKBOX "Check Box", 100, 10, 60, 69, 8
            AUTOCHECKBOX "Auto CheckBox", 101, 140, 60, 61, 8
            RADIOBUTTON "radio", 400, 8, 32, 64, 8
            AUTORADIOBUTTON "needs WS_GROUP", 401, 8, 42, 64, 8, WS_GROUP
            GROUPBOX "GroupBox", -1, 4,22,150,42
               
            你可以通過放置控件類型名字參數(shù)創(chuàng)建大部分 Windows 控件,參見下文的“在對(duì)話框中包含常規(guī)控件”部分。

              使用 DialogBox(hInstance, lpTemplate, hWndParent, lpDialogFunc);
            參 見程序代碼的“procedure DoDialog”,你會(huì)發(fā)現(xiàn)它設(shè)置對(duì)話框使用的一些變量,然后調(diào)用 DialogBox( )。 lpTemplate 為資源名稱的 PChar 類型,父窗體為 hForm1 ,lpDialogFunc 設(shè)置為對(duì)話框函數(shù)的地址(參見幫助中 的 DialogProc 部分)。這個(gè) DialogProc 類似于 WndProc ,用于獲取對(duì)話框消息,參見代碼中 的 DialogProc 。 WM_INITDIALOG 消息被發(fā)送后對(duì)話框就被創(chuàng)建了,因此你可以在這里設(shè)置控件。由于對(duì)話框是從模板創(chuàng)建的,所以 控件的句柄還不知道,這樣可以用 ID 號(hào)碼訪問它們。通過 GetDlgItem(hWnd,IDNUMBER) 獲取控件的句柄,你可以使用大量控件 的 SendMessage 或者狀態(tài)變化(Enable( ) 等)。有幾個(gè)特定的對(duì)話框函數(shù)根據(jù) ID 編號(hào)直接使用 (SendDlgItemMessage、 CheckDlgButton、 SetDlgItemText、 GetDlgItemText)。 在 WM_COMMAND 消息中,LOWORD(wParam) 就是控件的 ID 號(hào)碼。


            有待完善…… 


            對(duì)于本文的對(duì)話框演示程序,使用的“Dlg1.rc”源文件代碼如下:

            Z1 ICON Done2.ICO
            Z2 ICON Flop.ICO

            First DIALOG  12, 10, 206, 86
                 STYLE WS_POPUP | WS_DLGFRAME | WS_CAPTION | WS_SYSMENU
                 CAPTION " A Dialog Form"
                 FONT 10, "MS Sans Serif"
                 {
                 CTEXT "Dialogs are really NON Delphi" 200, 18, 1, 170, 10
                 ICON  "Z1" -1, 1,1,0,0
                 ICON  "Z2" -1, 189,1,0,0
                 CTEXT "Checkbox was Unchecked"     201, 18, 12, 170, 8
                 LTEXT " "  202, 5, 21, 196, 24
                 EDITTEXT      300, 14, 47, 100, 10
                 AUTOCHECKBOX "Show MessageBox", 100, 10, 60, 69, 8
                 AUTOCHECKBOX "Check me", 101, 140, 60, 61, 8
                 DEFPUSHBUTTON "OK"   IDOK, 48, 71,  32, 12, WS_GROUP
                 PUSHBUTTON "set Edit Text"   401, 108, 71,  44, 12,
                 }
             
              使用 brcc32.exe 編譯 Dlg1.rc 文件,我不知道為什么可以不使用“ #include <windows.h>”,但是確實(shí)通過編譯了(生成 Dlg1.RES 文件)。

            對(duì)話框程序
              本程序演示了創(chuàng)建與使用 Windows 對(duì)話框的方法,你需要使用上面代碼編譯得到的 Dlg1.RES 文件。  

            program Dialogs;

            uses
              Windows, Messages, smallUtils;
            {$R *.RES}
            {$R Dlg1.RES}
            var
              wClass: TWndClass;
              hForm1, hExitBut, hDlgBut, hCheckCB, hEdit1,
              hLabel1, Font1, hLabel2, hLabel3: THandle;
              mainMsg: TMSG;
              Rect1: TRect;
              DlgText, DlgEditText: String;
              DlgChk, Dlg2Chk: Boolean;

            function DialogProc(hWnd,Msg,wParam,lParam:Longint):Boolean; stdcall;
            {這里處理對(duì)話框消息。有些消息如 WndProc 消息(WM_COMMAND、WM_CLOSE)列
            在這里,有些消息(WM_INITDIALOG)沒有列出。在對(duì)話框 Proc 經(jīng)常使用
             DlgItem ID 而不是 hWnd }
            var
              OKrect:TRect;
            begin
              Result := False;
              case Msg of
            WM_INITDIALOG: begin
                             {WM_INITDIALOG 是設(shè)置你的 Dlg Items 屬性的地方,有些特定的
                             DlgItem 函數(shù)(SendDlgItemMessage、SetDlgItemText)
                             對(duì)此比較有用。}
                             DlgEditText := '';
                             SendMessage(hWnd, WM_SETICON, 1, LoadIcon(hInstance,'Z1'));
                             {對(duì)話框默認(rèn)使用圖標(biāo),你需要設(shè)置圖標(biāo)}
                             SendDlgItemMessage(hWnd,200,WM_SETFONT,Font1, 0);
                             {SendDlgItemMessage 使用 ID 編號(hào)代替 hWnd}
                             CheckDlgButton(hWnd,100,BST_CHECKED);
                             if SendMessage(hCheckCB,BM_GETCHECK,0,0) = BST_CHECKED then
                             begin
                               {你可以從主窗體獲取信息來設(shè)置對(duì)話框}
                               SetWindowText(GetDlgItem(hWnd,201),'多選按鈕被勾選');
                               {這里可以使用 SetWindowText,但是一樣可以使用 SetDlgItemText。
                               SetDlgItemText(hWnd,201,'檢查框被勾選');}
                               EnableWindow(GetDlgItem(hWnd,101),False);
                               {大部分改變窗口的函數(shù)對(duì)于對(duì)話框一樣有效}
                             end;
                             {SetWindowText(GetDlgItem(hWnd,202),PChar(DlgText));}
                             SetDlgItemText(hWnd,202,PChar(DlgText));
                             SetDlgItemText(hWnd,300,PChar(GetWindowStr(hEdit1)));
                             GetWindowRect(GetDlgItem(hWnd,IDOK),OKrect);
                             SetCursorPos(OKrect.Left+10,OKrect.Top+10);
                           end;
            WM_COMMAND: begin
                          {和 MessageProc 的 WM_COMMAND 消息不一樣,wParam 與 LParam
                          有不同的用途。}
                          if LOWORD(wParam) = IDOK then
                          begin
                            {對(duì)話框在 LOWORD(wParam) 使用 DlgItem ID}
                            if (IsDlgButtonChecked(hWnd,101) = BST_CHECKED)
                            then  Dlg2Chk := True;
                            if (IsDlgButtonChecked(hWnd,100) = BST_CHECKED) then
                            begin
                              MessageBox(hWnd,'對(duì)話框上多選按鈕被勾選',
                                '退出對(duì)話框',MB_OK or MB_ICONQUESTION);
                              DlgChk := True;
                            end;
                            DlgEditText := GetWindowStr(GetDlgItem(hWnd,300));
                            EndDialog(hWnd,1);
                            Result := True;
                          end
                          else if LOWORD(wParam) = 401
                               then SetDlgItemText(hWnd,300, '新的編輯框文本')
                               else if LOWORD(wParam) = 101
                                    then  MessageBox(hWnd,'對(duì)話框上多選按鈕被單擊',
                                              '單擊它',MB_OK or MB_ICONQUESTION);
                        end;
            WM_CLOSE: begin
                        {和 MessageProc 不一樣,你需要使用 EndDialog 退出一個(gè)對(duì)話框}
                        EndDialog(hWnd,1);
                        Result := True;
                      end;
              end;
            end;

            procedure DoDialog;
            var
              Dsize: TdriveSize;
            begin
              if hLabel3 <> 0 then
              begin
                DestroyWindow(hLabel3);
                while PeekMessage(mainMsg, 0, 0, 0, PM_REMOVE)
                do  DispatchMessage(mainMsg);
                hLabel3 := 0;
              end;
              Dsize := DiskSpace('C:\');
              DlgText := 'C 盤總?cè)萘繛?nbsp; '+Int2Str(Dsize.TotalS)+
                       ' 字節(jié) - 可用空間為  '+ Int2Str(Dsize.FreeS);
              {DlgText 被用于對(duì)話框的靜態(tài)標(biāo)簽控件,你應(yīng)該在調(diào)用 DialogBox( ) 前設(shè)置好對(duì)話框
              需要的所有的變量。}
              DialogBox(hInstance, 'First', hForm1, @DialogProc);
              {DialogBox 將根據(jù)資源 DIALOG 的 'First' 創(chuàng)建一個(gè)模式對(duì)話框,它以 hForm1 作為
              父窗體,以 DialogProc 作為 WndProc (MessageProc)}
              {可以從對(duì)話框獲取返回值}
              if DlgChk then
              MessageBox(hForm1,'這里 DlgChk = True',
                  '對(duì)話框返回值',MB_OK or MB_ICONQUESTION);
              if Dlg2Chk then
              begin
                hLabel3 := CreateWindow('Static', '"Check me" 多選按鈕被勾選',
                     WS_VISIBLE or WS_CHILD or SS_CENTER,6,200,370,29,hForm1,0,hInstance,nil);
                SendMessage(hLabel3, WM_SETFONT, Font1,0);
              end;
              SetWindowText(hLabel2,@DlgEditText[1]);
              DlgChk := False;
              Dlg2Chk := False;
            end;

            function MessageProc(hWnd,Msg,wParam,lParam:Integer):Integer; stdcall;
            begin
              case Msg of
                WM_COMMAND: if lParam = abs(hExitBut)
                            then PostMessage(hForm1,WM_CLOSE,0,0)
                            else if (LParam = abs(hDlgBut))
                                 then DoDialog;
                WM_DESTROY: PostQuitMessage(0);
              end; // case 語句結(jié)束
              Result := DefWindowProc(hWnd,Msg,wParam,lParam);
            end;

            begin     // 主程序開始 //
              DlgChk := False;
              Dlg2Chk := False;
              hLabel3 := 0;

              Font1 := CreateFont(-16,0,0,0,FW_BOLD,0,0,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,
               CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,VARIABLE_PITCH or FF_SWISS,'Arial');

              wClass.hInstance := hInstance;
              with wClass do
              begin
                style :=        CS_PARENTDC or CS_BYTEALIGNWINDOW;
                hIcon :=        LoadIcon(hInstance,'MAINICON');
                lpfnWndProc :=  @MessageProc;
                hbrBackground:= COLOR_BTNFACE+1;
                lpszClassName:= 'Form Class';
                hCursor :=      LoadCursor(0,IDC_ARROW);
              end;
              RegisterClass(wClass);

              SetRect(Rect1,0,0,430,300);
              if not AdjustWindowRect(Rect1,WS_CAPTION or WS_MINIMIZEBOX or WS_SYSMENU,False)
              then SetRect(Rect1,0,0,438,328);

              hForm1 := CreateWindow(wClass.lpszClassName, '對(duì)話框演示程序',
                WS_CAPTION or WS_MINIMIZEBOX or WS_SYSMENU or WS_VISIBLE,
                (GetSystemMetrics(SM_CXSCREEN) div 2)-200,
                (GetSystemMetrics(SM_CYSCREEN) div 2)-160,
                Rect1.Right-Rect1.Left, Rect1.Bottom-Rect1.Top,
                0, 0, hInstance, nil);

              hLabel1 := CreateWindow('Static', '對(duì)話框演示',
                     WS_VISIBLE or WS_CHILD or SS_CENTER,8,8,388,22,hForm1,0,hInstance,nil);
              SendMessage(hLabel1,WM_SETFONT,Font1,0);

              hLabel2 := CreateWindow('Static',
                     '在下面輸入你想放置到對(duì)話框的文字'#10'對(duì)話框編輯框如數(shù)的文字將在此顯示',
                     WS_VISIBLE or WS_CHILD or SS_LEFT,10,38,290,28,hForm1,0,hInstance,nil);
              SendMessage(hLabel2,WM_SETFONT,GetStockObject(ANSI_VAR_FONT),0);

              hExitBut := CreateWindow('Button','退 出',
                WS_VISIBLE or WS_CHILD or BS_PUSHBUTTON or BS_TEXT,
                350,270,74,24, hForm1,0, hInstance,nil);

              hEdit1 := CreateWindowEx(WS_EX_CLIENTEDGE,'Edit','這里輸入的文字將顯示在對(duì)話框中',
                WS_VISIBLE or WS_CHILD or ES_LEFT or ES_AUTOHSCROLL,
                16,78,410,21,hForm1,0,hInstance,nil);
              SendMessage(hEdit1,WM_SETFONT,GetStockObject(ANSI_VAR_FONT),0);

              hDlgBut := CreateWindow('Button','顯示對(duì)話框',
                WS_VISIBLE or WS_CHILD or BS_PUSHBUTTON or BS_TEXT,
                30,160,144,24, hForm1,0, hInstance,nil);
              SendMessage(hDlgBut, WM_SETFONT, GetStockObject(ANSI_VAR_FONT),0);

              hCheckCB := CreateWindow('Button','對(duì)話框多選檢測(cè)按鈕',
                WS_CHILD or BS_AUTOCHECKBOX or WS_VISIBLE,
                20,130,190,24, hForm1,0,hInstance,nil);
              SendMessage(hCheckCB, WM_SETFONT, GetStockObject(ANSI_VAR_FONT),0);

              while GetMessage(mainMsg,0,0,0) do
              begin
                TranslateMessage(mainMsg);
                DispatchMessage(mainMsg);
              end;
              DeleteObject(Font1);
              DlgText := '';
              DlgEditText := '';
            end.

             

            在對(duì)話框中包含常規(guī)控件
              為了在對(duì)話框里創(chuàng)建預(yù)定義的控件類,可以使用如下的一般語法,參數(shù)為:

            ClassName text, IDnumber, x, y, width, height , style , extended-style
             X 和 width 是水平方向單位,是對(duì)話框基本寬度單位的 1/4 ,Y 和 height 是豎直方向單位,是對(duì)話框基本高度單位的 1 /8 。當(dāng)前對(duì)話框基本單位是計(jì)算機(jī)從當(dāng)前系統(tǒng)字體的高度和寬度得到的,GetDialogBaseUnits( ) 函數(shù)可以返回對(duì)話框基本單位的對(duì)應(yīng) 像素值。

            ControlName - 預(yù)定義的控件的類名,比如 BUTTON、 COMBOBOX、 EDIT、 LISTBOX、 SCROLLBAR、 STATIC 等。

            text - 指 定控件上顯示的文本。文本位置在控件指定尺寸之內(nèi)或者接近控件。這個(gè)參數(shù)是有雙引號(hào)(")括起來的 0 到多個(gè)字符。字符串自動(dòng)以零結(jié)束并在資源文件返回 結(jié)果中轉(zhuǎn)換成 Unicode 字符。默認(rèn)情況下,雙引號(hào)括起的字符是 ANSI 字符,交換碼順序被認(rèn)為是按位交換碼順序。如果字符串加上 L 前綴, 字符串被認(rèn)為是寬字符組成,交換碼順序被認(rèn)為是兩位交換碼,這就是 Unicode 字符。如果雙引號(hào)本身在文本內(nèi),那么需要連續(xù)使用雙引號(hào)兩次。 And 符號(hào)(&)放在文本中表示后面跟著的字符是控件的助記符(加速字符),當(dāng)控件顯示的時(shí)候,& 不會(huì)出現(xiàn),后面的字符會(huì)自動(dòng)加上下 劃線顯示,用戶可以通過按下下劃線助記符來選擇這個(gè)控件。為了在字符串中使用 & 字符,你需要連續(xù)兩次使用(&&)。

            IDnumber - 指定控件標(biāo)識(shí)。這個(gè)值為 Word 類型,介于 0 到 65,535 之間。

            x - 給出控件在對(duì)話框客戶區(qū)域左邊距,這個(gè)值為 Word 類型,介于 0 到 65,535 之間。這個(gè)坐標(biāo)軸在對(duì)話框的客戶區(qū)域的左邊緣為 0 對(duì)話框單位。

            y - 給出控件在對(duì)話框客戶區(qū)域上邊距,這個(gè)值為 Word 類型,介于 0 到 65,535 之間。這個(gè)坐標(biāo)軸在對(duì)話框的客戶區(qū)域的上邊緣為 0 對(duì)話框單位。

            width - 指 定控件寬度,這個(gè)值為 Word 類型,介于 1 到 65,535 之間。寬度單位為 1/4 字符。 Specifies the width of the control. This value must be a Word value in the range 1 through 65,535. The width is in 1/4-character units. 
            height - 指定控件高度,這個(gè)值為 Word 類型,介于 1 到 65,535 之間。寬度單位為 1/8 字符。 

            style - 指定控件的風(fēng)格。利用邏輯或操作( | )組合多個(gè)風(fēng)格。 

            extended-style - 指定擴(kuò)展風(fēng)格(WS_EX_xxx)。你必須給定一種風(fēng)格以便使用擴(kuò)展風(fēng)格
            Posted on 2008-10-03 21:55 micheal's tech 閱讀(1924) 評(píng)論(0)  編輯 收藏 引用 所屬分類: visual c++
            97热久久免费频精品99| 91麻精品国产91久久久久| 99久久免费国产精品热| 色婷婷久久久SWAG精品| 51久久夜色精品国产| 1000部精品久久久久久久久| 亚洲第一极品精品无码久久| 久久精品国产亚洲AV忘忧草18| 欧美亚洲国产精品久久久久| 久久久久人妻一区精品| 久久av免费天堂小草播放| 99久久精品国产综合一区| 国产99久久九九精品无码| 51久久夜色精品国产| 久久精品无码一区二区三区免费| 久久99精品久久久久久野外| 国产高清国内精品福利99久久| 国产午夜精品久久久久九九电影 | 青青久久精品国产免费看| 久久精品无码一区二区app| 中文国产成人精品久久亚洲精品AⅤ无码精品 | 伊人久久大香线蕉综合影院首页| 久久99精品国产麻豆蜜芽| 久久伊人五月天论坛| 国产成人精品综合久久久久| 漂亮人妻被中出中文字幕久久| 亚洲精品无码久久久久去q| 国产精品一久久香蕉国产线看观看| 久久精品无码专区免费东京热| 97精品伊人久久久大香线蕉| 国产免费久久精品99久久| 亚洲精品乱码久久久久久不卡| 免费久久人人爽人人爽av| 久久久av波多野一区二区| 天天久久狠狠色综合| 国产精品99久久久久久宅男小说| 久久久久亚洲AV成人片| 久久精品国产只有精品66| 日韩精品无码久久久久久| 久久久WWW成人免费精品| 久久久久久亚洲精品成人|