利用其他編譯器增強Visual C++的圖形功能

發表于:2007-07-14來源:作者:點擊數: 標簽:
無可否認,Visual C++是非常強大的編程環境。但是,Visual C++也有很多限制,比如在界面的構筑和圖形處理方面遠不如Delphi/BCB那樣方便。不過,我們完全可以利用這些編譯器提供的功能,來彌補Visual C++在這方面的不足。 我在各個編程論壇上經??吹疥P于如何
無可否認,Visual C++是非常強大的編程環境。但是,Visual C++也有很多限制,比如在界面的構筑和圖形處理方面遠不如Delphi/BCB那樣方便。不過,我們完全可以利用這些編譯器提供的功能,來彌補Visual C++在這方面的不足。

我在各個編程論壇上經??吹疥P于如何從.BMP文件中載入圖象和如何將圖象儲存到.BMP文件這樣的話題。其實,從BMP中載入圖象是非常簡單的:一個LoadImage函數調用就能夠解決問題。但是,如何把圖象存入BMP文件呢?我雖然很清楚BMP文件的結構,但是我不會從頭去寫一個這樣的函數或是類,那樣等于“重新發明輪子”。固然我也知道現在有很多這樣的庫可以利用,但作為一個程序員,自己解決問題會更有成就感。這里,我有一個偷懶的辦法:只要寫上十幾行代碼,加上一點額外的步驟,我就可以搞定它,完全不用接觸那些佶屈贅牙的BITMAPxxxxHEADER,不用關心剪貼板和象素格式,不用考慮行程編碼,只要有一個Delphi編譯器就行了。且看我是如何作的:

打開Delphi,生成一個新的Dll工程,在Dll中如下導出SaveBitmapToFile函數:

unit ImageDll;

interface

uses
SysUtils, Classes, Windows, Graphics;

function SaveBitmapToFile(hbm:HBITMAP;szFileName:PChar):Boolean;stdcall;export;

implementation
function SaveBitmapToFile(hbm:HBITMAP;szFileName:PChar):Boolean;
var
  bm : TBitmap;
  strFileName : string;
begin
  result := True;
  try
    bm := TBitmap.Create;
    try
      bm.Handle := hbm;
      strFileName := StrPas(szFileName);
      bm.SaveToFile(strFileName);
    except
      result := False;
    end
  finally
    bm.Free;
  end;
end;


如何?非常簡單吧?只要編譯這個Dll成功,我的工作就完成了。不過,還是在Visual C++里面測試一下實際效果的好。下面是我為一個Dialog Based的Visual C++工程添加的測試代碼:

typedef BOOL (__stdcall *PFNSAVEBITMAPTOFILE)(HBITMAP,LPCSTR);


BOOL CTestDlg::OnInitDialog()
{
m_hLib = LoadLibrary("DelphiImage.dll");
}

void CTestDlg::OnDestroy()
{
if (m_hLib)
FreeLibrary(m_hLib);
}

void CTestDlg::OnButton1()
{
  HBITMAP hbm = (HBITMAP)LoadImage(AfxGetInstanceHandle(),"c:\\windows\\安裝程序.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
  if (hbm)
  {
    PFNSAVEBITMAPTOFILE pfnSaveBitmapToFile = (PFNSAVEBITMAPTOFILE)GetProcAddress(m_hLib,"SaveBitmapToFile");
    if (pfnSaveBitmapToFile)
       (*pfnSaveBitmapToFile)(hbm,"c:\\test.bmp");
    else
       AfxMessageBox("GetProcAddress Failed!");
    DeleteObject(hbm);
  }
}


只要你對VC和Delphi有稍許了解的話,上述的代碼對你來說應該不成問題。如果你愿意的話,還可以向Dll中添加對ICO,WMF,甚至JPG文件的支持!只要你在Delphi的DLL項目中引入JPEG單元就可以了。

原文轉自:http://www.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97