全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1538
推到 Plurk!
推到 Facebook!

剪貼簿

尚未結案
jason_cyl329
高階會員


發表:123
回覆:155
積分:105
註冊:2003-05-26

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-07-01 13:25:14 IP:61.218.xxx.xxx 未訂閱
有關剪貼簿的問題,Win2000中,要貼上時,抓取區塊的大小正確, 可是在98/me中抓取區塊的大小卻是錯誤的,是不是我用錯了,或是其他原因,有關Copy /Paste的部分,其中有一列程式在paste內,BlkSize = GlobalSize(PasteHandle); BlkSize的值與當初設定的不同!! 可參考下面的程式碼,下面的格式是我自訂的,你也可以轉成文字的資料試試看,最主要的是GlobalSize這個函數抓回的值與原來GlobalAlloc()┌不一樣 敬請指教!! ///複製 void __fastcall TInst::ToCopyBlock(void) { unsigned int CopyStart,CopyEnd; TClipboard *CopyClip; unsigned char* CopyBlk; long BlkSize; HDC CopyHandle; //先將所要備份的資料大小計算出來 CopyStart = MemoryPostFind(BkMinLine,CodeMem,MemorySize,0,0); CopyEnd = MemoryPostFind(BkMaxLine,CodeMem,MemorySize,BkMinLine,CopyStart); // memcpy(regnum.chnum,CodeMem CopyEnd,2); CopyEnd = CommandCatch(CodeMem,CopyEnd); BlkSize = CopyEnd-CopyStart; //再外部記憶區配置一區域 CopyHandle = GlobalAlloc(GHND,BlkSize); CopyBlk = (unsigned char*)GlobalLock(CopyHandle); memcpy(CopyBlk,CodeMem CopyStart,BlkSize); GlobalUnlock(CopyHandle); CopyClip = new TClipboard; CopyClip->Open(); //將剪貼簿內的資料清空,並會將原來剪貼簿內所存的引數所在的記憶體資料清除 CopyClip->Clear(); //註冊自用的剪貼簿格式 // CF_MYFORMAT = RegisterClipboardFormat("CF_MYFORMAT"); // CopyClip->SetAsHandle(WplMain->CF_INST,(unsigned int)CopyHandle); CopyClip->Close(); delete CopyClip; } //貼上 void __fastcall TInst::ToPasteBlock(void) { TClipboard *PasteClip; // unsigned short CF_MYFORMAT; unsigned char* CopyBlk; HDC PasteHandle; unsigned char* PasteBlk; long BlkSize; PasteClip = new TClipboard; PasteClip->Open(); if (PasteClip->HasFormat(WplMain->CF_INST)) { //得到剪貼簿的引數 PasteHandle = (HDC)PasteClip->GetAsHandle(WplMain->CF_INST); //得到剪貼的資料起始位置 PasteBlk = (unsigned char*)GlobalLock(PasteHandle); //得到剪貼簿內的資料大小 BlkSize = GlobalSize(PasteHandle); if (CurPt BlkSize>MemorySize) { ShowMessage(MsgList->Strings[20]); // return; } else { // DataFillin(CodeMem,CurPt,MemorySize,CodeTail,PasteBlk,BlkSize); if (InsTest(CurPt,MemorySize,CodeTail,BlkSize)) { UndoAdd(); // BlockIns(CodeMem,CurPt,CodeTail,MemorySize,PasteBlk,BlkSize); } } // GlobalUnlock(PasteHandle); } PasteClip->Close(); delete PasteClip; }
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-07-01 14:07:23 IP:61.231.xxx.xxx 未訂閱
引言: 有關剪貼簿的問題,Win2000中,要貼上時,抓取區塊的大小正確, 可是在98/me中抓取區塊的大小卻是錯誤的,是不是我用錯了,或是其他原因,有關Copy /Paste的部分,其中有一列程式在paste內,BlkSize = GlobalSize(PasteHandle); BlkSize的值與當初設定的不同!! 可參考下面的程式碼,下面的格式是我自訂的,你也可以轉成文字的資料試試看,最主要的是GlobalSize這個函數抓回的值與原來GlobalAlloc()┌不一樣 敬請指教!!
///複製
void __fastcall TInst::ToCopyBlock(void)
{
 unsigned int CopyStart,CopyEnd;
 TClipboard *CopyClip;
 unsigned char* CopyBlk;
 long BlkSize;
 HDC CopyHandle;     //先將所要備份的資料大小計算出來
 CopyStart = MemoryPostFind(BkMinLine,CodeMem,MemorySize,0,0);     CopyEnd = MemoryPostFind(BkMaxLine,CodeMem,MemorySize,BkMinLine,CopyStart);    // memcpy(regnum.chnum,CodeMem CopyEnd,2);
 CopyEnd  = CommandCatch(CodeMem,CopyEnd);
 BlkSize = CopyEnd-CopyStart;      //再外部記憶區配置一區域
 CopyHandle = GlobalAlloc(GHND,BlkSize);     CopyBlk = (unsigned char*)GlobalLock(CopyHandle);     memcpy(CopyBlk,CodeMem CopyStart,BlkSize);     GlobalUnlock(CopyHandle);     CopyClip = new TClipboard;     CopyClip->Open();
 //將剪貼簿內的資料清空,並會將原來剪貼簿內所存的引數所在的記憶體資料清除
 CopyClip->Clear();
 //註冊自用的剪貼簿格式
// CF_MYFORMAT = RegisterClipboardFormat("CF_MYFORMAT");
 //
 CopyClip->SetAsHandle(WplMain->CF_INST,(unsigned int)CopyHandle);     CopyClip->Close();     delete CopyClip;
}    //貼上
void __fastcall TInst::ToPasteBlock(void)
{
 TClipboard *PasteClip;
// unsigned short CF_MYFORMAT;
 unsigned char* CopyBlk;
 HDC PasteHandle;
 unsigned char* PasteBlk;
 long BlkSize;     PasteClip = new TClipboard;
 PasteClip->Open();     if (PasteClip->HasFormat(WplMain->CF_INST))
 {
    //得到剪貼簿的引數
  PasteHandle = (HDC)PasteClip->GetAsHandle(WplMain->CF_INST);
  //得到剪貼的資料起始位置
  PasteBlk = (unsigned char*)GlobalLock(PasteHandle);
  //得到剪貼簿內的資料大小
  BlkSize = GlobalSize(PasteHandle);
  if (CurPt BlkSize>MemorySize)
  {
   ShowMessage(MsgList->Strings[20]);
//   return;
  }
  else
  {
//   DataFillin(CodeMem,CurPt,MemorySize,CodeTail,PasteBlk,BlkSize);       if (InsTest(CurPt,MemorySize,CodeTail,BlkSize))
   {
    UndoAdd();
    //
    BlockIns(CodeMem,CurPt,CodeTail,MemorySize,PasteBlk,BlkSize);
   }
  }
  //
  GlobalUnlock(PasteHandle);
 }
 PasteClip->Close();
 delete PasteClip;
}
不算是回答您的問題,因為我沒用過 GlobalSize,GlobalAlloc... 我只知道 TClipboard 是不需要 new 的,直接使用內建的 Clipboard 即可,當然還是要
#include 
P.S. 記得用 [code] 原始碼 [/code] 將原始碼包起來,這樣內縮及大於小於的符號才會正常秀出,會比較好看喔。 沒空更新的網頁... http://dllee.ktop.com.tw C及指標教學,計算機概論,資訊管理導論... http://dllee.adsldns.org 介紹Shells,LiteStep,GeoShell.... 發表人 - dllee 於 2003/07/01 14:11:30
------
http://www.ViewMove.com
系統時間:2024-05-06 4:30:01
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!