⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 21. 动态链接库.txt

📁 本书介绍了在Microsoft Windows 98、Microsoft Windows NT 4.0和Windows NT 5.0下程序写作的方法
💻 TXT
📖 第 1 页 / 共 5 页
字号:
  BITLIB.C --   Code entry point for BITLIB dynamic-link library
        
                                                         (c) Charles Petzold,  1998
        
------------------------------------------------------------------*/
        
#include <windows.h>
        
int WINAPI DllMain (HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved)
        
{
        
           return TRUE ;
        
}
        
BITLIB.RC (摘录)
        
//Microsoft Developer Studio generated resource script.
        
#include "resource.h"
        
#include "afxres.h"
        
/////////////////////////////////////////////////////////////////////////////
        
// Bitmap
        
1                BITMAP  DISCARDABLE     "bitmap1.bmp"
        
2                 BITMAP  DISCARDABLE     "bitmap2.bmp"
        
3                 BITMAP  DISCARDABLE     "bitmap3.bmp"
        
4                 BITMAP  DISCARDABLE     "bitmap4.bmp"
        
5                 BITMAP  DISCARDABLE     "bitmap5.bmp"
        
6                BITMAP  DISCARDABLE     "bitmap6.bmp"
        
7                 BITMAP  DISCARDABLE     "bitmap7.bmp"
        
8                 BITMAP  DISCARDABLE     "bitmap8.bmp"
        
9                 BITMAP  DISCARDABLE     "bitmap9.bmp"
        
在名为SHOWBIT的工作空间中建立BITLIB项目。在名为SHOWBIT的另一个项目中,建立程序21-6所示的SHOWBIT程序,这与前面的一样。不过,不要使BITLIB依赖于SHOWBIT;否则,连结程序中将需要BITLIB.LIB文件,并且因为BITLIB没有任何输出函数,它也不会建立BITLIB.LIB。事实上,要分别重新编译BITLIB和SHOWBIT,可以交替设定其中一个为「Active Project」然后再重新编译。

SHOWBIT.C从BITLIB读取位图资源,然后在其显示区域显示。按键盘上的任意键可以循环显示。

程序21-6 SHOWBIT 
        
SHOWBIT.C
        
/*--------------------------------------------------------------------------
        
  SHOWBIT.C -- Shows bitmaps in BITLIB dynamic-link library
        
                                                         (c) Charles Petzold, 1998
        
---------------------------------------------------------------------------*/
        
#include <windows.h>
        

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
        

TCHAR szAppName [] = TEXT ("ShowBit") ;
        

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
        
                                                                PSTR szCmdLine, int iCmdShow)
        
{
        
           HWND                          hwnd ;
        
          MSG                           msg ;
        
           WNDCLASS              wndclass ;
        

           wndclass.style                               = CS_HREDRAW | CS_VREDRAW ;
        
           wndclass.lpfnWndProc                         = WndProc ;
        
           wndclass.cbClsExtra                          = 0 ;
        
          wndclass.cbWndExtra                          = 0 ;
        
           wndclass.hInstance                     = hInstance ;
        
           wndclass.hIcon                               = LoadIcon (NULL, IDI_APPLICATION) ;
        
           wndclass.hCursor                             = LoadCursor (NULL, IDC_ARROW) ;
        
           wndclass.hbrBackground              = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
        
           wndclass.lpszMenuName  = NULL ;
        
          wndclass.lpszClassName               = szAppName ;
        
   
        
           if (!RegisterClass (&wndclass))
        
    {
        
                  MessageBox (  NULL, TEXT ("This program requires Windows NT!"),
        
                                                                       szAppName, MB_ICONERROR) ;
        
                  return 0 ;
        
    }
        

    hwnd = CreateWindow (szAppName,
        
           TEXT ("Show Bitmaps from BITLIB (Press Key)"),
        
                WS_OVERLAPPEDWINDOW,
        
                CW_USEDEFAULT, CW_USEDEFAULT,
        
               CW_USEDEFAULT, CW_USEDEFAULT,
        
                NULL, NULL, hInstance, NULL) ;
        

    if (!hwnd)
        
                          return 0 ;
        
           ShowWindow (hwnd, iCmdShow) ;
        
           UpdateWindow (hwnd) ;
        
   
        
   while (GetMessage (&msg, NULL, 0, 0))
        
           {
        
         TranslateMessage (&msg) ;
        
         DispatchMessage (&msg) ;
        
           }
        
           return msg.wParam ;
        
}
        

void DrawBitmap (HDC hdc, int xStart, int yStart, HBITMAP hBitmap)
        
{  
        
           BITMAP        bm ;
        
           HDC                   hMemDC ;
        
           POINT                 pt ;
        

           hMemDC = CreateCompatibleDC (hdc) ;
        
           SelectObject (hMemDC, hBitmap) ;
        
           GetObject (hBitmap, sizeof (BITMAP), &bm) ;
        
           pt.x = bm.bmWidth ;
        
           pt.y = bm.bmHeight ;
        
   
        
    BitBlt (hdc, xStart, yStart, pt.x, pt.y, hMemDC, 0, 0, SRCCOPY) ;
        
           DeleteDC (hMemDC) ;
        
}
        

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
        
{
        
           static HINSTANCE              hLibrary ;
        
           static int                                   iCurrent = 1 ;
        
           HBITMAP                                              hBitmap ;
        
           HDC                                                         hdc ;
        
           PAINTSTRUCT                                  ps ;
        

           switch (message)
        
           {     
        
           case   WM_CREATE:
        
                          if ((hLibrary = LoadLibrary (TEXT ("BITLIB.DLL"))) == NULL)
        
                          {
        
          MessageBox (    hwnd, TEXT ("Can't load BITLIB.DLL."),
        
                      szAppName, 0) ;
        
          return -1 ;
        
                          }
        
                  return 0 ;
        
        
        
           case   WM_CHAR:
        
                          if (hLibrary)
        
                          {
        
                                         iCurrent ++ ;
        
                                         InvalidateRect (hwnd, NULL, TRUE) ;
        
                          }
        
                          return 0 ;
        
           case   WM_PAINT:
        
                          hdc = BeginPaint (hwnd, &ps) ;
        
        
        
                          if (hLibrary)
        
                          {
        
                          hBitmap = LoadBitmap (hLibrary, MAKEINTRESOURCE (iCurrent)) ;
        

                                         if (!hBitmap)
        
                                         {
        
                                                 iCurrent = 1 ;
        
                                                 hBitmap = LoadBitmap (hLibrary,
        
                                       MAKEINTRESOURCE (iCurrent)) ;
        
                                         }
        
                                         if (hBitmap)
        
                                                {
        
                                                        DrawBitmap (hdc, 0, 0, hBitmap) ;
        
                                                 DeleteObject (hBitmap) ;
        
              }
        
                          }
        
                          EndPaint (hwnd, &ps) ;
        
                          return 0 ;
        
        
        
          case   WM_DESTROY:
        
                         if (hLibrary)
        
                                                 FreeLibrary (hLibrary) ;
        

                          PostQuitMessage (0) ;
        
                          return 0 ;
        
           }
        
           return DefWindowProc (hwnd, message, wParam, lParam) ;
        
}
        
在处理WM_CREATE消息处理期间,SHOWBIT获得了BITLIB.DLL的句柄:

if ((hLibrary = LoadLibrary (TEXT ("BITLIB.DLL"))) == NULL)
        
如果BITLIB.DLL与SHOWBIT.EXE不在同一个目录,Windows将按本章前面讨论的方法搜索。如果LoadLibrary传回NULL,SHOWBIT显示一个消息框来报告错误,并从WM_CREATE消息传回-1。这将导致WinMain中的CreateWindow呼叫传回NULL,而且程序终止程序。

SHOWBIT透过链接库句柄和位图号码来呼叫LoadBitmap,从而得到一个位图句柄:

hBitmap = LoadBitmap (hLibrary, MAKEINTRESOURCE (iCurrent)) ;
        
如果号码iCurrent对应的位图无效或者没有足够的内存加载位图,则传回一个错误。

在处理WM_DESTROY消息时,SHOWBIT释放链接库:

FreeLibrary (hLibrary) ;
        
当SHOWBIT的最后一个执行实体终止时,BITLIB.DLL的引用计数变为0,并且释放所占用的内存。这就是实作「图片剪辑」程序的一种简单方法,所谓的「图片剪辑」程序就是能够将预先建立的位图(或者metafile、增强型metafile)加载到剪贴簿,以供其它程序使用的程序。

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -