在DLL中產生對話方塊的方法1

來源:互聯網
上載者:User

什麼是Dll?

     Stands for "Dynamic Link Library." A DLL (.dll) file contains a library of functions and other information that can be accessed by a Windows program. When a program is launched, links to the necessary .dll files are created. If a static link is created, the .dll files will be in use as long as the program is active. If a dynamic link is created, the .dll files will only be used when needed. Dynamic links help programs use resources, such as memory and hard drive space, more efficiently.

對話方塊:
      對話方塊可以分為modal和modeless兩種。
 
在Win32 Dll中建立modal對話方塊。
       在一個Win32Dll中建立modal對話方塊非常簡單,我們都知道,Win32函數DialogBox能夠建立一個modal對話方塊,並且modal對話方塊的訊息是獨立於主程式訊息迴圈的,所以可以直接在Dll內部建立對話方塊自己的視窗過程。下面就是一個在Win32 Dll中建立modal對話方塊的樣本:
//name: Modal_Dialog.cpp
#include<windows.h>
#include"resource.h"
BOOL CALLBACK DlgProc(HWND hwnd,UINT Msg,WPARAM wParam,LPARAM lParam)
 {
     switch(Msg)
     {
     case WM_INITDIALOG:
         return TRUE;
 
     case WM_COMMAND:
         switch(wParam)
         {
         case IDOK:
              MessageBox(NULL,"這是一個modal對話方塊的例子","提示",MB_OK);       
              EndDialog(hwnd, 0);
              return TRUE;
         }
         break;
     }
 
     return FALSE;
 }
 
extern"C" __declspec(dllexport) void ShowDialog()
{
     HINSTANCE hinst;
     hinst=LoadLibrary("Modal_Dialog.dll");     //擷取庫所在的執行個體控制代碼
     DialogBox(hinst,MAKEINTRESOURCE(IDD_DIALOG1),NULL,DlgProc);
     FreeLibrary(hinst);
}
//name: Test.cpp
……
     typedef void (*fp)();
     HINSTANCE hDll;
     fp Show;
     hDll = LoadLibrary("Modal_Dialog.dll");
     Show = (fp)GetProcAddress(hDll,"ShowDialog");
     (*Show)();
     FreeLibrary(hDll);
……
在Win32 Dll 中建立modeless對話方塊。
       與modal對話方塊不同,modeless對話方塊的訊息是要經過主程式訊息迴圈的,這樣一來,就必須在調用該Dll的主程式中處理對話方塊的訊息迴圈,這就無法達到利用Dll來完成組件化開發的要求。其實我們可以人為的Modeless對話方塊建立一個視窗類別,我們知道視窗過程是屬於視窗類別的,這樣一來就有了主視窗的訊息迴圈。
//name: Modeless_Dialog.cpp
#include <windows.h>
#include"resource.h"
LRESULT CALLBACK WndProc     (HWND, UINT, WPARAM, LPARAM) ;
BOOL    CALLBACK DlgProc (HWND, UINT, WPARAM, LPARAM) ;
 
extern"C" int __declspec(dllexport) ShowDialog()
{
     static TCHAR szAppName[] = TEXT ("Modeless_Dialog") ;
     HWND         hwnd ;
     MSG          msg ;
     WNDCLASS     wndclass ;
      HINSTANCE hInstance;
      HWND hDialog;
 
    hInstance = LoadLibrary("Modeless_Dialog.dll");
    
 
      wndclass.style         = CS_HREDRAW | CS_VREDRAW;
     wndclass.lpfnWndProc   = WndProc ;
     wndclass.cbClsExtra    = 0 ;
     wndclass.cbWndExtra    = DLGWINDOWEXTRA ;    // Note!
     wndclass.hInstance     = hInstance ;
     wndclass.hIcon         = LoadIcon (hInstance, szAppName) ;
     wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
     wndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;
     wndclass.lpszMenuName = NULL ;
     wndclass.lpszClassName = szAppName ;
     hwnd = CreateWindow (szAppName, TEXT ("Modeless_Dialog"),
                          WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
                          CW_USEDEFAULT, CW_USEDEFAULT,
                          CW_USEDEFAULT, CW_USEDEFAULT,
                          NULL, NULL, hInstance, NULL) ;
    
    // ShowWindow (hwnd, iCmdShow) ;       //並不在這裡顯示主視窗
    // UpdateWindow (hwnd) ; 
hDialog = CreateDialog (hInstance, MAKEINTRESOURCE(IDD_DIALOG1), hwnd, DlgProc) ;
    
     while (GetMessage (&msg, NULL, 0, 0))
     {
          if(hDialog==0||!IsDialogMessage(hDialog,&msg))
          {
          TranslateMessage (&msg) ;
          DispatchMessage (&msg) ;
          }
     }
     return msg.wParam ;
 
}
BOOL CALLBACK DlgProc (HWND hDlg, UINT message,
                           WPARAM wParam, LPARAM lParam)
{
     switch(message)
     {
         case WM_INITDIALOG :
              return true;
         case WM_COMMAND:
              switch(wParam)
              {
              case(IDOK):
                   MessageBox(NULL,"這是一個modeless對話方塊的例子","提示",MB_OK);
                   DestroyWindow(hDlg);
                   PostQuitMessage (0) ;
                   return TRUE;
              }
     }
     return FALSE;
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{   
     switch (message)
     {
     case WM_DESTROY:
          PostQuitMessage (0) ;
          return 0 ;
     }
     return DefWindowProc (hwnd, message, wParam, lParam) ;
}
      CreateDialog用來建立視窗,並且對話方塊模板要指定visible屬性為True,只有這樣才能顯示對話方塊.
       if(hDialog==0||!IsDialogMessage(hDialog,&msg))這一句是起訊息分流作用的,對於屬於對話方塊的訊息一律交給對話方塊過程DlgProc來處理。
        處理對話方塊的退出一定要使用DetroyWindow函數,並且要發送一個退出訊息,使那個沒有顯示的主視窗也能夠退出訊息迴圈,不至於造成記憶體泄露。

本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/hailongchang/archive/2006/12/19/1448782.aspx

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.