andy7200
一般會員
發表:6 回覆:6 積分:2 註冊:2004-09-27
發送簡訊給我
|
我的程式是一個show Chart 的程式. 如果我要把目前在螢幕上的程式畫面存成圖片檔,該怎麼做? 我希望是按一下鍵盤的F1就可以把圖片存進c:\\picture 內.我參考anpino大大的程式如下,但不知道如何著手,第一,這個寫法須要元件盤的那些物件或是怎麼設定Properties和Events? 第二,要如何將我的需求加入這個程式內? 謝謝! anpino's code: void CaptureScreen(const TSavePictureDialog *SavPicDlg, const TImage *IMGdes, const TImage *IMGsur)
{
String lc_strNewFilePath,lc_strFileType;
TJPEGImage *lc_jpgJpegBuf = NULL; // 擷取畫面
IMGdes->Canvas->CopyRect(IMGdes->BoundsRect,From1->Canvas,IMGsur->BoundsRect); // 存檔
SavPicDlg->InitialDir = GetCurrentDir();
if(SavPicDlg->Execute())
{ lc_strFileType = ExtractFileExt(Form1->SavPicDlg->FileName);
lc_strNewFilePath = SavPicDlg->FileName; if(lc_strFileType == "")
{ lc_strNewFilePath = Form1->SavPicDlg->FileName + ".bmp";
lc_strFileType = ".bmp"; } if(lc_strFileType == ".jpg" || lc_strFileType == ".jpeg" || lc_strFileType == ".JPG" || lc_strFileType == ".JPEG")
{ lc_jpgJpegBuf = new TJPEGImage () ;
lc_jpgJpegBuf->Assign(IMGdes->Picture->Bitmap);
lc_jpgJpegBuf->CompressionQuality=90;
lc_jpgJpegBuf->SaveToFile(lc_strNewFilePath);
delete lc_jpgJpegBuf ;
lc_jpgJpegBuf = NULL; }
else if(lc_strFileType == ".bmp" || lc_strFileType == ".BMP")
{
IMGdes->Picture->Bitmap->SaveToFile(lc_strNewFilePath); }
else
{ Application->MessageBox("This file type is not allow.", "Load File", MB_OK);
} }
}
|
Zard
尊榮會員
發表:24 回覆:396 積分:539 註冊:2003-11-26
發送簡訊給我
|
給你一個範例
//--------------------------------------------------------------------------- #include
#include
#pragma hdrstop #include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int iScreenWidth, iScreenHeight; //---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
Image1->Visible = FALSE;
// 取得螢幕大小
iScreenWidth = GetSystemMetrics(SM_CXSCREEN);
iScreenHeight = GetSystemMetrics(SM_CYSCREEN);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Image1->Width = iScreenWidth;
Image1->Height = iScreenHeight;
// 把螢幕影像畫在Image1上
BitBlt(Image1->Canvas->Handle, 0, 0, iScreenWidth, iScreenHeight, GetDC(0), 0, 0, SRCCOPY); // 利用 TJPEGImage 轉為 JPEG檔
TJPEGImage* jpeg = new TJPEGImage;
jpeg->Assign(Image1->Picture->Bitmap);
jpeg->SaveToFile("c:\\1.jpg");
}
//---------------------------------------------------------------------------
|
andy7200
一般會員
發表:6 回覆:6 積分:2 註冊:2004-09-27
發送簡訊給我
|
請問 Zard 大大:
Image1 和 BitBlt 是從那裡來的? 不好意思喔,小弟是初學者...
|
Zard
尊榮會員
發表:24 回覆:396 積分:539 註冊:2003-11-26
發送簡訊給我
|
引言:
請問 Zard 大大:
Image1 和 BitBlt 是從那裡來的? 不好意思喔,小弟是初學者...
Image1是TImage元件(在元件的Additional那頁), 要Run我給你範例, 請在你的Form上放上個TImage元件, 並命名為Image1. 而BitBlt是Windows API(宣告在WinGDI.h裡), 函式詳細內容查一下MSND就有了
|
andy7200
一般會員
發表:6 回覆:6 積分:2 註冊:2004-09-27
發送簡訊給我
|
感謝感謝!
我照作然後compile的結果出現 Unit1.cpp(18): E2451 Undefined symbol 'iScreenHeight'
Unit1.cpp(17): E2451 Undefined symbol 'iScreenWidth' 請問這樣是出了什麼問題呢?
|
Londer
一般會員
發表:5 回覆:32 積分:7 註冊:2003-01-08
發送簡訊給我
|
用 F1 當熱鍵似乎不太適合,建議加個輔助鍵(如 Ctrl + F1),給您範例如下:
Unit1.h 檔內容
//---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include
#include
#include
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
void __fastcall FormCreate(TObject *Sender);
void __fastcall FormCloseQuery(TObject *Sender, bool &CanClose);
private: // User declarations
public: // User declarations
void __fastcall OnHotKey(TWMHotKey& HotKeyMsg);
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_HOTKEY,TWMHotKey,OnHotKey)
END_MESSAGE_MAP(TForm)
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif Unit1.cpp 檔內容
//--------------------------------------------------------------------------- #include
#pragma hdrstop #include "Unit1.h"
#include
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
::RegisterHotKey(Handle,VK_F1,MOD_CONTROL,VK_F1);//登錄 Ctrl F1 熱鍵
}
//--------------------------------------------------------------------------- void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose)
{
::UnregisterHotKey(Handle,VK_F1);//取消先前登錄的 Ctrl F1 熱鍵
}
//---------------------------------------------------------------------------
void __fastcall TForm1::OnHotKey(TWMHotKey& HotKeyMsg)
{
if(HotKeyMsg.HotKey==VK_F1) //判斷是否為自己所設之熱鍵 F1
{
Graphics::TBitmap *tmp=new Graphics::TBitmap; // 宣告一點陣圖暫存用
tmp->Width=Screen->Width; // 將圖片設為跟螢幕一樣寬
tmp->Height=Screen->Height; // 將圖片設為跟螢幕一樣高
BitBlt(tmp->Canvas->Handle, 0, 0, Screen->Width, Screen->Height, GetDC(0), 0, 0, SRCCOPY); //抓螢幕 //以下部份可用您上面給的方式帶入,請自行修改^^
TJPEGImage* jpeg = new TJPEGImage; // 宣告一 JPEG 圖存檔用
jpeg->Assign(tmp); // 將所抓取的暫存圖指入
jpeg->CompressionQuality=80; //設定 Jpeg 的壓縮品質
jpeg->SaveToFile("c:\\1.jpg"); // 儲存
delete jpge;//刪除動態宣告之 jpeg
delete tmp;//刪除動態宣告之 tmp
}
}
不用多放任何的元件即可執行,試試看吧 < >< > 發表人 - Londer 於 2004/11/12 09:43:19
|
Londer
一般會員
發表:5 回覆:32 積分:7 註冊:2003-01-08
發送簡訊給我
|
引言:
感謝感謝!
我照作然後compile的結果出現 Unit1.cpp(18): E2451 Undefined symbol 'iScreenHeight'
Unit1.cpp(17): E2451 Undefined symbol 'iScreenWidth' 請問這樣是出了什麼問題呢?
Zard 大大給的範例中的最上面 int iScreenWidth, iScreenHeight; 您肯定漏打了
|