• <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>

            Classes that satisfy certain conditions are allowed, but not required, to end with an Interface suffix.
            link

            Definition:

            A class is a pure interface if it meets the following requirements:

            • It has only public pure virtual ("= 0") methods and static methods (but see below for destructor).
            • It may not have non-static data members.
            • It need not have any constructors defined. If a constructor is provided, it must take no arguments and it must be protected.
            • If it is a subclass, it may only be derived from classes that satisfy these conditions and are tagged with the Interface suffix.

            An interface class can never be directly instantiated because of the pure virtual method(s) it declares. To make sure all implementations of the interface can be destroyed correctly, they must also declare a virtual destructor (in an exception to the first rule, this should not be pure). See Stroustrup, The C++ Programming Language, 3rd edition, section 12.4 for details.

            Pros: Tagging a class with the Interface suffix lets others know that they must not add implemented methods or non static data members. This is particularly important in the case of multiple inheritance. Additionally, the interface concept is already well-understood by Java programmers.

            Cons: The Interface suffix lengthens the class name, which can make it harder to read and understand. Also, the interface property may be considered an implementation detail that shouldn't be exposed to clients.

            Decision: A class may end with Interface only if it meets the above requirements. We do not require the converse, however: classes that meet the above requirements are not required to end with Interface.


            posted @ 2008-10-07 14:39 micheal's tech 閱讀(410) | 評(píng)論 (0)編輯 收藏

            大家知道MOBIL5.0開始,EVC4開發(fā)的工程就無法進(jìn)行DEBUG了,而必須使用VS.NET2005中的VC++來實(shí)現(xiàn)。但是以前我們費(fèi)了很大心力做成的項(xiàng)目,也不能重新來寫。
            今天通過一上午的研究,將轉(zhuǎn)化方法貼出來和大家共勉。
                   這里我們以DIALOG BASED工程為例。首先用EVC4建立一個(gè)DIALOG BASED的POCKET PC 2003工程。此工程名我們暫定為TXDEMO。我們也可以在對(duì)話框放置一個(gè)BUTTON,在單擊事件里,添加 AfxMessageBox(L”Test”); 以便升級(jí)到VS.NET 2005后,測(cè)試資源對(duì)應(yīng)情況。
                   此時(shí),保存TXDEMO工程,并關(guān)閉掉EVC4開發(fā)工具。此時(shí)用VS.NET 2005打開TXDEMO.VCW工程,并接受轉(zhuǎn)換請(qǐng)求。此時(shí)并將編譯環(huán)境切換到Windows Mobile 5.0 pocket pc sdk。編譯工程,此時(shí)會(huì)提示如下錯(cuò)誤:
             
            1>C:\Program Files\Microsoft Visual Studio 8\VC\ce\atlmfc\include\afxver_.h(77) : fatal error C1189: #error : Please use the /MD switch for _AFXDLL builds
             
            這里我們通過打開Project properties對(duì)話框里,切換到C/C++->Code generation頁,將Runtime Libarary 設(shè)置成“Multi-threaded DLL(/MD)”。即可解決此問題。
             
            接著編譯工程,此時(shí)會(huì)提示如下錯(cuò)誤:
            1>.\TXDEMO.rc(170) : fatal error RC1015: cannot open include file 'wceres.rc'.
             
            這里我們需要在TXDEMO.RC文件里,將#include "wceres.rc"注釋掉。
            //#include "wceres.rc"     // WCE-specific components
             
            接著編譯工程,此時(shí)會(huì)提示如下錯(cuò)誤:
            1>corelibc.lib(wwinmain.obj) : error LNK2019: unresolved external symbol wWinMain referenced in function wWinMainCRTStartup
            1>Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\Debug/TXDEMO.exe : fatal error LNK1120: 1 unresolved externals
            此時(shí),我們依舊打開project properties對(duì)話框,切換到Linker->Advanced頁,將Entry Point由wWinMainCRTStartup改成WinMainCRTStartup。
             
            此時(shí)再次編譯,系統(tǒng)不在提示錯(cuò)誤,但是編譯好的程序,還不能在模擬器或者M(jìn)OBILE5.0 POCKET PC的機(jī)器上運(yùn)行。
             
            我們接著設(shè)置項(xiàng)目屬性,在Configuration Properties->Gengeral頁將Use of MFC ,改成靜態(tài)連接。
             
            此時(shí)我們運(yùn)行程序 ,您會(huì)發(fā)現(xiàn)程序啟動(dòng)后,就立刻退去。經(jīng)過我的研究,發(fā)現(xiàn)是加載對(duì)話框資源失敗,在此我們?cè)俅舜蜷_TXDEMO.RC源文件,
            找到IDD_TXDEMO_DIALOG DIALOG DISCARDABLE 0, 0, 130, 90語句,將下面的窗體屬性改成如下,即可。
            WS_POPUP | WS_VISIBLE | WS_CAPTION
            此時(shí),再次編譯工程,你可以進(jìn)行DEBUG并可以運(yùn)行程序。
            這是我對(duì)EVC4升級(jí)到VS.NET 2005一點(diǎn)總結(jié),其中參考了MSDN中一些文檔,但是MSDN說的還不夠詳細(xì),通過我自己的研究,總結(jié)出一點(diǎn)經(jīng)驗(yàn),希望能給大家?guī)矸奖悖x謝。
             eric.wong
             msn:wbcpcpwb@hotmail.com
            我遇到的問題與上述問題幾乎相似,但是對(duì)話框出了問題

            I have an app I ported from eVC 3.0 to VS2005, and when I run it, I get
            the following error in the debug window:

            ERROR: dialog template has DS_MODALFRAME set, which is not supported
            for Pocket PC and Smartphone

            And then I get a data abort and an unhandled exception error, and
            everything just goes straight to hell.

            According to Microsoft this is a feature removed in MFC 8.0. If that's
            true, how do I get a floating modal dialog style application using MFC
            8 without this style? Every style I try seems to want to come up
            full-screen now.

            Thanks,
            PaulH

            我試著用別的對(duì)話框來實(shí)現(xiàn),
            http://m.shnenglu.com/michaelgao/archive/2008/10/03/63200.html





            posted @ 2008-10-03 21:59 micheal's tech 閱讀(1968) | 評(píng)論 (0)編輯 收藏

            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 @ 2008-10-03 21:55 micheal's tech 閱讀(1930) | 評(píng)論 (0)編輯 收藏

                 摘要: 【精華】網(wǎng)絡(luò)socket編程指南 http://www.chinaunix.net 作者:流浪者  發(fā)表于:2008-04-20 15:21:55 ...  閱讀全文

            posted @ 2008-10-03 16:19 micheal's tech 閱讀(119) | 評(píng)論 (0)編輯 收藏

            http://www.microsoft.com/china/msdn/developercenter/mobility/blog/WTLstart.mspx

            posted @ 2008-09-16 13:22 micheal's tech 閱讀(253) | 評(píng)論 (0)編輯 收藏

            將關(guān)鍵字轉(zhuǎn)化為表地址的函數(shù)稱為散列函數(shù)。理想的散列函數(shù)易于轉(zhuǎn)換并且是隨機(jī)的,這里的隨機(jī)是指對(duì)每一個(gè)輸入,相應(yīng)的輸出在某種程度上是等概率的。
            常用的散列函數(shù),適用于整數(shù),模散列函數(shù):k mod(M)
            適用于關(guān)鍵字為字符串的算法:霍納算法。
            散列最主要的優(yōu)越性能在于能夠提供近似于常數(shù)的時(shí)間。

            posted @ 2008-08-18 11:26 micheal's tech 閱讀(391) | 評(píng)論 (0)編輯 收藏

            include: concurrency transaction recovery .
            concurrency  means that multiple users can operate on the database at the same time.
            transaction    permit users to make multiple changes appear at once.
                                ACID: atomicity consistency isolation durability
            recovery       surviving application and system crashes.

            posted @ 2008-08-13 11:14 micheal's tech 閱讀(93) | 評(píng)論 (0)編輯 收藏

            懶懶的不想動(dòng),總要找點(diǎn)什么做吧。

            posted @ 2008-08-05 15:22 micheal's tech 閱讀(78) | 評(píng)論 (0)編輯 收藏

            同步、異步、阻塞和非阻塞的概念【zz】


            同步、異步、阻塞和非阻塞的概念

            在進(jìn)行網(wǎng)絡(luò)編程時(shí),我們常常見到同步、異步、阻塞和非阻塞四種調(diào)用方式。這些方式彼此概念并不好理解。下面是我對(duì)這些術(shù)語的理解。
            同步
            所謂同步,就是在發(fā)出一個(gè)功能調(diào)用時(shí),在沒有得到結(jié)果之前,該調(diào)用就不返回。按照這個(gè)定義,其實(shí)絕大多數(shù)函數(shù)都是同步調(diào)用(例如sin, isdigit等)。但是一般而言,我們?cè)谡f同步、異步的時(shí)候,特指那些需要其他部件協(xié)作或者需要一定時(shí)間完成的任務(wù)。最常見的例子就是 SendMessage。該函數(shù)發(fā)送一個(gè)消息給某個(gè)窗口,在對(duì)方處理完消息之前,這個(gè)函數(shù)不返回。當(dāng)對(duì)方處理完畢以后,該函數(shù)才把消息處理函數(shù)所返回的 LRESULT值返回給調(diào)用者。
            異步
            異步的概念和同步相對(duì)。當(dāng)一個(gè)異步過程調(diào)用發(fā)出后,調(diào)用者不能立刻得到結(jié)果。實(shí)際處理這個(gè)調(diào)用的部件在完成后,通過狀態(tài)、通知和回調(diào)來通知調(diào)用者。以 CAsycSocket類為例(注意,CSocket從CAsyncSocket派生,但是起功能已經(jīng)由異步轉(zhuǎn)化為同步),當(dāng)一個(gè)客戶端通過調(diào)用 Connect函數(shù)發(fā)出一個(gè)連接請(qǐng)求后,調(diào)用者線程立刻可以朝下運(yùn)行。當(dāng)連接真正建立起來以后,socket底層會(huì)發(fā)送一個(gè)消息通知該對(duì)象。這里提到執(zhí)行 部件和調(diào)用者通過三種途徑返回結(jié)果:狀態(tài)、通知和回調(diào)。可以使用哪一種依賴于執(zhí)行部件的實(shí)現(xiàn),除非執(zhí)行部件提供多種選擇,否則不受調(diào)用者控制。如果執(zhí)行部 件用狀態(tài)來通知,那么調(diào)用者就需要每隔一定時(shí)間檢查一次,效率就很低(有些初學(xué)多線程編程的人,總喜歡用一個(gè)循環(huán)去檢查某個(gè)變量的值,這其實(shí)是一種很嚴(yán)重 的錯(cuò)誤)。如果是使用通知的方式,效率則很高,因?yàn)閳?zhí)行部件幾乎不需要做額外的操作。至于回調(diào)函數(shù),其實(shí)和通知沒太多區(qū)別。
            阻塞
            阻塞調(diào)用是指調(diào)用結(jié)果返回之前,當(dāng)前線程會(huì)被掛起。函數(shù)只有在得到結(jié)果之后才會(huì)返回。有人也許會(huì)把阻塞調(diào)用和同步調(diào)用等同起來,實(shí)際上他是不同的。對(duì)于同 步調(diào)用來說,很多時(shí)候當(dāng)前線程還是激活的,只是從邏輯上當(dāng)前函數(shù)沒有返回而已。例如,我們?cè)贑Socket中調(diào)用Receive函數(shù),如果緩沖區(qū)中沒有數(shù) 據(jù),這個(gè)函數(shù)就會(huì)一直等待,直到有數(shù)據(jù)才返回。而此時(shí),當(dāng)前線程還會(huì)繼續(xù)處理各種各樣的消息。如果主窗口和調(diào)用函數(shù)在同一個(gè)線程中,除非你在特殊的界面操 作函數(shù)中調(diào)用,其實(shí)主界面還是應(yīng)該可以刷新。socket接收數(shù)據(jù)的另外一個(gè)函數(shù)recv則是一個(gè)阻塞調(diào)用的例子。當(dāng)socket工作在阻塞模式的時(shí)候, 如果沒有數(shù)據(jù)的情況下調(diào)用該函數(shù),則當(dāng)前線程就會(huì)被掛起,直到有數(shù)據(jù)為止。
            非阻塞
            非阻塞和阻塞的概念相對(duì)應(yīng),指在不能立刻得到結(jié)果之前,該函數(shù)不會(huì)阻塞當(dāng)前線程,而會(huì)立刻返回。
            對(duì)象的阻塞模式和阻塞函數(shù)調(diào)用
            對(duì)象是否處于阻塞模式和函數(shù)是不是阻塞調(diào)用有很強(qiáng)的相關(guān)性,但是并不是一一對(duì)應(yīng)的。阻塞對(duì)象上可以有非阻塞的調(diào)用方式,我們可以通過一定的API去輪詢狀 態(tài),在適當(dāng)?shù)臅r(shí)候調(diào)用阻塞函數(shù),就可以避免阻塞。而對(duì)于非阻塞對(duì)象,調(diào)用特殊的函數(shù)也可以進(jìn)入阻塞調(diào)用。函數(shù)select就是這樣的一個(gè)例子。

            阻塞通信

            --------------------------------------------------------------------------------

            通過重疊通信和計(jì)算在許多系統(tǒng)能提高性能。由一個(gè)智能通信控制器自動(dòng)地執(zhí)行通信的系統(tǒng)是真實(shí)的。輕-重線索是取得這種重疊的一種機(jī)制。導(dǎo)致好性能的 一個(gè)可選的機(jī)制是使用非阻塞通信。一個(gè)阻塞發(fā)送開始調(diào)用初始化這個(gè)發(fā)送操作,但不完成它。在這個(gè)消息被從這個(gè)發(fā)送緩存拷出以前,這個(gè)發(fā)送開始調(diào)用將返回。 需要一個(gè)獨(dú)立的“發(fā)送完成”調(diào)用完成這個(gè)通信,例如,檢驗(yàn)從發(fā)送緩存拷出的數(shù)據(jù)。用適當(dāng)?shù)挠布诎l(fā)送被初始化后和它完成以前,來自發(fā)送者存儲(chǔ)的數(shù)據(jù)轉(zhuǎn)換 可以和在發(fā)送者完成的計(jì)算同時(shí)進(jìn)行。類似地,一個(gè)非阻塞“接收開始調(diào)用”初始化這個(gè)接收操作, 但不完成它。在一個(gè)消息被存入這個(gè)接收緩存以前,這個(gè)調(diào)用將返回。須要一個(gè)獨(dú)立的“接收完成”調(diào)用完成這個(gè)接收操作,并檢驗(yàn)被接收到這個(gè)接收緩存的數(shù)據(jù)。 用適當(dāng)?shù)挠布诮邮詹僮鞒跏蓟蠛退瓿梢郧埃浇邮照叽鎯?chǔ)的數(shù)據(jù)轉(zhuǎn)換可以和計(jì)算同時(shí)進(jìn)行。非阻塞接收的使用雖著信息較早地在接收緩存位置被提供,也可 以避免系統(tǒng)緩存和存儲(chǔ)器到存儲(chǔ)器拷貝。

            非阻塞發(fā)送開始調(diào)用能使用與阻塞發(fā)送一樣的四種模式: 標(biāo)準(zhǔn), 緩存, 同步和準(zhǔn)備好模式。這些具有同樣的意義。無論一個(gè)匹配接收是否已登入,能開始除“準(zhǔn)備好”以外的所有模式的發(fā)送;只要一個(gè)匹配接收已登入,就能開始一個(gè)非 阻塞“準(zhǔn)備好”發(fā)送。在所有情況下,發(fā)送開始調(diào)用是局部的:無論其它進(jìn)程的狀態(tài)如何,它立刻返回。如果這個(gè)調(diào)用使得一些系統(tǒng)資源用完,那么它將失敗并返回 一個(gè)錯(cuò)誤代碼。高質(zhì)量的MPI實(shí)現(xiàn)應(yīng)保證這種情況只在“病態(tài)”時(shí)發(fā)生。即,一個(gè)MPI實(shí)現(xiàn)將能支持大數(shù)量掛起非阻塞操作。  

            當(dāng)數(shù)據(jù)已被從發(fā)送緩存拷出時(shí),這個(gè)發(fā)送完成調(diào)用返回。它可以帶有附加的意義,這取決于發(fā)送模式。  

            如果發(fā)送模式是“同步的”,那么只有一個(gè)匹配接收已開始這個(gè)發(fā)送才能完成。即,一個(gè)接收已被登入,并已和這個(gè)發(fā)送匹配。這時(shí),這個(gè)發(fā)送完成調(diào)用是非 局部的。注意,在接收完成調(diào)用發(fā)生以前,如果一個(gè)同步、非阻塞發(fā)送和一個(gè)非阻塞接收匹配, 它可以完成。(發(fā)送者一“知道”轉(zhuǎn)換將結(jié)束,它就能完成,但在接收者“知道”轉(zhuǎn)換將結(jié)束以前)。  

            如果發(fā)送模式是“緩存”,并沒有掛起接收,那么消息必須被緩存。這時(shí),發(fā)送完成調(diào)用是局部的,而且無論一個(gè)匹配接收的狀態(tài)如何,它必須成功。  

            如果發(fā)送模式是標(biāo)準(zhǔn)的,同時(shí)這個(gè)消息被緩存,那么在一個(gè)匹配接收發(fā)生以前,發(fā)送結(jié)束調(diào)用可以返回。另一方面,發(fā)送完成直到一個(gè)匹配接收發(fā)生才可以完成,并且這個(gè)消息已被拷到接收緩存。  

            非阻塞發(fā)送能被用阻塞接收匹配,反過來也可以。   

            給用戶的建議. 一個(gè)發(fā)送操作的完成, 對(duì)于標(biāo)準(zhǔn)模式可以被延遲, 對(duì)于同部模式必須延遲, 直到一個(gè)匹配接收登入。這兩種情況下非阻塞發(fā)送的使用允許發(fā)送者提前于接收者進(jìn)行,以便在兩進(jìn)程的速度方面,計(jì)算更容忍波動(dòng)。  

            緩存和準(zhǔn)備好模式中的非阻塞發(fā)送有一個(gè)更有限的影響。一可能一個(gè)非阻塞發(fā)送將返回,而一個(gè)阻塞發(fā)送將在數(shù)據(jù)被從發(fā)送者存儲(chǔ)拷出后返回。只要在數(shù)據(jù)拷貝能和計(jì)算同時(shí)的情況下,非阻塞發(fā)送的使用有優(yōu)點(diǎn)。  

            消息發(fā)送模式隱含著由發(fā)送者初始化通信。當(dāng)發(fā)送者初始化通信(數(shù)據(jù)被直接移到接收緩存, 并不要求排隊(duì)一個(gè)掛起發(fā)送請(qǐng)求) 時(shí),如果一個(gè)接收已登入,這個(gè)通信一般將有較低的額外負(fù)擔(dān)。但是,只在匹配發(fā)送已發(fā)生后,一個(gè)接收操作能完成。當(dāng)非阻塞接收等待發(fā)送時(shí),沒有阻塞接收,它 的使用允許得到較低的通信額外負(fù)擔(dān)。(給用戶的建議結(jié)束)。


            posted @ 2008-07-30 14:57 micheal's tech 閱讀(156) | 評(píng)論 (0)編輯 收藏

            socket作為系統(tǒng)內(nèi)部的IPC程序?qū)嵗梢杂脕碜鳛閮?nèi)部進(jìn)程的通信。
            socket 的優(yōu)勢(shì)在于能夠處理多個(gè)client進(jìn)程訪問一個(gè)server進(jìn)程的情況。
            利用消息機(jī)制實(shí)現(xiàn)IPC雖然同其他方法相比有交換的數(shù)據(jù)量小、攜帶的信息少等缺點(diǎn),但由于其實(shí)現(xiàn)方便、應(yīng)用靈活而廣泛應(yīng)用于無須大量、頻繁數(shù)據(jù)交換的內(nèi)部進(jìn)程通訊系統(tǒng)之中.
            共享內(nèi)存對(duì)于數(shù)據(jù)量比較大的IpC通信是比較有用的。下面會(huì)找一個(gè)例子來說明IPC通信。

            posted @ 2008-07-30 12:00 micheal's tech 閱讀(270) | 評(píng)論 (0)編輯 收藏

            僅列出標(biāo)題
            共8頁: 1 2 3 4 5 6 7 8 
            国内精品伊人久久久久影院对白| 午夜视频久久久久一区| 久久e热在这里只有国产中文精品99| 久久精品国产久精国产果冻传媒| 欧美麻豆久久久久久中文| 日本一区精品久久久久影院| 久久久久一区二区三区| 久久Av无码精品人妻系列| 99久久精品国产综合一区| 91久久国产视频| 国产精品99久久久久久宅男| 人人妻久久人人澡人人爽人人精品| 久久无码高潮喷水| 77777亚洲午夜久久多人| 久久精品国产亚洲αv忘忧草| 免费精品久久天干天干| 777午夜精品久久av蜜臀| 亚洲精品乱码久久久久久自慰| …久久精品99久久香蕉国产| 久久精品亚洲精品国产欧美| 久久男人Av资源网站无码软件| 久久综合给久久狠狠97色 | 国产成人精品久久| 国内精品久久久久久中文字幕| 久久精品一区二区影院| 中文成人久久久久影院免费观看| 久久99精品久久久久子伦| 国产欧美一区二区久久| 亚洲欧美伊人久久综合一区二区| 久久国产亚洲高清观看| 久久久久香蕉视频| 久久夜色精品国产网站| 精品无码人妻久久久久久| 亚洲熟妇无码另类久久久| 久久中文字幕一区二区| 97精品依人久久久大香线蕉97| 久久99国产精品久久| 久久久久亚洲AV片无码下载蜜桃| 97久久超碰国产精品旧版| 热久久最新网站获取| 久久青青草原精品国产不卡|